http://datoolset.net/mw/api.php?action=feedcontributions&user=Eshme&feedformat=atomDragon Age Toolset Wiki - User contributions [en]2024-03-29T04:43:56ZUser contributionsMediaWiki 1.25.6http://datoolset.net/mw/index.php?title=ERF&diff=15862ERF2011-02-24T18:16:43Z<p>Eshme: /* Table of Contents */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>List of Filenames</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the List of Filenames</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== List of Filenames ===<br />
This is a list of Filenames encapsulated in this ERF. Not always this list is present?! Beginning after the Header:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with varying length, representing the Filenames contained in this ERF.</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
This is a list of 28 Bytes with the following:<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes unknown (is FF FF FF FF when List of Filenames doesnt exist)</TD></TR><br />
<TR><TD>12 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (compressed?)</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (uncompressed?)</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
After the TOC comes the plain files data.<br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15861ERF2011-02-24T17:55:25Z<p>Eshme: /* Table of Contents */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>List of Filenames</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the List of Filenames</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== List of Filenames ===<br />
This is a list of Filenames encapsulated in this ERF. Not always this list is present?! Beginning after the Header:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with varying length, representing the Filenames contained in this ERF.</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
This is a list of 28 Bytes with the following:<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes unknown (is FF FF FF FF when List of Filenames doesnt exist)</TD></TR><br />
<TR><TD>12 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (compressed?)</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (uncompressed?)</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15860ERF2011-02-24T17:54:55Z<p>Eshme: /* List of Filenames */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>List of Filenames</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the List of Filenames</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== List of Filenames ===<br />
This is a list of Filenames encapsulated in this ERF. Not always this list is present?! Beginning after the Header:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with varying length, representing the Filenames contained in this ERF.</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
This is a list of the following:<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes unknown (is FF FF FF FF when List of Filenames doesnt exist)</TD></TR><br />
<TR><TD>12 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (compressed?)</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (uncompressed?)</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15859ERF2011-02-24T17:53:28Z<p>Eshme: /* File Format (version 3.0) */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>List of Filenames</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the List of Filenames</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== List of Filenames ===<br />
This is a list of Filenames encapsulated in this ERF. Not always this list is present?! Beginning after the Header:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with the Filenames contained in this ERF.</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
This is a list of the following:<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes unknown (is FF FF FF FF when List of Filenames doesnt exist)</TD></TR><br />
<TR><TD>12 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (compressed?)</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (uncompressed?)</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Talk:Main_Page&diff=15858Talk:Main Page2011-02-24T17:42:46Z<p>Eshme: Removed possible malicious link</p>
<hr />
<div>== Add a new topic by creating a new header like this one ==<br />
<br />
And then write your comment below it. Sign your comment with four tildes, like so: <nowiki>~~~~</nowiki>. It is automatically substituted with your user name and a link to your user page.<br />
<br />
:To respond to someone else's comment, use a colon at the beginning of your response to indent it.<br />
<br />
::Two colons indent twice, and so forth.<br />
<br />
== Can we add a link to the Level Editor tutorial to the list of tutorials on the main page? ==<br />
<br />
I don't know how to do it myself, but it seems like the Level Editor tutorial belongs before the Area tutorial in that list on the main page.<br />
:I think the reason it has been left out of there is that it is a more advanced topic. It is possible to go through those beginner tutorials without creating your own level. It should be in a tutorial list somewhere though. [[User:Stuntpope|Stuntpope]] 01:23, 28 November 2009 (UTC)<br />
<br />
== Tutorials ==<br />
I moved the placeable tutorial to second on the list, because it doesn't work unless you already created a module in the area tutorial.<br />
[[User:Proleric1|Proleric1]] 12:41, 25 October 2009 (UTC)<br />
<br />
== Events ==<br />
The list of events is actually here:<br />
http://social.bioware.com/wiki/datoolset/index.php/Category:Event_types [[User:Proleric1|Proleric1]] 07:59, 15 October 2009 (UTC)<br />
<br />
== NDA ==<br />
I suspect that the NDA no longer applies to the Wiki, since the latter does not touch on the three topics that Chris Priestly asked us not to discuss in his e-mail of 13-Jul-2009.<br />
[[User:Proleric1|Proleric1]] 09:42, 25 July 2009 (UTC)<br />
:Surely no NDA applies now, as the wiki is in the public domain? [[User:Proleric1|Proleric1]] 07:47, 15 October 2009 (UTC)<br />
::Probably not. I'll ask around to make sure, though. [[User:BryanDerksen|BryanDerksen]] 19:44, 15 October 2009 (UTC)<br />
::I've been asked to ask you to hold off on talking about the wiki until next week, to help spread the "buzz" out a bit. Right now everyone's talking about character creator, we don't want to distract from that. The folks who busted their humps on CC need their due. [[User:BryanDerksen|BryanDerksen]] 15:07, 16 October 2009 (UTC)<br />
::Heh. I see Sunjammer just posted about the wiki on the forum, directing people here. Oh well. :) [[User:BryanDerksen|BryanDerksen]] 15:41, 16 October 2009 (UTC)<br />
<br />
== Toolset download location ==<br />
<br />
Someone should probably post a link to the location of the toolset here and/or in the installation page, to go with the instructions. It's a bit slow on the various EA/Bioware servers right now to just search around for them, and there's no direct link on Google for the obvious searches yet.<br />
<br />
Edit: That link would be:<br />
[http://social.bioware.com/toolset.php#downloads]<br />
<br />
According to a post by Scott Meadows,Senior Programmer in the forums, it is still not available for general download, as of 9:48pm PST. No ETA was given.<br />
<br />
--[[User:RyanFenton|RyanFenton]] 20:45, 3 November 2009 (UTC)<br />
<br />
:It is available now.<br />
[[User:Rabidgerbal|Rabidgerbal]] 23:20, 6 November 2009 (UTC)<br />
<br />
::Thanks, slipped my mind in the midst of all the troubleshooting. :) [[User:BryanDerksen|BryanDerksen]] 23:41, 6 November 2009 (UTC)<br />
<br />
:::The download page linked above leads to a page that should be the download page, but clicking on "Downloads" only brings up the "Read Before Downloading" material. There is no actual download link. Any idea where the link is? I am logged into the site when I make the attempt. - [[User:Dragon Dave|Dragon Dave]] 05:58, 4 February 2010 (UTC)<br />
<br />
::::It is there.. well 2 downloads one is .. http://files.bioware.com/dragonage/toolset/DragonAgeToolset1.01Setup.exe<br />
<br />
== Camp ==<br />
<br />
How do I add stuff to the camp area? [[User:Apocalypsefu|Apocalypsefu]] 04:45, 11 November 2009 (UTC)<br />
<br />
: [[How-tos#Insert_content_into_an_existing_area]] has a summary of how you can create an addin that adds new content to existing areas. [[User:BryanDerksen|BryanDerksen]] 01:42, 14 November 2009 (UTC)<br />
<br />
==Ten Minute Tutorials==<br />
I think we should create a category and or easily accessible launch page where people can contribute quick 10 minute tutorials on a variety of subjects [[User:Allan Smith|Allan Smith]] 01:54, 13 November 2009 (UTC)<br />
<br />
==Help for the timid==<br />
We should also put up something on the main page that helps timid editors know that it is okay to make new articles, and possibly give some guidance on naming conventions and how to get their articles included or linked from the main page (or really guidance on where they should be linked from [[User:Allan Smith|Allan Smith]] 01:54, 13 November 2009 (UTC)<br />
<br />
:I'll come up with a page tomorrow, I should have some spare time then. :) [[User:BryanDerksen|BryanDerksen]] 01:43, 14 November 2009 (UTC)<br />
<br />
==Added an Item Reskinning Tutorial==<br />
See [[Tutorial: Reskinning an Item]]. Perhaps someone could add it to the list of tutorials on the main page, if appropriate?<br />
[[User:Avantoreon|Avantoreon]] 00:38, 17 November 2009 (UTC)<br />
<br />
== Google ==<br />
<br />
The Wiki isn't accessible unless you have a Bioware social account; are there exceptions for Googlebot? I understand wanting to protect the contents but being searchable is a great way to be found. --[[User:Talonius|Talonius]] 04:30, 17 November 2009 (UTC)<br />
<br />
== 2DA ID reservation page ==<br />
<br />
Is there any way a page can be added to the wiki so that modders that use it can reserve ranges for their content? I would do it, but I feel that it needs to be accessible from the main page of the wiki so that its existence is well known. [[User:Ladydesire|Ladydesire]] 01:34, 19 November 2009 (UTC)<br />
<br />
: I've just redone the main page to have a lot fewer links on it, which I think will actually help a new user find things more easily. I'm thinking that putting it on [[script]] would be better now, since that's the "portal" page that deals with things where row IDs are likely to come up. I'll put it there for now, anyway. Thoughts? [[User:BryanDerksen|BryanDerksen]] 22:46, 23 November 2009 (UTC)<br />
<br />
:There, I've whipped up a stub page at [[2DA ranges in use]]. Is that the sort of thing you were thinking of? [[User:BryanDerksen|BryanDerksen]] 22:53, 23 November 2009 (UTC)<br />
<br />
:That was exactly what I was talking about Bryan; thanks for doing that. [[User:Ladydesire|Ladydesire]] 20:20, 16 January 2010 (UTC)<br />
<br />
== Adding to main game ==<br />
<br />
Is it possible to add "addin" content to the main game (Single Player)? I would like to add a new town to an existing forest in the main game without going through Other Campaign.<br />
<br />
:Does [[How-tos#Insert_content_into_an_existing_area]] cover what you had in mind? [[User:BryanDerksen|BryanDerksen]] 22:58, 23 November 2009 (UTC)<br />
::Page moved to [[Useful Scripts]]<br />
<br />
== Custom Animations? ==<br />
<br />
Is it possible to create custom animations with the toolset? As in, animate the characters any way you wish for cutscenes, like a werewolf thriller remake for example? I haven't taken a good look in the toolset quite yet, and only a brief look at the wiki, but it looks as though I would be limited to a set group of named pre-made animations. [[User:Interitus3841|Interitus3841]] 13:29, 23 November 2009 (UTC)<br />
<br />
: The toolset doesn't have animation-creation tools in it, though the [[blend tree editor]] is used to combine existing animations. Currently there aren't any tools available that I know of for converting animations created with other tools such as Poser to the [[ANI]] format used by Dragon Age, but I'm sure eventually someone will come up with something. [[User:BryanDerksen|BryanDerksen]] 22:58, 23 November 2009 (UTC)<br />
<br />
<br />
== Create a new single developers page within the wiki to properly list addon's underdevelopment, and the teams developing them? ==<br />
<br />
Title basically sums it up. I feel like Social.Bioware.com itself isn't as organized as it should be, and its quiet hard to sift through. I figure if all us developers get together we could maintain a single page that would list addon's and the team doing them in a table sort of way, linking our social.bioware.com page, and our websites all in one little easy to use area.<br />
:No. The role of wiki is not a to make up for Social's percieved short-comings. If you don't like the way projects work on Social then petition Jesse and his team to fix that issue. The wiki is for documenting the toolset not any and all projects that may or may not ever see the light of day. --[[User:Sunjammer|Sunjammer]] 16:50, 27 November 2009 (UTC)<br />
<br />
<br />
== More Examples ==<br />
I think it would be a good idea, if there where more examples, exspecially for events and the like. Little code would long.--[[User:DeepImpact|DeepImpact]] 10:45, 17 December 2009 (UTC)<br />
<br />
== Script ==<br />
the script link on thye main page should probably link to the Scripts category (http://social.bioware.com/wiki/datoolset/index.php/Category:Scripts) rather than the Script article.<br />
[[User:Rothmer|Rothmer]] 07:57, 6 January 2010 (UTC)<br />
<br />
:The purpose of the pages linked to from the main page is to provide a jumping off point for inexperienced users to find information, and I suspect that dumping a new user into the script category would leave them confused. Perhaps a link to the category in the overview section would be useful, though. [[User:BryanDerksen|BryanDerksen]] 17:35, 18 January 2010 (UTC)</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15857ERF2011-02-24T17:36:57Z<p>Eshme: /* Table of Contents */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the Table of Contents (Variant 1)</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
2 versions of TOCs seem to exist, beginning after the Header (incomplete)<br />
<br />
Variant 1<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with the Filenames contained in this ERF.</TD></TR><br />
<TR><TD>A list of unknown 28 Bytes, for each file contained in this ERF.</TD></TR><br />
</TABLE><br />
Variant 2. Is a list of the following<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes FF FF FF FF</TD></TR><br />
<TR><TD>20 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (compressed?)</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (uncompressed?)</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15856ERF2011-02-24T17:03:10Z<p>Eshme: /* Table of Contents */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the Table of Contents (Variant 1)</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so: <br />
2 versions of TOCs seem to exist, beginning after the Header (incomplete)<br />
<br />
Variant 1<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with the Filenames contained in this ERF.</TD></TR><br />
</TABLE><br />
Variant 2<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes FF FF FF FF</TD></TR><br />
<TR><TD>20 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (compressed?)</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (uncompressed?)</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15855ERF2011-02-24T16:52:51Z<p>Eshme: /* Table of Contents */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the Table of Contents (Variant 1)</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
2 versions of TOCs seem to exist, beginning after the Header: (incomplete)<br />
<br />
Variant 1<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with the Filenames contained in this ERF.</TD></TR><br />
</TABLE><br />
Variant 2<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes FF FF FF FF</TD></TR><br />
<TR><TD>20 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (compressed?)</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF (uncompressed?)</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15854ERF2011-02-24T16:52:04Z<p>Eshme: /* Header */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the Table of Contents (Variant 1)</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
2 versions of TOCs seem to exist, beginning after the Header: (incomplete)<br />
<br />
Variant 1<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with the Filenames contained in this ERF.</TD></TR><br />
</TABLE><br />
Variant 2<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes FF FF FF FF</TD></TR><br />
<TR><TD>20 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15853ERF2011-02-24T16:50:25Z<p>Eshme: /* File Format (version 3.0) */</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V3.0 ")</TD></TR><br />
<TR><TD>32 bit integer representing the lenght of the Table of Contents</TD></TR><br />
<TR><TD>32 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
<TR><TD>32 bit integer unknown</TD></TR><br />
</TABLE><br />
<br />
=== Table of Contents ===<br />
2 versions of TOCs seem to exist, beginning after the Header: (incomplete)<br />
<br />
Variant 1<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>Zero padded Strings with the Filenames contained in this ERF.</TD></TR><br />
</TABLE><br />
Variant 2<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>4Bytes FF FF FF FF</TD></TR><br />
<TR><TD>20 Bytes unknown</TD></TR><br />
<TR><TD>32 bit integer, offset to the beginning of the File</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF</TD></TR><br />
<TR><TD>32 bit integer, lenght of the File encapsulated in this ERF</TD></TR><br />
<TR><TD></TD></TR><br />
</TABLE><br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ERF&diff=15852ERF2011-02-24T16:36:59Z<p>Eshme: Add v3 section</p>
<hr />
<div>[[Image:ERF editor.png|thumb|ERF editor]]<br />
<br />
'''ERF''' ("Encapsulated Resource File") files are container files for game resources. <br />
<br />
== List of common ERF Files ==<br />
<br />
ERF Files for Dragon Age Game Resources are stored in the (Dragon Age Install Dir)\packages\core\ Folder and Subdirectories. ERF's for Addons or Mods are usually in their respective Addon or Mod Folder.<br />
<br />
Common ERF's of certain interests are,<br />
<br />
*Game Resources<br />
**packages\core\data\2da.erf<br />
**packages\core\data\anims.erf<br />
**packages\core\data\consolescripts.erf<br />
**packages\core\data\designerareas.erf<br />
**packages\core\data\designercreatures.erf<br />
**packages\core\data\designercutscenes.erf<br />
**packages\core\data\designerdialogs.erf<br />
**packages\core\data\designeritems.erf<br />
**packages\core\data\designerplaceables.erf<br />
**packages\core\data\designerplots.erf<br />
**packages\core\data\designertriggers.erf<br />
**packages\core\data\face.erf<br />
**packages\core\data\gui.erf<br />
**packages\core\data\guiexport.erf<br />
**packages\core\data\iterationtests.erf<br />
**packages\core\data\lightprobedata.erf<br />
**packages\core\data\materialobjects.erf<br />
**packages\core\data\materials.erf<br />
**packages\core\data\misc.erf<br />
**packages\core\data\modelhierarchies.erf<br />
**packages\core\data\modelmeshdata.erf<br />
**packages\core\data\pathfindingpatches.erf<br />
**packages\core\data\postprocesseffects.erf<br />
**packages\core\data\resmetrics.erf<br />
**packages\core\data\scripts.erf<br />
**packages\core\data\shaders.erf<br />
**packages\core\data\states.erf<br />
**packages\core\data\subqueuefiles.erf<br />
**packages\core\data\textures.erf<br />
**packages\core\data\tints.erf<br />
**packages\core\textures\high\texturepack.erf<br />
**packages\core\textures\medium\texturepack.erf<br />
<br />
*Patch Resources<br />
**packages\core\patch\... --- Contains Resources added by Game Patches<br />
<br />
*Toolset specific Resources<br />
**packages\core\data_tools\... ---Contains Resources for the Toolset<br />
<br />
== Extracting Resources ==<br />
<br />
<!-- As long as no technical explanation is present or needed, I may prefer seeing explanations of usage like this: --><br />
The Toolset is capable of extracting ERF Files Contents.<br />
<br />
If you are modding Resources, the first step would be extracting Resources. You may start of by extracting all Resources of certain interest to you, or just a single File. To Maintain a simple and clean resource place, it is best to use a similar Folder Names to extract in.<br />
<br />
One may create a Folder on the HD named for example "gameresources". Then added with subfolders that suit the Purpose, for example "Materials" in which one extracts only Materials. Preferably the Folderscheme is similar to that of the ERF's, to make browsing simple and easy to remember. <br />
<br />
== Packing Resources ==<br />
<br />
The [[builder to player]] process packages up resources into ERF files for you, storing the generated ERFs inside [[DAZIP]]s.<br />
<br />
Additionally, you can edit any ERF by opening it directly in the Toolset, and add or remove files by drag& dropping them into the Toolset with the ERF open manually. In cases the above process fails or whenever.<br />
<br />
== Overriding Resources ==<br />
<br />
ERF's are named by their general purpose. But not all material files need to necessarily be put into Materials.ERF as an example. Patches do add every Patched Resource into one single ERF for example. The Original Game Resource ERF Files however are best left alone, as it has a high risk of breaking the game.<br />
<br />
Files do not need to be present in ERF Files at all. When Overriding Gameresources as when modding, this is a pretty easy method. Overriding Files are of equal name to their original Gameresource counterpart, and are to be placed into packages\core\override\. The Game will then choose this File over the original.<br />
<br />
== File Format (version 2.0) ==<br />
The format of Dragon Age erfs is not the same as previous versions. There are no string arrays, only a header, a list of files and the files themselves.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>4 characters (8 bytes) for the type of ERF ("ERF ")</TD></TR><br />
<TR><TD>4 characters (8 bytes) for the version ("V2.0 ")</TD></TR><br />
<TR><TD>16 bit integer representing the number of files encapsulated in this ERF</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>32 characters (64 bytes) for the file name with trailing null characters if file name is not 32 characters long</TD></TR><br />
<TR><TD>32bit integer representing the offset from the beginning of the ERF to the beginning of the encapsulated file</TD></TR><br />
<TR><TD>32bit integer representing the length of the encapsulated file</TD></TR><br />
</TABLE><br />
<br />
After the table of contents comes the encapsulated files which are in their own format, specified by the extension of the file name in the table of contents.<br />
<br />
== File Format (version 2.2) ==<br />
In ERF version 2.2 all stored files are encrypted using blowfish. You may not extract such third party ERF files unless you have permission to do so. This is provided only for purposes when you want to encrypt your own ERF files.<br />
<br />
<TABLE cellSpacing=2 cellPadding=2 width="10%" border=1><br />
<TR><TD>Header</TD></TR><br />
<TR><TD>Table of Contents</TD></TR><br />
<TR><TD>Files</TD></TR><br />
</TABLE><br />
<br />
=== Header ===<br />
The header consists of:<br />
<TABLE cellSpacing=2 cellPadding=2 width="35%" border=1><br />
<TR><TD>Size</TD><TD>Description</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding ("ERF ")</TD></TR><br />
<TR><TD>8B</TD><TD>4 UTF-16 characters in LE encoding for the version ("V2.2 ")</TD></TR><br />
<TR><TD>4B</TD><TD>Number of entries in ERF file stored as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Year since 1900 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>Day since January 1 as 32-bit LE integer</TD></TR><br />
<TR><TD>4B</TD><TD>0xFFFFFFFF as 32-bit LE integer</TD></TR><br />
<TR><TD>8B</TD><TD>Some kind of data</TD></TR><br />
<TR><TD>16B</TD><TD>MD5 digest of the password used for encryption/decryption</TD></TR><br />
</TABLE><br />
=== Table of Contents ===<br />
The table of contents is a list whose length is the same as the number of files and whose entries are formatted like so:<br />
<TABLE cellSpacing=2 cellPadding=2 width="53%" border=1><br />
<TR><TD>64B</TD><TD>File name in UTF-16 LE encoding. Is null-terminated only when its (double-byte) length is less than 32.</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing the offset from the beginning of the ERF to the beginning of the blowfish encrypted encapsulated file</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of encrypted data (always multiple of 8)</TD></TR><br />
<TR><TD>4B</TD><TD>32bit LE integer representing size of decrypted data</TD></TR><br />
</TABLE><br />
<br />
'''Files are encrypted as follows:'''<br />
* Generate random number (represented as string, base 10), such as "12345678"<br />
* Generate MD5 digest of the string (without null-terminating character) and store it in the header<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Pad your content to multiple of 8 (e.g. by zeroes)<br />
* Encrypt the data and write to ERF file<br />
<br />
'''To decrypt:'''<br />
* You already know your password ("12345678")<br />
* Generate its MD5 digest and compare it with that in the header<br />
* If they don't match file is either damaged or you forgot your password. If you forgot, brute-force attack should take no more than 1 minute. You '''may not''' perform brute-force attack on ERF files that are not yours unless you have permission from its owner to do so.<br />
* Convert those digits to 64-bit integer (0x0000000000BC614E)<br />
* Store it in byte array in little-endian encoding (0x4e, 0x61, 0xbc, 0, 0, 0, 0, 0)<br />
* Use that array as key to initialize Blowfish ECB algorithm.<br />
* Decrypt your content<br />
<br />
== File Format (version 3.0) ==<br />
<br />
<br />
<br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=MMH&diff=15742MMH2011-02-13T08:37:34Z<p>Eshme: /* mmh.xml schema */</p>
<hr />
<div>'''MMH''' ("Model Mesh Heirarchy") files are used to describe a wide variety of physical objects that appear in Dragon Age levels. It includes props, visual effects, creature models, weapon models, and so forth.<br />
<br />
MMH files are defined by XML files named with the .mmh.xml extension. BioWare generated these XML files using 3DSMax plugins that have some legal encumberances preventing their distribution, but the specifications for .mmh.xml will be released and it is hoped that converters will be able to be written for other file formats. See [[3rd_party_extensions]] for custom model export and import tools.<br />
<br />
The XML file is then run through the GraphicsProcessorMMH.exe program (found in the Dragon Age\Toolset\export_processors directory) to produce a binary file that is used by the game. The game can actually use the XML file directly, but this has poor performance (it runs it through GraphicsProcessorMMH every time the object is loaded) and should only be used for testing purposes.<br />
<br />
:GraphicsProcessorMMH [-outdir <out-dir>] [-platform <x360,pc,ps3>] [options] [-indir<input-directory> / <input-file>]<br />
<br />
Other options include:<br />
<br />
:-byteswapgff{{undocumented}}<!-- ask Graham Wihlidal about these --><br />
<br />
This is the command line you'll typically need:<br />
<br />
:GraphicsProcessorMMH -outdir %ls -platform pc %ls.mmh.xml<br />
<br />
MMH files reference [[MSH]] (mesh) files to define the actual triangles and vertexes used in models.<br />
<br />
== mmh.xml schema ==<br />
<br />
Joint types:<br />
*Cylindrical<br />
*6DOF<br />
*Distance<br />
*Fixed<br />
*PointInPlane<br />
*PointOnLine<br />
*Prismatic<br />
*Pulley<br />
*Revolute<br />
*Spherical<br />
<br />
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format. For a free converter/verifier, see [http://code.google.com/p/jing-trang/].<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><br />
<start><br />
<element name="ModelHierarchy"><br />
<optional><br />
<attribute name="FXActorName"><br />
<data type="NCName"/> <!-- An FXA file name --><br />
</attribute><br />
</optional><br />
<attribute name="ModelDataName"><br />
<data type="NCName"/> <!-- The MSH file name, of where the Mesh Chunks are in by default --><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/> <!-- An MMH file name. This MMH --><br />
</attribute><br />
<optional><br />
<attribute name="PreSimulateTime"><br />
<data type="decimal"/> <!-- emitter presimulation time --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReferencedMeshes"/> <!-- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some have one or more .msh files named with spaces separating them. For example: ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh". Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.--><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialAlpha"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialDecalName"><br />
<data type="NCName"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialFresnelFalloff"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialInvertFresnel"><br />
<data type="integer"/> <!-- if UseRemoteMaterial is true. A true/false value --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialTintColor"/> <!-- if UseRemoteMaterial is true. Four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="UseRemoteMaterial"><br />
<data type="integer"/> <!-- a true/false value --><br />
</attribute><br />
</optional><br />
<choice><br />
<ref name="MeshHierarchy"/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<ref name="Node"/><br />
<ref name="NodeMesh"/><br />
</choice><br />
</element><br />
</start><br />
<define name="NodeMesh"><br />
<element name="NodeMesh"><br />
<optional><br />
<attribute name="BonesUsed"/> <!-- list of integer values, representing the BoneIndices, in an order correlating to the Vertex Blend Indices. Used by models with skeletal Animation. --><br />
</optional><br />
<optional><br />
<attribute name="CastBakedShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CastRuntimeShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CutAway"> <!-- true/false value (Cut Away enables Fading out on Isometric view in Dragon Age) --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ID"><br />
<data type="NCName"/> <!-- A short and unique string. It is unique across every mesh used in whole Dragon Age. Used by lightmapper to reference the mesh --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IsVFXMesh"> <!-- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<optional><br />
<attribute name="MaterialLibrary"> <!-- Strings like "CavesInterior" - reference to MAL files, MAL are material editor file types. (may not actually be useful in the game) --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialObject"> <!-- Strings like "pn_boo_hvyd_l3" here, this is referring to material object (MAO files) create by the material editor --><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshGroupName"> <!-- The Meshes Name, used to reference the meshchunk name in the MSH --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshName"> <!-- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility) --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"> <!-- name of the node --><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="PunchThrough"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveBakedShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveRuntimeShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveShadow"> <!-- I didn't find this referenced in the source code - deprecated, perhaps? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ShadowCasting"> <!-- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Attribute"/><br />
<ref name="BoundingBox"/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> I believe this is the two corners (min and max) of the bounding box. --><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="Scale"><br />
<data type="decimal"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="Node"><br />
<element name="Node"><br />
<optional><br />
<attribute name="BoneIndex"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="SoundMaterialType"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="BoundingBox"/><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodeLightProbe"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeUsePoint"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="NodeCloth"><br />
<attribute name="AttachmentResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="AttachmentTearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BendingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="CF_BENDING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_BENDING_ORTHO"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COLLISION_TWOWAY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COMDAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DISABLE_COLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_GRAVITY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_HARDWARE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_PRESSURE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_SELFCOLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_STATIC"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_TEARABLE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_VISUALIZATION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CollisionResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="DampingCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Density"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="Friction"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<attribute name="GustingDirectionAxisRatio"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="GustingDirectionChange"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ID"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MeshGroupName"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Pressure"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SleepLinearVelocity"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SolverIterations"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="SpeedTreeWindDirection"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindParams"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindUpdateTime"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="StretchingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="TearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Thickness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WakeUpCounter"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindDirection"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="WindEnabled"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="WindResponse"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindResponseLimit"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindSpace"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="WindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Attribute"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<element name="ClothAttachments"><br />
<element name="ClothAttachment"><br />
<attribute name="TearableAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="TwoWayAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</element><br />
<element name="MeshGroup"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<oneOrMore><br />
<ref name="Data"/><br />
</oneOrMore><br />
</element><br />
</element><br />
<element name="NodeSnaptoPoint"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeAmbientLight"/><br />
</optional><br />
</element><br />
</define><br />
<define name="MeshHierarchy"> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<element name="MeshHierarchy"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<ref name="BoundingBox"/><br />
<oneOrMore><br />
<choice><br />
<ref name="MeshHierarchy"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</optional><br />
<choice><br />
<ref name="NodeLightProbe"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="NodeCrustHierarchy"><br />
<element name="NodeCrustHierarchy"><br />
<attribute name="HookID"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<optional><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Node"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodePointLight"/><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeMesh"/><br />
</optional><br />
</element><br />
</define><br />
<define name="Export"><br />
<element name="Export"><br />
<attribute name="ControllerType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ExportName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<attribute name="TagName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</define><br />
<define name="BoundingBox"><br />
<element name="BoundingBox"> <!-- Vector4f min, Vector4f max --><br />
<text/><br />
</element><br />
</define><br />
<define name="Translation"><br />
<element name="Translation"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="Rotation"><br />
<element name="Rotation"> <!-- Quaternionf --><br />
<text/><br />
</element><br />
</define><br />
<define name="CollisionObject"><br />
<element name="CollisionObject"><br />
<optional><br />
<attribute name="Kinematic"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Static"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<element name="Shape"><br />
<attribute name="AllowEmitterSpawn"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="DimX"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimY"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimZ"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_CREATURES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_ITEMS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_PLACEABLES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TERRAIN_WALL"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TRIGGERS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_WALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Height"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Position"/> <!-- Vector4f --><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Rotation"/> <!-- Quaternionf --><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<element name="VertexData"><br />
<attribute name="length"><br />
<data type="integer"/><br />
</attribute><br />
<text/><br />
</element><br />
<element name="IndexData"> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
<text/><br />
</element><br />
</optional><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodePointLight"><br />
<element name="NodePointLight"><br />
<optional><br />
<attribute name="AffectsDomain"> <!-- A search through the existing files has this as either "1" or "2", no other values. I don't know what these domains represent. --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. --><br />
<optional><br />
<attribute name="IntensityPeriod"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityPeriodDelta"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityVariation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="IsStatic"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"> <!-- true/false, I believe --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodeWeapontrail"><br />
<element name="NodeWeapontrail"><br />
<attribute name="Duration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="MaterialObject"> <!-- All appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SegmentLength"><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="Attribute"><br />
<element name="Attribute"><br />
<attribute name="AttributeName"> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SourceName"><br />
<data type="NCName"/> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</attribute><br />
</element><br />
</define><br />
<define name="NodeUsePoint"><br />
<element name="NodeUsePoint"><br />
<attribute name="Name"> <!-- All seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Type"> <!-- "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front and back, a few have all four types of nodeusepoint. --><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<ref name="NodeCrustHierarchy"/><br />
</optional><br />
</element><br />
</define><br />
<define name="NodeAmbientLight"><br />
<element name="NodeAmbientLight"> <!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, and tools_bulb_ambient.mmh.xml. --><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, "0.498039 0.498039 0.498039 1.0" for the two tools --><br />
<attribute name="Name"><!-- "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"> <!-- 5.0 for the three lightrigs, "1e+007" for the two tools --><br />
<data type="double"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="NodeEmitter"><br />
<element name="NodeEmitter"><br />
<attribute name="Acceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- string of four numbers, separated by spaces. --><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleXMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleYMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Birthrate"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BirthrateInParticlesPerMeter"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="BirthrateRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="Bounciness"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="EmitterType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="EnableParticleCollisions"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"/> <!-- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1; if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;--><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="GravityMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InheritVelocityInsteadOfPosition"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="InitialRotation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="InitialRotationRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="InitialRotationSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialRotationSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="InvMovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="KillParticleWhenTargetHit"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="LOD"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Life"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="LifeRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="LinkParticlesTogether"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MeshParticleModel"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<attribute name="MovementSpread"/> <!-- Two floating point values, representing movementspread X and movementspread Y --><br />
<optional><br />
<attribute name="MovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="ObjectSpaceAcceleration"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="OrientationBehaviour"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticleInheritance"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticlesAffectedByWind"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="ParticlesFollowPath"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="PhysicsEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="PhysicsObjectSpawn"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomInitialRotation"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="RotationalAcceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ScaleRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="SpawnDirectionTracksTarget"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnSpread"/> <!-- Two floating point values, representing spawnspread X and spawnspread Y --><br />
<optional><br />
<attribute name="SplatEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetAttraction"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetRadius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UVDistributionSize"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="UpdateOnlyWhenVisible"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UserParamName"/> <!-- ECString, not sure if there's any special formatting here --><br />
</optional><br />
<optional><br />
<attribute name="VertexFormat"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="WorldAxisAcceleration"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="EmitterAttachments"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<element name="EmitterAttachment"><br />
<optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnOnSurface"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="UseNormalForVelocity"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
</element><br />
</element><br />
<element name="SpawnVolume"><br />
<optional><br />
<attribute name="Axis"/><br />
</optional><br />
<attribute name="InvertSpawnVolumeNormals"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="Length"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaxCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MinCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnVolumeType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnWithinVolume"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVolumeNormalsForDirection"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<ref name="Data"/><br />
</zeroOrMore><br />
</element><br />
</choice><br />
</oneOrMore><br />
<optional><br />
<element name="SplatParticle"><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Height"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="HoldLastFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Lifespan"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="NumSamplesH"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="NumSamplesW"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="OrientationRangeRadians"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Width"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<ref name="Export"/><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</define><br />
<define name="Data"><br />
<element name="Data"><br />
<optional><br />
<attribute name="ElementCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Semantic"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="NodeEmitterGroup"><br />
<element name="NodeEmitterGroup"><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeEmitterTarget"><br />
<element name="NodeEmitterTarget"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeLightProbe"><br />
<element name="NodeLightProbe"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<element name="ReflectionMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
<element name="IrradianceMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</optional><br />
</element><br />
</define><br />
<define name="AgeMap"><br />
<element name="AgeMap"><br />
<attribute name="Count"><br />
<data type="integer"/><br />
</attribute><br />
<oneOrMore><br />
<element name="AgeMapElement"><br />
<attribute name="Alpha"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Color"/><br />
<attribute name="PercentLifeElapsed"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="RotationSpeedMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="XScale"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="YScale"><br />
<data type="decimal"/><br />
</attribute><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
</grammar><br />
</pre><br />
<br />
== Example .MMH.XML file ==<br />
<pre><br />
<!-- A note on value types:<br />
List#:type -- means # amount of values of specified type with spaces in between<br />
<br />
string -- a series of characters, digits and underscores, can not start with a colon, no spaces<br />
?string? -- same as above except can start with a colon<br />
int -- an integer (whole number)<br />
decimal -- any number including one with digits appearing after a decimal point, <br />
all decimals MUST have a decimal point even if there are no digits after it (ie 1. not 1, or 0.0)<br />
--><br />
<br />
<ModelHierarchy ModelDataName="string" Name="string"><br />
<!-- Optional Attributes:<br />
FXActorName="string" -- An FXA file name <br />
PreSimulateTime="decimal" -- emitter presimulation time<br />
ReferencedMeshes="List:string" -- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some <br />
have one or more .msh files named with spaces separating them. For example: <br />
ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh"<br />
Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.<br />
RemoteMaterialAlpha="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialDecalName="string" -- if UseRemoteMaterial is true <br />
RemoteMaterialFresnelFalloff="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialInvertFresnel="int" -- if UseRemoteMaterial is true. A true/false value <br />
RemoteMaterialTintColor="List4:decimal"-- if UseRemoteMaterial is true. Four numbers separated by spaces <br />
UseRemoteMaterial="int" -- a true/false value <br />
--><br />
<!-- 1 of (defined below): --><br />
<MeshHierarchy/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<Node/><br />
<NodeMesh/> <br />
</ModelHierarchy><br />
<br />
<NodeMesh><br />
<!-- Optional Attributes:<br />
BonesUsed="List:int" -- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, <br />
helmets, hair, eyes, etc. all have bonesused. <br />
CastBakedShadow="int" -- true/false value <br />
CastRuntimeShadow="int" -- true/false value<br />
CutAway="int" -- true/false value (Cut Away enables Fading out on Isometric view in Dragon Age)<br />
ID="string" -- A short and unique string. It is unique across every mesh used in whole Dragon Age. Used by lightmapper to reference the mesh<br />
IsVFXMesh="int" -- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter<br />
MaterialColor="List4:decimal" -- String with four values - RGBA<br />
MaterialLibrary="string" -- Strings like "CavesInterior" - reference to MAL files, MAL are material editor file types. (may not actually be useful in the game)<br />
MaterialObject="?string?" -- Strings like "pn_boo_hvyd_l3" here, this is referring to material object (MAO files) create by the material editor <br />
MeshGroupName=string"> -- The Meshes Name, used to reference the meshchunk name in the MSH <br />
MeshName="string" -- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility)<br />
Name="string" -- name of the node<br />
PunchThrough="int" -- true/false value<br />
ReceiveBakedShadow="int" -- true/false value <br />
ReceiveRuntimeShadow="int" -- true/false value <br />
<<UNKNOWN>> ReceiveShadow="int" -- I didn't find this referenced in the source code - deprecated, perhaps? <br />
ShadowCasting="int" -- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms?<br />
UseVariationTint="int" -- true/false value<br />
--><br />
<!-- 0 or more of the following items come next, definitions follow later --><br />
<Attribute/><br />
<BoundingBox/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> <br />
I believe this is the two corners (min and max) of the bounding box. --><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeMesh/> <!-- appears to be able to handle a nodemesh within a nodemesh :O --><br />
<NodePointLight/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<Scale>"decimal"</Scale> <br />
<!-- I am assuming next bit means no more than one of the following (could be none): <br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
--><br />
<NodeAmbientLight/><br />
<NodeUsePoint/><br />
<NodeEmitter/><br />
</NodeMesh><br />
<br />
<Node Name="?string?"><br />
<!-- Optional Attributes:<br />
BoneIndex="int" ---- possibly the bone to which this node is attached to, not included if not attached to a bone?<br />
SoundMaterialType="int" ---- are there SoundMaterialType definitions somewhere? if so I guess this is the index of one<br />
--><br />
<!-- can have 0 or more of the following(including duplicates), however I assume having more than one of the same type<br />
would cause the compiler to go wtf? in some cases (like bounding box or translation). Definitions follow later in file<br />
--><br />
<BoundingBox/><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodeLightProbe/><br />
<NodeMesh/><br />
<NodePointLight/><br />
<NodeUsePoint/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<NodeCloth> <!-- has a shit load of attributes with no comments however I assume they all have to do with cloth simulation paramaters --><br />
<!-- NodeCloth Attributes:<br />
AttachmentResponseCoefficient="decimal" <br />
AttachmentTearFactor="decimal" <br />
BendingStiffness="decimal" <br />
CF_BENDING="int"<br />
CF_BENDING_ORTHO="int"<br />
CF_COLLISION_TWOWAY="int"<br />
CF_COMDAMPING="int"<br />
CF_DAMPING="int"<br />
CF_DISABLE_COLLISION="int"<br />
CF_GRAVITY="int"<br />
CF_HARDWARE="int"<br />
CF_PRESSURE="int"<br />
CF_SELFCOLLISION="int"<br />
CF_STATIC="int"<br />
CF_TEARABLE="int"<br />
CF_VISUALIZATION="int"<br />
CollisionResponseCoefficient="decimal"<br />
DampingCoefficient="decimal"<br />
Density="decimal"<br />
Fadeable="boolean"<br />
Friction="decimal"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
ID="string"<br />
MaterialLibrary="string"<br />
MaterialObject="string"<br />
MeshGroupName="string"<br />
Name="string"<br />
Pressure="decimal"<br />
SleepLinearVelocity="decimal"<br />
SolverIterations="int"<br />
StretchingStiffness="decimal"<br />
TearFactor="decimal"<br />
Thickness="decimal"<br />
WakeUpCounter="decimal"<br />
--><br />
<!-- Optional Attributes: GROUP_MASK_STATICGEOMETRY="boolean" --><br />
<Attribute/><br />
<Export/> <!-- can have 0 or more Exports --><br />
<Translation/><br />
<Rotation/><br />
<ClothAttachments><br />
<ClothAttachment TearableAttachment="int" TwoWayAttachment="int" Type="string"><br />
</ClothAttachment><br />
</ClothAttachments><br />
<MeshGroup Name="string"> <!-- contains 1 or more Data elements, defined later in file --><br />
<Data/> <br />
</MeshGroup><br />
</NodeCloth><br />
<NodeSnaptoPoint Name="string"><br />
<!-- can have 0 or more Exports --><br />
<Export/><br />
<!-- can have 0 or more of the following, defined later in file --><br />
<Translation/><br />
<Rotation/><br />
</NodeSnapToPoint><br />
<NodeAmbientLight/> <!-- Optional Element defined later in file--> <br />
</Node><br />
<br />
<!-- <<<WARNING: PROBABLY NOT A GOOD IDEA TO USE THIS ONE!!!>>> --><br />
<!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<!-- IE it is a REALLY old version of NodeMesh --><br />
<MeshHierarchy Name="string"> <br />
<BoundingBox/> <!-- Optional --><br />
<!-- These are Optional and apparently can have more than one if you want, defined lated in file --><br />
<MeshHierarchy/><br />
<Rotation/><br />
<Translation/><br />
<!-- can have either a NodeLightProbe or 0 or more NodeEmitters --><br />
<NodeLightProbe/><br />
<NodeEmitter/><br />
</MeshHierarchy><br />
<br />
<NodeCrustHierarchy HookID="int" Name="string"><br />
<Export/> <!-- can have 0 or more Exports, defined later in file --><br />
<Translation/> <!-- Optional --><br />
<Rotation/> <!-- Optional --> <br />
<NodeMesh/> <!-- Optional --><br />
<!-- can have 0 or more of the following (including duplicates apparently) --><br />
<Node/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodePointLight/><br />
</NodeCrustHierarchy><br />
<br />
<Rotation> <br />
data <!-- data is a Quaternionf and represents the relative rotation from its parent or the world axis if it has no parent--><br />
</Rotation><br />
<br />
<Export ControllerType="string" ExportName="?string?" TagName="string"/><br />
<!-- Optional Attribute: MaterialColor="List4:decimal" -- String with four values - RGBA --><br />
<!-- An export is what is used to connect nodes from an animation file to nodes in a model file. The key frames in an animation file affect the translations/rotations of the nodes with the corresponding exports of the same name. --><br />
<br />
<BoundingBox><br />
data <!-- data is Vector4f min, Vector4f max (ie: f f f f f f f f --><br />
</BoundingBox><br />
<br />
<Translation><br />
<!-- Optional Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal"-- Three numbers separated by spaces <br />
--><br />
data <!-- This is a vector4 representing the difference in position from its parent, or the origin if it has no parent --><br />
</Translation><br />
<br />
<CollisionObject><br />
<!-- Optional Attributes:<br />
Kinematic="boolean"<br />
Static="boolean"<br />
--><br />
<!-- can have 1 or more Shapes --><br />
<Shape><br />
<!-- Attributes:<br />
AllowEmitterSpawn="int"<br />
Fadeable="boolean"<br />
Name="string"<br />
Position --Vector4f but no required type??<br />
Rotation --Quaternionf but no required type??<br />
Type="string"<br />
--><br />
<!-- Optional Attributes:<br />
DimX="decimal"<br />
DimY="double" -- why double when other dims are decimal???<br />
DimZ="decimal"<br />
GROUP_MASK_CREATURES="boolean"<br />
GROUP_MASK_ITEMS="boolean"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
GROUP_MASK_PLACEABLES="boolean"<br />
GROUP_MASK_STATICGEOMETRY="boolean"<br />
GROUP_MASK_TERRAIN_WALL="boolean"<br />
GROUP_MASK_TRIGGERS="boolean"<br />
GROUP_MASK_WALKABLE="boolean"<br />
Height="double"<br />
Radius="decimal"<br />
--><br />
<!-- VertexData and IndexData are optional, however you must have both or neither. Can have more than one pair??? --><br />
<VertexData length="int"> <!-- I assume length is the number of verts or possibly the number of values given in data --><br />
data <!-- I assume this is a list of vert coords given in a list form (ie: x1,y1,z1,x2,y2,z2,...,xn,yn,zn maybe without commas) --><br />
</VertexData><br />
<IndexData> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
data <!-- maybe its vertex indicies for triangles? --><br />
</IndexData><br />
</Shape><br />
</CollisionObject><br />
<br />
<NodePointLight Color="list4:decimal" IsStatic="int" Name="string" Radius="decimal"> <!-- Color: string of four numbers, separated by spaces. --><br />
<!-- Optional Attributes:<br />
AffectsDomain="int" -- A search through the existing files has this as either "1" or "2", no other values. <br />
I don't know what these domains represent.<br />
IntensityPeriod="decimal"<br />
IntensityPeriodDelta="decimal"<br />
IntensityVariation="decimal"<br />
UseVariationTint="int"-- true/false, I believe <br />
--><br />
<!-- must have at least 1 of the following, can have more including duplicates apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
</NodePointLight><br />
<br />
<NodeWeapontrail Duration="decimal" MaterialObject="string" Name="string" SegmentLength="decimal"><br />
<!-- All MaterialObjects appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<Translation/><br />
<Rotation/><br />
</NodeWeaponTrail><br />
<br />
<Attribute AttributeName="string" SourceName="string"><br />
<!-- AttributeName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<!-- SourceName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</Attribute> <br />
<br />
<NodeUsePoint Name="string" Type="string"><br />
<!-- All Name values seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<!-- Type values: "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front <br />
and back, a few have all four types of nodeusepoint. --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
<NodeCrustHierarchy/> <!-- Optional --><br />
</NodeUsePoint><br />
<br />
<!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, <br />
and tools_bulb_ambient.mmh.xml. <br />
<br />
I would assume this type of node is used for calculating ambient light/shadows maybe like a radiosity pass or something.<br />
Might make some interesting lighting changes if you fiddle with it but be careful! might break your lighting --><br />
<NodeAmbientLight Color="List4:decimal" Name="string" Radius="double"> <br />
<!-- Color: string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, <br />
"0.498039 0.498039 0.498039 1.0" for the two tools <br />
Name: "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. <br />
Radius: 5.0 for the three lightrigs, "1e+007" (10000000?? big big radius!) for the two tools --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
</NodeAmbientLight><br />
<br />
<NodeEmitter> <!-- has a shit ton of attributes, all of which seem to pertain to particle emitter parameters (makes sense) --><br />
<!-- Attributes:<br />
Acceleration="decimal"<br />
Birthrate="decimal"<br />
BirthrateInParticlesPerMeter="int"<br />
BirthrateRange="decimal"<br />
EmitterType="string"<br />
EnableParticleCollisions="int" -- true/false ??<br />
GravityMultiplier="decimal"<br />
IneritVelocityInsteadOfPosition="int" -- true/false ??<br />
InitialRotationSpeedRange="decimal"<br />
InitialSpeed="decimal"<br />
InitialSpeedRange="decimal"<br />
Life="decimal"<br />
LinkParticlesTogether="int" -- true/false ??<br />
MaterialLibrary="string"<br />
MaterialObject="?string?"<br />
MovementSpread="List2:float" -- Two floating point values, representing movementspread X and movementspread Y <br />
Name="?string?" <br />
OrientationBehaviour="string"<br />
ParticleInheritance="string"<br />
ParticlesAffectedByWind="int" -- true/false ??<br />
ParticlesFollowPath="int" -- true/false ??<br />
RotationalAcceleration="decimal"<br />
ScaleRange="decimal"<br />
SpawnSpread="List2:float" -- Two floating point values, representing spawnspread X and spawnspread Y<br />
UpdateOnlyWhenVisible="int" -- true/false ??<br />
--> <br />
<!-- Optional Attributes:<br />
AgeMapColorMultiplier="List4:decimal"- - string of four numbers, separated by spaces.<br />
AgeMapScaleXMultiplier="decimal"<br />
AgeMapScaleYMultiplier="decimal"<br />
Bounciness="decimal"<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="int" -- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; <br />
if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1;<br />
if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;<br />
FramesPerSecond="decimal"<br />
InitialRotation="decimal"<br />
InitialRotationRange="decimal"<br />
InitialRotationSpeed="decimal"<br />
InvMovementSpreadUpdateDelay="decimal"<br />
KillParticleWhenTargetHit="int" -- true/false ??<br />
LOD="int" -- true/false maybe?? might be an index/identifier<br />
LifeRange="decimal"<br />
MeshParticleModel="?string?"<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces <br />
MovementSpreadUpdateDelay="decimal"<br />
ObjectSpaceAcceleration="int"<br />
PhysicsEmitter="int" -- true/false ??<br />
PhysicsObjectSpawn="int -- true/false ??<br />
RandomInitialRotation="int" -- true/false ??<br />
RandomStartFrame="int" --true/false ??<br />
SpawnDirectionTracksTarget="int" -- true/false ??<br />
SplatEmitter="int" -- true/false ?? might be index of a SplatEmitter if they exist<br />
TargetAttraction="decimal"><br />
TargetName="?string?" <br />
TargetRadius="decimal"<br />
UVDistributionSize="int"><br />
UseVariationTint="int" -- true/false ??<br />
UserParamName="??????" -- (datatype=ECString) << What is this?? -- ECString, not sure if there's any special formatting here <br />
VertexFormat="string" -- are there VertexFormats defined somewhere?><br />
WorldAxisAcceleration="List3:decimal" -- Three numbers separated by spaces <br />
--><br />
<!-- Requires 1 or more of the following, duplicates allowed apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
<EmitterAttachments><br />
<!-- Optional EmitterAttachments Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
--><br />
<EmitterAttachment Type="string"/><br />
<!-- Optional EmitterAttachment Attributes:<br />
Name="string"<br />
SpawnOnSurface="int" -- true/false ??<br />
UseNormalForVelocity="int" -- true/false ??<br />
--><br />
</EmitterAttachments><br />
<SpawnVolume InvertSpawnVolumeNormals="int" SpawnWithinVolume="int" > <!-- both look to be true/false values --><br />
<!-- Optional SpawnVolume Attributes:<br />
Axis="??????" -- no data type specified, assuming 3 numbers<br />
Length="decimal"<br />
MaxCorner="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
MinCorner="List3:decimal" -- Three numbers separated by spaces<br />
Radius="decimal"<br />
SpanwVolumeType="string" -- are there SpawnVolumeTypes defined somewhere???<br />
UseVolumeNormalsForDirection="int" -- true/false ??<br />
--><br />
<Data/><!-- 0 or more of these --><br />
</SpawnVolumn><br />
<SplatParticle> <!-- Optional - Not included in the 1 or more --><br />
<!-- SplatParticle Attributes:<br />
Height="decimal"<br />
Lifespan="int"<br />
MaterialObject="string"<br />
NumSamplesH="int"<br />
NumSamplesW="int"<br />
OrientationRangeRadians="int"<br />
Width="decimal"<br />
--><br />
<!-- Optional SplatParticle Attributes:<br />
AgeMapColorMultiplier="List4:decimal" -- four numbers separated by spaces<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="string" -- apparently not same as above in NodeEmitter<br />
FramesPerSecond="int"<br />
HoldLastFrame="int" -- true/false ??<br />
RandomStartFrame="int" -- true/false ??<br />
--><br />
<Export/> <!-- Optional --><br />
<AgeMap/><br />
</SplatParticle><br />
<AgeMap/> <!-- Not Optional - Required - Not included in the 1 or more --><br />
</NodeEmitter><br />
<br />
<Data Semantic="string"><br />
<!-- Optional Attributes:<br />
ElementCount="int"<br />
IndexCount="int"<br />
IndexType="string"<br />
Type="string"<br />
--><br />
data<br />
</Data><br />
<br />
<NodeEmitterGroup MaterialObject="string" Name="?string?"> <br />
<Translation/><br />
<Rotation/><br />
<NodeEmitter/> <!-- 0 or more of these --><br />
</NodeEmitterGroup><br />
<br />
<NodeEmitterTarget Name="string"><br />
<Translation/><br />
<Rotation/><br />
<Export/> <!-- 0 or more exports --><br />
</NodeEmitterTarget><br />
<br />
<NodeLightProbe Name="string"><br />
<Translation/><br />
<Rotation/><br />
<!-- following are optional elements, they are paired, can't have one without the other --><br />
<ReflectionMap ResName="string" /><br />
<IrradianceMap ResName="string" /><br />
</NodeLightProbe><br />
<br />
<AgeMap Count="int"><br />
<!-- contains one or more AgeMapElements --><br />
<AgeMapElement Alpha="decimal" Color="List4:decimal" PercentLifeElapsed="decimal" XScale="decimal" YScale="decimal" /><br />
<!-- Optional AgeMapElement Attributes: RotationSpeedMultiplier="decimal" --><br />
</AgeMap><br />
</pre><br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=MMH&diff=15741MMH2011-02-13T08:36:41Z<p>Eshme: /* mmh.xml schema */</p>
<hr />
<div>'''MMH''' ("Model Mesh Heirarchy") files are used to describe a wide variety of physical objects that appear in Dragon Age levels. It includes props, visual effects, creature models, weapon models, and so forth.<br />
<br />
MMH files are defined by XML files named with the .mmh.xml extension. BioWare generated these XML files using 3DSMax plugins that have some legal encumberances preventing their distribution, but the specifications for .mmh.xml will be released and it is hoped that converters will be able to be written for other file formats. See [[3rd_party_extensions]] for custom model export and import tools.<br />
<br />
The XML file is then run through the GraphicsProcessorMMH.exe program (found in the Dragon Age\Toolset\export_processors directory) to produce a binary file that is used by the game. The game can actually use the XML file directly, but this has poor performance (it runs it through GraphicsProcessorMMH every time the object is loaded) and should only be used for testing purposes.<br />
<br />
:GraphicsProcessorMMH [-outdir <out-dir>] [-platform <x360,pc,ps3>] [options] [-indir<input-directory> / <input-file>]<br />
<br />
Other options include:<br />
<br />
:-byteswapgff{{undocumented}}<!-- ask Graham Wihlidal about these --><br />
<br />
This is the command line you'll typically need:<br />
<br />
:GraphicsProcessorMMH -outdir %ls -platform pc %ls.mmh.xml<br />
<br />
MMH files reference [[MSH]] (mesh) files to define the actual triangles and vertexes used in models.<br />
<br />
== mmh.xml schema ==<br />
<br />
Joint types:<br />
*Cylindrical<br />
*6DOF<br />
*Distance<br />
*Fixed<br />
*PointInPlane<br />
*PointOnLine<br />
*Prismatic<br />
*Pulley<br />
*Revolute<br />
*Spherical<br />
<br />
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format. For a free converter/verifier, see [http://code.google.com/p/jing-trang/].<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><br />
<start><br />
<element name="ModelHierarchy"><br />
<optional><br />
<attribute name="FXActorName"><br />
<data type="NCName"/> <!-- An FXA file name --><br />
</attribute><br />
</optional><br />
<attribute name="ModelDataName"><br />
<data type="NCName"/> <!-- The MSH file name, of where the Mesh Chunks are in by default --><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/> <!-- An MMH file name. This MMH --><br />
</attribute><br />
<optional><br />
<attribute name="PreSimulateTime"><br />
<data type="decimal"/> <!-- emitter presimulation time --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReferencedMeshes"/> <!-- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some have one or more .msh files named with spaces separating them. For example: ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh". Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.--><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialAlpha"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialDecalName"><br />
<data type="NCName"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialFresnelFalloff"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialInvertFresnel"><br />
<data type="integer"/> <!-- if UseRemoteMaterial is true. A true/false value --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialTintColor"/> <!-- if UseRemoteMaterial is true. Four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="UseRemoteMaterial"><br />
<data type="integer"/> <!-- a true/false value --><br />
</attribute><br />
</optional><br />
<choice><br />
<ref name="MeshHierarchy"/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<ref name="Node"/><br />
<ref name="NodeMesh"/><br />
</choice><br />
</element><br />
</start><br />
<define name="NodeMesh"><br />
<element name="NodeMesh"><br />
<optional><br />
<attribute name="BonesUsed"/> <!-- list of integer values, representing the BoneIndices, in an order correlating to the Vertex BoneIndices. Used by models with skeletal Animation. --><br />
</optional><br />
<optional><br />
<attribute name="CastBakedShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CastRuntimeShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CutAway"> <!-- true/false value (Cut Away enables Fading out on Isometric view in Dragon Age) --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ID"><br />
<data type="NCName"/> <!-- A short and unique string. It is unique across every mesh used in whole Dragon Age. Used by lightmapper to reference the mesh --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IsVFXMesh"> <!-- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<optional><br />
<attribute name="MaterialLibrary"> <!-- Strings like "CavesInterior" - reference to MAL files, MAL are material editor file types. (may not actually be useful in the game) --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialObject"> <!-- Strings like "pn_boo_hvyd_l3" here, this is referring to material object (MAO files) create by the material editor --><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshGroupName"> <!-- The Meshes Name, used to reference the meshchunk name in the MSH --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshName"> <!-- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility) --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"> <!-- name of the node --><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="PunchThrough"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveBakedShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveRuntimeShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveShadow"> <!-- I didn't find this referenced in the source code - deprecated, perhaps? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ShadowCasting"> <!-- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Attribute"/><br />
<ref name="BoundingBox"/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> I believe this is the two corners (min and max) of the bounding box. --><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="Scale"><br />
<data type="decimal"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="Node"><br />
<element name="Node"><br />
<optional><br />
<attribute name="BoneIndex"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="SoundMaterialType"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="BoundingBox"/><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodeLightProbe"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeUsePoint"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="NodeCloth"><br />
<attribute name="AttachmentResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="AttachmentTearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BendingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="CF_BENDING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_BENDING_ORTHO"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COLLISION_TWOWAY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COMDAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DISABLE_COLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_GRAVITY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_HARDWARE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_PRESSURE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_SELFCOLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_STATIC"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_TEARABLE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_VISUALIZATION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CollisionResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="DampingCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Density"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="Friction"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<attribute name="GustingDirectionAxisRatio"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="GustingDirectionChange"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ID"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MeshGroupName"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Pressure"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SleepLinearVelocity"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SolverIterations"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="SpeedTreeWindDirection"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindParams"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindUpdateTime"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="StretchingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="TearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Thickness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WakeUpCounter"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindDirection"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="WindEnabled"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="WindResponse"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindResponseLimit"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindSpace"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="WindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Attribute"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<element name="ClothAttachments"><br />
<element name="ClothAttachment"><br />
<attribute name="TearableAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="TwoWayAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</element><br />
<element name="MeshGroup"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<oneOrMore><br />
<ref name="Data"/><br />
</oneOrMore><br />
</element><br />
</element><br />
<element name="NodeSnaptoPoint"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeAmbientLight"/><br />
</optional><br />
</element><br />
</define><br />
<define name="MeshHierarchy"> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<element name="MeshHierarchy"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<ref name="BoundingBox"/><br />
<oneOrMore><br />
<choice><br />
<ref name="MeshHierarchy"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</optional><br />
<choice><br />
<ref name="NodeLightProbe"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="NodeCrustHierarchy"><br />
<element name="NodeCrustHierarchy"><br />
<attribute name="HookID"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<optional><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Node"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodePointLight"/><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeMesh"/><br />
</optional><br />
</element><br />
</define><br />
<define name="Export"><br />
<element name="Export"><br />
<attribute name="ControllerType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ExportName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<attribute name="TagName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</define><br />
<define name="BoundingBox"><br />
<element name="BoundingBox"> <!-- Vector4f min, Vector4f max --><br />
<text/><br />
</element><br />
</define><br />
<define name="Translation"><br />
<element name="Translation"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="Rotation"><br />
<element name="Rotation"> <!-- Quaternionf --><br />
<text/><br />
</element><br />
</define><br />
<define name="CollisionObject"><br />
<element name="CollisionObject"><br />
<optional><br />
<attribute name="Kinematic"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Static"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<element name="Shape"><br />
<attribute name="AllowEmitterSpawn"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="DimX"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimY"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimZ"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_CREATURES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_ITEMS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_PLACEABLES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TERRAIN_WALL"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TRIGGERS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_WALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Height"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Position"/> <!-- Vector4f --><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Rotation"/> <!-- Quaternionf --><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<element name="VertexData"><br />
<attribute name="length"><br />
<data type="integer"/><br />
</attribute><br />
<text/><br />
</element><br />
<element name="IndexData"> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
<text/><br />
</element><br />
</optional><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodePointLight"><br />
<element name="NodePointLight"><br />
<optional><br />
<attribute name="AffectsDomain"> <!-- A search through the existing files has this as either "1" or "2", no other values. I don't know what these domains represent. --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. --><br />
<optional><br />
<attribute name="IntensityPeriod"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityPeriodDelta"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityVariation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="IsStatic"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"> <!-- true/false, I believe --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodeWeapontrail"><br />
<element name="NodeWeapontrail"><br />
<attribute name="Duration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="MaterialObject"> <!-- All appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SegmentLength"><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="Attribute"><br />
<element name="Attribute"><br />
<attribute name="AttributeName"> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SourceName"><br />
<data type="NCName"/> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</attribute><br />
</element><br />
</define><br />
<define name="NodeUsePoint"><br />
<element name="NodeUsePoint"><br />
<attribute name="Name"> <!-- All seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Type"> <!-- "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front and back, a few have all four types of nodeusepoint. --><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<ref name="NodeCrustHierarchy"/><br />
</optional><br />
</element><br />
</define><br />
<define name="NodeAmbientLight"><br />
<element name="NodeAmbientLight"> <!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, and tools_bulb_ambient.mmh.xml. --><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, "0.498039 0.498039 0.498039 1.0" for the two tools --><br />
<attribute name="Name"><!-- "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"> <!-- 5.0 for the three lightrigs, "1e+007" for the two tools --><br />
<data type="double"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="NodeEmitter"><br />
<element name="NodeEmitter"><br />
<attribute name="Acceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- string of four numbers, separated by spaces. --><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleXMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleYMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Birthrate"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BirthrateInParticlesPerMeter"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="BirthrateRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="Bounciness"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="EmitterType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="EnableParticleCollisions"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"/> <!-- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1; if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;--><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="GravityMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InheritVelocityInsteadOfPosition"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="InitialRotation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="InitialRotationRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="InitialRotationSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialRotationSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="InvMovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="KillParticleWhenTargetHit"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="LOD"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Life"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="LifeRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="LinkParticlesTogether"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MeshParticleModel"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<attribute name="MovementSpread"/> <!-- Two floating point values, representing movementspread X and movementspread Y --><br />
<optional><br />
<attribute name="MovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="ObjectSpaceAcceleration"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="OrientationBehaviour"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticleInheritance"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticlesAffectedByWind"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="ParticlesFollowPath"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="PhysicsEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="PhysicsObjectSpawn"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomInitialRotation"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="RotationalAcceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ScaleRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="SpawnDirectionTracksTarget"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnSpread"/> <!-- Two floating point values, representing spawnspread X and spawnspread Y --><br />
<optional><br />
<attribute name="SplatEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetAttraction"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetRadius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UVDistributionSize"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="UpdateOnlyWhenVisible"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UserParamName"/> <!-- ECString, not sure if there's any special formatting here --><br />
</optional><br />
<optional><br />
<attribute name="VertexFormat"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="WorldAxisAcceleration"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="EmitterAttachments"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<element name="EmitterAttachment"><br />
<optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnOnSurface"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="UseNormalForVelocity"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
</element><br />
</element><br />
<element name="SpawnVolume"><br />
<optional><br />
<attribute name="Axis"/><br />
</optional><br />
<attribute name="InvertSpawnVolumeNormals"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="Length"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaxCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MinCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnVolumeType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnWithinVolume"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVolumeNormalsForDirection"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<ref name="Data"/><br />
</zeroOrMore><br />
</element><br />
</choice><br />
</oneOrMore><br />
<optional><br />
<element name="SplatParticle"><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Height"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="HoldLastFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Lifespan"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="NumSamplesH"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="NumSamplesW"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="OrientationRangeRadians"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Width"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<ref name="Export"/><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</define><br />
<define name="Data"><br />
<element name="Data"><br />
<optional><br />
<attribute name="ElementCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Semantic"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="NodeEmitterGroup"><br />
<element name="NodeEmitterGroup"><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeEmitterTarget"><br />
<element name="NodeEmitterTarget"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeLightProbe"><br />
<element name="NodeLightProbe"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<element name="ReflectionMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
<element name="IrradianceMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</optional><br />
</element><br />
</define><br />
<define name="AgeMap"><br />
<element name="AgeMap"><br />
<attribute name="Count"><br />
<data type="integer"/><br />
</attribute><br />
<oneOrMore><br />
<element name="AgeMapElement"><br />
<attribute name="Alpha"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Color"/><br />
<attribute name="PercentLifeElapsed"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="RotationSpeedMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="XScale"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="YScale"><br />
<data type="decimal"/><br />
</attribute><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
</grammar><br />
</pre><br />
<br />
== Example .MMH.XML file ==<br />
<pre><br />
<!-- A note on value types:<br />
List#:type -- means # amount of values of specified type with spaces in between<br />
<br />
string -- a series of characters, digits and underscores, can not start with a colon, no spaces<br />
?string? -- same as above except can start with a colon<br />
int -- an integer (whole number)<br />
decimal -- any number including one with digits appearing after a decimal point, <br />
all decimals MUST have a decimal point even if there are no digits after it (ie 1. not 1, or 0.0)<br />
--><br />
<br />
<ModelHierarchy ModelDataName="string" Name="string"><br />
<!-- Optional Attributes:<br />
FXActorName="string" -- An FXA file name <br />
PreSimulateTime="decimal" -- emitter presimulation time<br />
ReferencedMeshes="List:string" -- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some <br />
have one or more .msh files named with spaces separating them. For example: <br />
ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh"<br />
Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.<br />
RemoteMaterialAlpha="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialDecalName="string" -- if UseRemoteMaterial is true <br />
RemoteMaterialFresnelFalloff="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialInvertFresnel="int" -- if UseRemoteMaterial is true. A true/false value <br />
RemoteMaterialTintColor="List4:decimal"-- if UseRemoteMaterial is true. Four numbers separated by spaces <br />
UseRemoteMaterial="int" -- a true/false value <br />
--><br />
<!-- 1 of (defined below): --><br />
<MeshHierarchy/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<Node/><br />
<NodeMesh/> <br />
</ModelHierarchy><br />
<br />
<NodeMesh><br />
<!-- Optional Attributes:<br />
BonesUsed="List:int" -- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, <br />
helmets, hair, eyes, etc. all have bonesused. <br />
CastBakedShadow="int" -- true/false value <br />
CastRuntimeShadow="int" -- true/false value<br />
CutAway="int" -- true/false value (Cut Away enables Fading out on Isometric view in Dragon Age)<br />
ID="string" -- A short and unique string. It is unique across every mesh used in whole Dragon Age. Used by lightmapper to reference the mesh<br />
IsVFXMesh="int" -- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter<br />
MaterialColor="List4:decimal" -- String with four values - RGBA<br />
MaterialLibrary="string" -- Strings like "CavesInterior" - reference to MAL files, MAL are material editor file types. (may not actually be useful in the game)<br />
MaterialObject="?string?" -- Strings like "pn_boo_hvyd_l3" here, this is referring to material object (MAO files) create by the material editor <br />
MeshGroupName=string"> -- The Meshes Name, used to reference the meshchunk name in the MSH <br />
MeshName="string" -- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility)<br />
Name="string" -- name of the node<br />
PunchThrough="int" -- true/false value<br />
ReceiveBakedShadow="int" -- true/false value <br />
ReceiveRuntimeShadow="int" -- true/false value <br />
<<UNKNOWN>> ReceiveShadow="int" -- I didn't find this referenced in the source code - deprecated, perhaps? <br />
ShadowCasting="int" -- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms?<br />
UseVariationTint="int" -- true/false value<br />
--><br />
<!-- 0 or more of the following items come next, definitions follow later --><br />
<Attribute/><br />
<BoundingBox/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> <br />
I believe this is the two corners (min and max) of the bounding box. --><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeMesh/> <!-- appears to be able to handle a nodemesh within a nodemesh :O --><br />
<NodePointLight/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<Scale>"decimal"</Scale> <br />
<!-- I am assuming next bit means no more than one of the following (could be none): <br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
--><br />
<NodeAmbientLight/><br />
<NodeUsePoint/><br />
<NodeEmitter/><br />
</NodeMesh><br />
<br />
<Node Name="?string?"><br />
<!-- Optional Attributes:<br />
BoneIndex="int" ---- possibly the bone to which this node is attached to, not included if not attached to a bone?<br />
SoundMaterialType="int" ---- are there SoundMaterialType definitions somewhere? if so I guess this is the index of one<br />
--><br />
<!-- can have 0 or more of the following(including duplicates), however I assume having more than one of the same type<br />
would cause the compiler to go wtf? in some cases (like bounding box or translation). Definitions follow later in file<br />
--><br />
<BoundingBox/><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodeLightProbe/><br />
<NodeMesh/><br />
<NodePointLight/><br />
<NodeUsePoint/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<NodeCloth> <!-- has a shit load of attributes with no comments however I assume they all have to do with cloth simulation paramaters --><br />
<!-- NodeCloth Attributes:<br />
AttachmentResponseCoefficient="decimal" <br />
AttachmentTearFactor="decimal" <br />
BendingStiffness="decimal" <br />
CF_BENDING="int"<br />
CF_BENDING_ORTHO="int"<br />
CF_COLLISION_TWOWAY="int"<br />
CF_COMDAMPING="int"<br />
CF_DAMPING="int"<br />
CF_DISABLE_COLLISION="int"<br />
CF_GRAVITY="int"<br />
CF_HARDWARE="int"<br />
CF_PRESSURE="int"<br />
CF_SELFCOLLISION="int"<br />
CF_STATIC="int"<br />
CF_TEARABLE="int"<br />
CF_VISUALIZATION="int"<br />
CollisionResponseCoefficient="decimal"<br />
DampingCoefficient="decimal"<br />
Density="decimal"<br />
Fadeable="boolean"<br />
Friction="decimal"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
ID="string"<br />
MaterialLibrary="string"<br />
MaterialObject="string"<br />
MeshGroupName="string"<br />
Name="string"<br />
Pressure="decimal"<br />
SleepLinearVelocity="decimal"<br />
SolverIterations="int"<br />
StretchingStiffness="decimal"<br />
TearFactor="decimal"<br />
Thickness="decimal"<br />
WakeUpCounter="decimal"<br />
--><br />
<!-- Optional Attributes: GROUP_MASK_STATICGEOMETRY="boolean" --><br />
<Attribute/><br />
<Export/> <!-- can have 0 or more Exports --><br />
<Translation/><br />
<Rotation/><br />
<ClothAttachments><br />
<ClothAttachment TearableAttachment="int" TwoWayAttachment="int" Type="string"><br />
</ClothAttachment><br />
</ClothAttachments><br />
<MeshGroup Name="string"> <!-- contains 1 or more Data elements, defined later in file --><br />
<Data/> <br />
</MeshGroup><br />
</NodeCloth><br />
<NodeSnaptoPoint Name="string"><br />
<!-- can have 0 or more Exports --><br />
<Export/><br />
<!-- can have 0 or more of the following, defined later in file --><br />
<Translation/><br />
<Rotation/><br />
</NodeSnapToPoint><br />
<NodeAmbientLight/> <!-- Optional Element defined later in file--> <br />
</Node><br />
<br />
<!-- <<<WARNING: PROBABLY NOT A GOOD IDEA TO USE THIS ONE!!!>>> --><br />
<!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<!-- IE it is a REALLY old version of NodeMesh --><br />
<MeshHierarchy Name="string"> <br />
<BoundingBox/> <!-- Optional --><br />
<!-- These are Optional and apparently can have more than one if you want, defined lated in file --><br />
<MeshHierarchy/><br />
<Rotation/><br />
<Translation/><br />
<!-- can have either a NodeLightProbe or 0 or more NodeEmitters --><br />
<NodeLightProbe/><br />
<NodeEmitter/><br />
</MeshHierarchy><br />
<br />
<NodeCrustHierarchy HookID="int" Name="string"><br />
<Export/> <!-- can have 0 or more Exports, defined later in file --><br />
<Translation/> <!-- Optional --><br />
<Rotation/> <!-- Optional --> <br />
<NodeMesh/> <!-- Optional --><br />
<!-- can have 0 or more of the following (including duplicates apparently) --><br />
<Node/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodePointLight/><br />
</NodeCrustHierarchy><br />
<br />
<Rotation> <br />
data <!-- data is a Quaternionf and represents the relative rotation from its parent or the world axis if it has no parent--><br />
</Rotation><br />
<br />
<Export ControllerType="string" ExportName="?string?" TagName="string"/><br />
<!-- Optional Attribute: MaterialColor="List4:decimal" -- String with four values - RGBA --><br />
<!-- An export is what is used to connect nodes from an animation file to nodes in a model file. The key frames in an animation file affect the translations/rotations of the nodes with the corresponding exports of the same name. --><br />
<br />
<BoundingBox><br />
data <!-- data is Vector4f min, Vector4f max (ie: f f f f f f f f --><br />
</BoundingBox><br />
<br />
<Translation><br />
<!-- Optional Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal"-- Three numbers separated by spaces <br />
--><br />
data <!-- This is a vector4 representing the difference in position from its parent, or the origin if it has no parent --><br />
</Translation><br />
<br />
<CollisionObject><br />
<!-- Optional Attributes:<br />
Kinematic="boolean"<br />
Static="boolean"<br />
--><br />
<!-- can have 1 or more Shapes --><br />
<Shape><br />
<!-- Attributes:<br />
AllowEmitterSpawn="int"<br />
Fadeable="boolean"<br />
Name="string"<br />
Position --Vector4f but no required type??<br />
Rotation --Quaternionf but no required type??<br />
Type="string"<br />
--><br />
<!-- Optional Attributes:<br />
DimX="decimal"<br />
DimY="double" -- why double when other dims are decimal???<br />
DimZ="decimal"<br />
GROUP_MASK_CREATURES="boolean"<br />
GROUP_MASK_ITEMS="boolean"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
GROUP_MASK_PLACEABLES="boolean"<br />
GROUP_MASK_STATICGEOMETRY="boolean"<br />
GROUP_MASK_TERRAIN_WALL="boolean"<br />
GROUP_MASK_TRIGGERS="boolean"<br />
GROUP_MASK_WALKABLE="boolean"<br />
Height="double"<br />
Radius="decimal"<br />
--><br />
<!-- VertexData and IndexData are optional, however you must have both or neither. Can have more than one pair??? --><br />
<VertexData length="int"> <!-- I assume length is the number of verts or possibly the number of values given in data --><br />
data <!-- I assume this is a list of vert coords given in a list form (ie: x1,y1,z1,x2,y2,z2,...,xn,yn,zn maybe without commas) --><br />
</VertexData><br />
<IndexData> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
data <!-- maybe its vertex indicies for triangles? --><br />
</IndexData><br />
</Shape><br />
</CollisionObject><br />
<br />
<NodePointLight Color="list4:decimal" IsStatic="int" Name="string" Radius="decimal"> <!-- Color: string of four numbers, separated by spaces. --><br />
<!-- Optional Attributes:<br />
AffectsDomain="int" -- A search through the existing files has this as either "1" or "2", no other values. <br />
I don't know what these domains represent.<br />
IntensityPeriod="decimal"<br />
IntensityPeriodDelta="decimal"<br />
IntensityVariation="decimal"<br />
UseVariationTint="int"-- true/false, I believe <br />
--><br />
<!-- must have at least 1 of the following, can have more including duplicates apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
</NodePointLight><br />
<br />
<NodeWeapontrail Duration="decimal" MaterialObject="string" Name="string" SegmentLength="decimal"><br />
<!-- All MaterialObjects appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<Translation/><br />
<Rotation/><br />
</NodeWeaponTrail><br />
<br />
<Attribute AttributeName="string" SourceName="string"><br />
<!-- AttributeName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<!-- SourceName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</Attribute> <br />
<br />
<NodeUsePoint Name="string" Type="string"><br />
<!-- All Name values seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<!-- Type values: "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front <br />
and back, a few have all four types of nodeusepoint. --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
<NodeCrustHierarchy/> <!-- Optional --><br />
</NodeUsePoint><br />
<br />
<!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, <br />
and tools_bulb_ambient.mmh.xml. <br />
<br />
I would assume this type of node is used for calculating ambient light/shadows maybe like a radiosity pass or something.<br />
Might make some interesting lighting changes if you fiddle with it but be careful! might break your lighting --><br />
<NodeAmbientLight Color="List4:decimal" Name="string" Radius="double"> <br />
<!-- Color: string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, <br />
"0.498039 0.498039 0.498039 1.0" for the two tools <br />
Name: "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. <br />
Radius: 5.0 for the three lightrigs, "1e+007" (10000000?? big big radius!) for the two tools --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
</NodeAmbientLight><br />
<br />
<NodeEmitter> <!-- has a shit ton of attributes, all of which seem to pertain to particle emitter parameters (makes sense) --><br />
<!-- Attributes:<br />
Acceleration="decimal"<br />
Birthrate="decimal"<br />
BirthrateInParticlesPerMeter="int"<br />
BirthrateRange="decimal"<br />
EmitterType="string"<br />
EnableParticleCollisions="int" -- true/false ??<br />
GravityMultiplier="decimal"<br />
IneritVelocityInsteadOfPosition="int" -- true/false ??<br />
InitialRotationSpeedRange="decimal"<br />
InitialSpeed="decimal"<br />
InitialSpeedRange="decimal"<br />
Life="decimal"<br />
LinkParticlesTogether="int" -- true/false ??<br />
MaterialLibrary="string"<br />
MaterialObject="?string?"<br />
MovementSpread="List2:float" -- Two floating point values, representing movementspread X and movementspread Y <br />
Name="?string?" <br />
OrientationBehaviour="string"<br />
ParticleInheritance="string"<br />
ParticlesAffectedByWind="int" -- true/false ??<br />
ParticlesFollowPath="int" -- true/false ??<br />
RotationalAcceleration="decimal"<br />
ScaleRange="decimal"<br />
SpawnSpread="List2:float" -- Two floating point values, representing spawnspread X and spawnspread Y<br />
UpdateOnlyWhenVisible="int" -- true/false ??<br />
--> <br />
<!-- Optional Attributes:<br />
AgeMapColorMultiplier="List4:decimal"- - string of four numbers, separated by spaces.<br />
AgeMapScaleXMultiplier="decimal"<br />
AgeMapScaleYMultiplier="decimal"<br />
Bounciness="decimal"<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="int" -- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; <br />
if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1;<br />
if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;<br />
FramesPerSecond="decimal"<br />
InitialRotation="decimal"<br />
InitialRotationRange="decimal"<br />
InitialRotationSpeed="decimal"<br />
InvMovementSpreadUpdateDelay="decimal"<br />
KillParticleWhenTargetHit="int" -- true/false ??<br />
LOD="int" -- true/false maybe?? might be an index/identifier<br />
LifeRange="decimal"<br />
MeshParticleModel="?string?"<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces <br />
MovementSpreadUpdateDelay="decimal"<br />
ObjectSpaceAcceleration="int"<br />
PhysicsEmitter="int" -- true/false ??<br />
PhysicsObjectSpawn="int -- true/false ??<br />
RandomInitialRotation="int" -- true/false ??<br />
RandomStartFrame="int" --true/false ??<br />
SpawnDirectionTracksTarget="int" -- true/false ??<br />
SplatEmitter="int" -- true/false ?? might be index of a SplatEmitter if they exist<br />
TargetAttraction="decimal"><br />
TargetName="?string?" <br />
TargetRadius="decimal"<br />
UVDistributionSize="int"><br />
UseVariationTint="int" -- true/false ??<br />
UserParamName="??????" -- (datatype=ECString) << What is this?? -- ECString, not sure if there's any special formatting here <br />
VertexFormat="string" -- are there VertexFormats defined somewhere?><br />
WorldAxisAcceleration="List3:decimal" -- Three numbers separated by spaces <br />
--><br />
<!-- Requires 1 or more of the following, duplicates allowed apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
<EmitterAttachments><br />
<!-- Optional EmitterAttachments Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
--><br />
<EmitterAttachment Type="string"/><br />
<!-- Optional EmitterAttachment Attributes:<br />
Name="string"<br />
SpawnOnSurface="int" -- true/false ??<br />
UseNormalForVelocity="int" -- true/false ??<br />
--><br />
</EmitterAttachments><br />
<SpawnVolume InvertSpawnVolumeNormals="int" SpawnWithinVolume="int" > <!-- both look to be true/false values --><br />
<!-- Optional SpawnVolume Attributes:<br />
Axis="??????" -- no data type specified, assuming 3 numbers<br />
Length="decimal"<br />
MaxCorner="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
MinCorner="List3:decimal" -- Three numbers separated by spaces<br />
Radius="decimal"<br />
SpanwVolumeType="string" -- are there SpawnVolumeTypes defined somewhere???<br />
UseVolumeNormalsForDirection="int" -- true/false ??<br />
--><br />
<Data/><!-- 0 or more of these --><br />
</SpawnVolumn><br />
<SplatParticle> <!-- Optional - Not included in the 1 or more --><br />
<!-- SplatParticle Attributes:<br />
Height="decimal"<br />
Lifespan="int"<br />
MaterialObject="string"<br />
NumSamplesH="int"<br />
NumSamplesW="int"<br />
OrientationRangeRadians="int"<br />
Width="decimal"<br />
--><br />
<!-- Optional SplatParticle Attributes:<br />
AgeMapColorMultiplier="List4:decimal" -- four numbers separated by spaces<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="string" -- apparently not same as above in NodeEmitter<br />
FramesPerSecond="int"<br />
HoldLastFrame="int" -- true/false ??<br />
RandomStartFrame="int" -- true/false ??<br />
--><br />
<Export/> <!-- Optional --><br />
<AgeMap/><br />
</SplatParticle><br />
<AgeMap/> <!-- Not Optional - Required - Not included in the 1 or more --><br />
</NodeEmitter><br />
<br />
<Data Semantic="string"><br />
<!-- Optional Attributes:<br />
ElementCount="int"<br />
IndexCount="int"<br />
IndexType="string"<br />
Type="string"<br />
--><br />
data<br />
</Data><br />
<br />
<NodeEmitterGroup MaterialObject="string" Name="?string?"> <br />
<Translation/><br />
<Rotation/><br />
<NodeEmitter/> <!-- 0 or more of these --><br />
</NodeEmitterGroup><br />
<br />
<NodeEmitterTarget Name="string"><br />
<Translation/><br />
<Rotation/><br />
<Export/> <!-- 0 or more exports --><br />
</NodeEmitterTarget><br />
<br />
<NodeLightProbe Name="string"><br />
<Translation/><br />
<Rotation/><br />
<!-- following are optional elements, they are paired, can't have one without the other --><br />
<ReflectionMap ResName="string" /><br />
<IrradianceMap ResName="string" /><br />
</NodeLightProbe><br />
<br />
<AgeMap Count="int"><br />
<!-- contains one or more AgeMapElements --><br />
<AgeMapElement Alpha="decimal" Color="List4:decimal" PercentLifeElapsed="decimal" XScale="decimal" YScale="decimal" /><br />
<!-- Optional AgeMapElement Attributes: RotationSpeedMultiplier="decimal" --><br />
</AgeMap><br />
</pre><br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=MMH&diff=15740MMH2011-02-13T08:32:17Z<p>Eshme: /* mmh.xml schema */</p>
<hr />
<div>'''MMH''' ("Model Mesh Heirarchy") files are used to describe a wide variety of physical objects that appear in Dragon Age levels. It includes props, visual effects, creature models, weapon models, and so forth.<br />
<br />
MMH files are defined by XML files named with the .mmh.xml extension. BioWare generated these XML files using 3DSMax plugins that have some legal encumberances preventing their distribution, but the specifications for .mmh.xml will be released and it is hoped that converters will be able to be written for other file formats. See [[3rd_party_extensions]] for custom model export and import tools.<br />
<br />
The XML file is then run through the GraphicsProcessorMMH.exe program (found in the Dragon Age\Toolset\export_processors directory) to produce a binary file that is used by the game. The game can actually use the XML file directly, but this has poor performance (it runs it through GraphicsProcessorMMH every time the object is loaded) and should only be used for testing purposes.<br />
<br />
:GraphicsProcessorMMH [-outdir <out-dir>] [-platform <x360,pc,ps3>] [options] [-indir<input-directory> / <input-file>]<br />
<br />
Other options include:<br />
<br />
:-byteswapgff{{undocumented}}<!-- ask Graham Wihlidal about these --><br />
<br />
This is the command line you'll typically need:<br />
<br />
:GraphicsProcessorMMH -outdir %ls -platform pc %ls.mmh.xml<br />
<br />
MMH files reference [[MSH]] (mesh) files to define the actual triangles and vertexes used in models.<br />
<br />
== mmh.xml schema ==<br />
<br />
Joint types:<br />
*Cylindrical<br />
*6DOF<br />
*Distance<br />
*Fixed<br />
*PointInPlane<br />
*PointOnLine<br />
*Prismatic<br />
*Pulley<br />
*Revolute<br />
*Spherical<br />
<br />
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format. For a free converter/verifier, see [http://code.google.com/p/jing-trang/].<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><br />
<start><br />
<element name="ModelHierarchy"><br />
<optional><br />
<attribute name="FXActorName"><br />
<data type="NCName"/> <!-- An FXA file name --><br />
</attribute><br />
</optional><br />
<attribute name="ModelDataName"><br />
<data type="NCName"/> <!-- The MSH file name, of where the Mesh Chunks are in by default --><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/> <!-- An MMH file name. This MMH --><br />
</attribute><br />
<optional><br />
<attribute name="PreSimulateTime"><br />
<data type="decimal"/> <!-- emitter presimulation time --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReferencedMeshes"/> <!-- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some have one or more .msh files named with spaces separating them. For example: ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh". Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.--><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialAlpha"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialDecalName"><br />
<data type="NCName"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialFresnelFalloff"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialInvertFresnel"><br />
<data type="integer"/> <!-- if UseRemoteMaterial is true. A true/false value --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialTintColor"/> <!-- if UseRemoteMaterial is true. Four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="UseRemoteMaterial"><br />
<data type="integer"/> <!-- a true/false value --><br />
</attribute><br />
</optional><br />
<choice><br />
<ref name="MeshHierarchy"/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<ref name="Node"/><br />
<ref name="NodeMesh"/><br />
</choice><br />
</element><br />
</start><br />
<define name="NodeMesh"><br />
<element name="NodeMesh"><br />
<optional><br />
<attribute name="BonesUsed"/> <!-- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, helmets, hair, eyes, etc. all have bonesused. --><br />
</optional><br />
<optional><br />
<attribute name="CastBakedShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CastRuntimeShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CutAway"> <!-- true/false value (Cut Away enables Fading out on Isometric view in Dragon Age) --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ID"><br />
<data type="NCName"/> <!-- A short and unique string. It is unique across every mesh used in whole Dragon Age. Used by lightmapper to reference the mesh --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IsVFXMesh"> <!-- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<optional><br />
<attribute name="MaterialLibrary"> <!-- Strings like "CavesInterior" - reference to MAL files, MAL are material editor file types. (may not actually be useful in the game) --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialObject"> <!-- Strings like "pn_boo_hvyd_l3" here, this is referring to material object (MAO files) create by the material editor --><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshGroupName"> <!-- The Meshes Name, used to reference the meshchunk name in the MSH --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshName"> <!-- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility) --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"> <!-- name of the node --><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="PunchThrough"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveBakedShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveRuntimeShadow"> <!-- true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveShadow"> <!-- I didn't find this referenced in the source code - deprecated, perhaps? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ShadowCasting"> <!-- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Attribute"/><br />
<ref name="BoundingBox"/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> I believe this is the two corners (min and max) of the bounding box. --><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="Scale"><br />
<data type="decimal"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="Node"><br />
<element name="Node"><br />
<optional><br />
<attribute name="BoneIndex"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="SoundMaterialType"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="BoundingBox"/><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodeLightProbe"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeUsePoint"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="NodeCloth"><br />
<attribute name="AttachmentResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="AttachmentTearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BendingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="CF_BENDING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_BENDING_ORTHO"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COLLISION_TWOWAY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COMDAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DISABLE_COLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_GRAVITY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_HARDWARE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_PRESSURE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_SELFCOLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_STATIC"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_TEARABLE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_VISUALIZATION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CollisionResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="DampingCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Density"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="Friction"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<attribute name="GustingDirectionAxisRatio"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="GustingDirectionChange"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ID"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MeshGroupName"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Pressure"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SleepLinearVelocity"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SolverIterations"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="SpeedTreeWindDirection"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindParams"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindUpdateTime"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="StretchingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="TearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Thickness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WakeUpCounter"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindDirection"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="WindEnabled"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="WindResponse"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindResponseLimit"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindSpace"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="WindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Attribute"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<element name="ClothAttachments"><br />
<element name="ClothAttachment"><br />
<attribute name="TearableAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="TwoWayAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</element><br />
<element name="MeshGroup"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<oneOrMore><br />
<ref name="Data"/><br />
</oneOrMore><br />
</element><br />
</element><br />
<element name="NodeSnaptoPoint"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeAmbientLight"/><br />
</optional><br />
</element><br />
</define><br />
<define name="MeshHierarchy"> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<element name="MeshHierarchy"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<ref name="BoundingBox"/><br />
<oneOrMore><br />
<choice><br />
<ref name="MeshHierarchy"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</optional><br />
<choice><br />
<ref name="NodeLightProbe"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="NodeCrustHierarchy"><br />
<element name="NodeCrustHierarchy"><br />
<attribute name="HookID"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<optional><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Node"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodePointLight"/><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeMesh"/><br />
</optional><br />
</element><br />
</define><br />
<define name="Export"><br />
<element name="Export"><br />
<attribute name="ControllerType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ExportName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<attribute name="TagName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</define><br />
<define name="BoundingBox"><br />
<element name="BoundingBox"> <!-- Vector4f min, Vector4f max --><br />
<text/><br />
</element><br />
</define><br />
<define name="Translation"><br />
<element name="Translation"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="Rotation"><br />
<element name="Rotation"> <!-- Quaternionf --><br />
<text/><br />
</element><br />
</define><br />
<define name="CollisionObject"><br />
<element name="CollisionObject"><br />
<optional><br />
<attribute name="Kinematic"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Static"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<element name="Shape"><br />
<attribute name="AllowEmitterSpawn"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="DimX"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimY"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimZ"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_CREATURES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_ITEMS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_PLACEABLES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TERRAIN_WALL"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TRIGGERS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_WALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Height"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Position"/> <!-- Vector4f --><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Rotation"/> <!-- Quaternionf --><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<element name="VertexData"><br />
<attribute name="length"><br />
<data type="integer"/><br />
</attribute><br />
<text/><br />
</element><br />
<element name="IndexData"> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
<text/><br />
</element><br />
</optional><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodePointLight"><br />
<element name="NodePointLight"><br />
<optional><br />
<attribute name="AffectsDomain"> <!-- A search through the existing files has this as either "1" or "2", no other values. I don't know what these domains represent. --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. --><br />
<optional><br />
<attribute name="IntensityPeriod"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityPeriodDelta"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityVariation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="IsStatic"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"> <!-- true/false, I believe --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodeWeapontrail"><br />
<element name="NodeWeapontrail"><br />
<attribute name="Duration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="MaterialObject"> <!-- All appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SegmentLength"><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="Attribute"><br />
<element name="Attribute"><br />
<attribute name="AttributeName"> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SourceName"><br />
<data type="NCName"/> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</attribute><br />
</element><br />
</define><br />
<define name="NodeUsePoint"><br />
<element name="NodeUsePoint"><br />
<attribute name="Name"> <!-- All seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Type"> <!-- "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front and back, a few have all four types of nodeusepoint. --><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<ref name="NodeCrustHierarchy"/><br />
</optional><br />
</element><br />
</define><br />
<define name="NodeAmbientLight"><br />
<element name="NodeAmbientLight"> <!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, and tools_bulb_ambient.mmh.xml. --><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, "0.498039 0.498039 0.498039 1.0" for the two tools --><br />
<attribute name="Name"><!-- "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"> <!-- 5.0 for the three lightrigs, "1e+007" for the two tools --><br />
<data type="double"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="NodeEmitter"><br />
<element name="NodeEmitter"><br />
<attribute name="Acceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- string of four numbers, separated by spaces. --><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleXMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleYMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Birthrate"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BirthrateInParticlesPerMeter"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="BirthrateRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="Bounciness"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="EmitterType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="EnableParticleCollisions"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"/> <!-- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1; if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;--><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="GravityMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InheritVelocityInsteadOfPosition"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="InitialRotation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="InitialRotationRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="InitialRotationSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialRotationSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="InvMovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="KillParticleWhenTargetHit"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="LOD"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Life"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="LifeRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="LinkParticlesTogether"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MeshParticleModel"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<attribute name="MovementSpread"/> <!-- Two floating point values, representing movementspread X and movementspread Y --><br />
<optional><br />
<attribute name="MovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="ObjectSpaceAcceleration"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="OrientationBehaviour"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticleInheritance"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticlesAffectedByWind"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="ParticlesFollowPath"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="PhysicsEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="PhysicsObjectSpawn"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomInitialRotation"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="RotationalAcceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ScaleRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="SpawnDirectionTracksTarget"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnSpread"/> <!-- Two floating point values, representing spawnspread X and spawnspread Y --><br />
<optional><br />
<attribute name="SplatEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetAttraction"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetRadius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UVDistributionSize"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="UpdateOnlyWhenVisible"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UserParamName"/> <!-- ECString, not sure if there's any special formatting here --><br />
</optional><br />
<optional><br />
<attribute name="VertexFormat"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="WorldAxisAcceleration"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="EmitterAttachments"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<element name="EmitterAttachment"><br />
<optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnOnSurface"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="UseNormalForVelocity"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
</element><br />
</element><br />
<element name="SpawnVolume"><br />
<optional><br />
<attribute name="Axis"/><br />
</optional><br />
<attribute name="InvertSpawnVolumeNormals"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="Length"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaxCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MinCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnVolumeType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnWithinVolume"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVolumeNormalsForDirection"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<ref name="Data"/><br />
</zeroOrMore><br />
</element><br />
</choice><br />
</oneOrMore><br />
<optional><br />
<element name="SplatParticle"><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Height"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="HoldLastFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Lifespan"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="NumSamplesH"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="NumSamplesW"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="OrientationRangeRadians"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Width"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<ref name="Export"/><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</define><br />
<define name="Data"><br />
<element name="Data"><br />
<optional><br />
<attribute name="ElementCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Semantic"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="NodeEmitterGroup"><br />
<element name="NodeEmitterGroup"><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeEmitterTarget"><br />
<element name="NodeEmitterTarget"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeLightProbe"><br />
<element name="NodeLightProbe"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<element name="ReflectionMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
<element name="IrradianceMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</optional><br />
</element><br />
</define><br />
<define name="AgeMap"><br />
<element name="AgeMap"><br />
<attribute name="Count"><br />
<data type="integer"/><br />
</attribute><br />
<oneOrMore><br />
<element name="AgeMapElement"><br />
<attribute name="Alpha"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Color"/><br />
<attribute name="PercentLifeElapsed"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="RotationSpeedMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="XScale"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="YScale"><br />
<data type="decimal"/><br />
</attribute><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
</grammar><br />
</pre><br />
<br />
== Example .MMH.XML file ==<br />
<pre><br />
<!-- A note on value types:<br />
List#:type -- means # amount of values of specified type with spaces in between<br />
<br />
string -- a series of characters, digits and underscores, can not start with a colon, no spaces<br />
?string? -- same as above except can start with a colon<br />
int -- an integer (whole number)<br />
decimal -- any number including one with digits appearing after a decimal point, <br />
all decimals MUST have a decimal point even if there are no digits after it (ie 1. not 1, or 0.0)<br />
--><br />
<br />
<ModelHierarchy ModelDataName="string" Name="string"><br />
<!-- Optional Attributes:<br />
FXActorName="string" -- An FXA file name <br />
PreSimulateTime="decimal" -- emitter presimulation time<br />
ReferencedMeshes="List:string" -- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some <br />
have one or more .msh files named with spaces separating them. For example: <br />
ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh"<br />
Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.<br />
RemoteMaterialAlpha="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialDecalName="string" -- if UseRemoteMaterial is true <br />
RemoteMaterialFresnelFalloff="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialInvertFresnel="int" -- if UseRemoteMaterial is true. A true/false value <br />
RemoteMaterialTintColor="List4:decimal"-- if UseRemoteMaterial is true. Four numbers separated by spaces <br />
UseRemoteMaterial="int" -- a true/false value <br />
--><br />
<!-- 1 of (defined below): --><br />
<MeshHierarchy/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<Node/><br />
<NodeMesh/> <br />
</ModelHierarchy><br />
<br />
<NodeMesh><br />
<!-- Optional Attributes:<br />
BonesUsed="List:int" -- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, <br />
helmets, hair, eyes, etc. all have bonesused. <br />
CastBakedShadow="int" -- true/false value <br />
CastRuntimeShadow="int" -- true/false value<br />
CutAway="int" -- true/false value (Cut Away enables Fading out on Isometric view in Dragon Age)<br />
ID="string" -- A short and unique string. It is unique across every mesh used in whole Dragon Age. Used by lightmapper to reference the mesh<br />
IsVFXMesh="int" -- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter<br />
MaterialColor="List4:decimal" -- String with four values - RGBA<br />
MaterialLibrary="string" -- Strings like "CavesInterior" - reference to MAL files, MAL are material editor file types. (may not actually be useful in the game)<br />
MaterialObject="?string?" -- Strings like "pn_boo_hvyd_l3" here, this is referring to material object (MAO files) create by the material editor <br />
MeshGroupName=string"> -- The Meshes Name, used to reference the meshchunk name in the MSH <br />
MeshName="string" -- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility)<br />
Name="string" -- name of the node<br />
PunchThrough="int" -- true/false value<br />
ReceiveBakedShadow="int" -- true/false value <br />
ReceiveRuntimeShadow="int" -- true/false value <br />
<<UNKNOWN>> ReceiveShadow="int" -- I didn't find this referenced in the source code - deprecated, perhaps? <br />
ShadowCasting="int" -- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms?<br />
UseVariationTint="int" -- true/false value<br />
--><br />
<!-- 0 or more of the following items come next, definitions follow later --><br />
<Attribute/><br />
<BoundingBox/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> <br />
I believe this is the two corners (min and max) of the bounding box. --><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeMesh/> <!-- appears to be able to handle a nodemesh within a nodemesh :O --><br />
<NodePointLight/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<Scale>"decimal"</Scale> <br />
<!-- I am assuming next bit means no more than one of the following (could be none): <br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
--><br />
<NodeAmbientLight/><br />
<NodeUsePoint/><br />
<NodeEmitter/><br />
</NodeMesh><br />
<br />
<Node Name="?string?"><br />
<!-- Optional Attributes:<br />
BoneIndex="int" ---- possibly the bone to which this node is attached to, not included if not attached to a bone?<br />
SoundMaterialType="int" ---- are there SoundMaterialType definitions somewhere? if so I guess this is the index of one<br />
--><br />
<!-- can have 0 or more of the following(including duplicates), however I assume having more than one of the same type<br />
would cause the compiler to go wtf? in some cases (like bounding box or translation). Definitions follow later in file<br />
--><br />
<BoundingBox/><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodeLightProbe/><br />
<NodeMesh/><br />
<NodePointLight/><br />
<NodeUsePoint/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<NodeCloth> <!-- has a shit load of attributes with no comments however I assume they all have to do with cloth simulation paramaters --><br />
<!-- NodeCloth Attributes:<br />
AttachmentResponseCoefficient="decimal" <br />
AttachmentTearFactor="decimal" <br />
BendingStiffness="decimal" <br />
CF_BENDING="int"<br />
CF_BENDING_ORTHO="int"<br />
CF_COLLISION_TWOWAY="int"<br />
CF_COMDAMPING="int"<br />
CF_DAMPING="int"<br />
CF_DISABLE_COLLISION="int"<br />
CF_GRAVITY="int"<br />
CF_HARDWARE="int"<br />
CF_PRESSURE="int"<br />
CF_SELFCOLLISION="int"<br />
CF_STATIC="int"<br />
CF_TEARABLE="int"<br />
CF_VISUALIZATION="int"<br />
CollisionResponseCoefficient="decimal"<br />
DampingCoefficient="decimal"<br />
Density="decimal"<br />
Fadeable="boolean"<br />
Friction="decimal"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
ID="string"<br />
MaterialLibrary="string"<br />
MaterialObject="string"<br />
MeshGroupName="string"<br />
Name="string"<br />
Pressure="decimal"<br />
SleepLinearVelocity="decimal"<br />
SolverIterations="int"<br />
StretchingStiffness="decimal"<br />
TearFactor="decimal"<br />
Thickness="decimal"<br />
WakeUpCounter="decimal"<br />
--><br />
<!-- Optional Attributes: GROUP_MASK_STATICGEOMETRY="boolean" --><br />
<Attribute/><br />
<Export/> <!-- can have 0 or more Exports --><br />
<Translation/><br />
<Rotation/><br />
<ClothAttachments><br />
<ClothAttachment TearableAttachment="int" TwoWayAttachment="int" Type="string"><br />
</ClothAttachment><br />
</ClothAttachments><br />
<MeshGroup Name="string"> <!-- contains 1 or more Data elements, defined later in file --><br />
<Data/> <br />
</MeshGroup><br />
</NodeCloth><br />
<NodeSnaptoPoint Name="string"><br />
<!-- can have 0 or more Exports --><br />
<Export/><br />
<!-- can have 0 or more of the following, defined later in file --><br />
<Translation/><br />
<Rotation/><br />
</NodeSnapToPoint><br />
<NodeAmbientLight/> <!-- Optional Element defined later in file--> <br />
</Node><br />
<br />
<!-- <<<WARNING: PROBABLY NOT A GOOD IDEA TO USE THIS ONE!!!>>> --><br />
<!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<!-- IE it is a REALLY old version of NodeMesh --><br />
<MeshHierarchy Name="string"> <br />
<BoundingBox/> <!-- Optional --><br />
<!-- These are Optional and apparently can have more than one if you want, defined lated in file --><br />
<MeshHierarchy/><br />
<Rotation/><br />
<Translation/><br />
<!-- can have either a NodeLightProbe or 0 or more NodeEmitters --><br />
<NodeLightProbe/><br />
<NodeEmitter/><br />
</MeshHierarchy><br />
<br />
<NodeCrustHierarchy HookID="int" Name="string"><br />
<Export/> <!-- can have 0 or more Exports, defined later in file --><br />
<Translation/> <!-- Optional --><br />
<Rotation/> <!-- Optional --> <br />
<NodeMesh/> <!-- Optional --><br />
<!-- can have 0 or more of the following (including duplicates apparently) --><br />
<Node/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodePointLight/><br />
</NodeCrustHierarchy><br />
<br />
<Rotation> <br />
data <!-- data is a Quaternionf and represents the relative rotation from its parent or the world axis if it has no parent--><br />
</Rotation><br />
<br />
<Export ControllerType="string" ExportName="?string?" TagName="string"/><br />
<!-- Optional Attribute: MaterialColor="List4:decimal" -- String with four values - RGBA --><br />
<!-- An export is what is used to connect nodes from an animation file to nodes in a model file. The key frames in an animation file affect the translations/rotations of the nodes with the corresponding exports of the same name. --><br />
<br />
<BoundingBox><br />
data <!-- data is Vector4f min, Vector4f max (ie: f f f f f f f f --><br />
</BoundingBox><br />
<br />
<Translation><br />
<!-- Optional Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal"-- Three numbers separated by spaces <br />
--><br />
data <!-- This is a vector4 representing the difference in position from its parent, or the origin if it has no parent --><br />
</Translation><br />
<br />
<CollisionObject><br />
<!-- Optional Attributes:<br />
Kinematic="boolean"<br />
Static="boolean"<br />
--><br />
<!-- can have 1 or more Shapes --><br />
<Shape><br />
<!-- Attributes:<br />
AllowEmitterSpawn="int"<br />
Fadeable="boolean"<br />
Name="string"<br />
Position --Vector4f but no required type??<br />
Rotation --Quaternionf but no required type??<br />
Type="string"<br />
--><br />
<!-- Optional Attributes:<br />
DimX="decimal"<br />
DimY="double" -- why double when other dims are decimal???<br />
DimZ="decimal"<br />
GROUP_MASK_CREATURES="boolean"<br />
GROUP_MASK_ITEMS="boolean"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
GROUP_MASK_PLACEABLES="boolean"<br />
GROUP_MASK_STATICGEOMETRY="boolean"<br />
GROUP_MASK_TERRAIN_WALL="boolean"<br />
GROUP_MASK_TRIGGERS="boolean"<br />
GROUP_MASK_WALKABLE="boolean"<br />
Height="double"<br />
Radius="decimal"<br />
--><br />
<!-- VertexData and IndexData are optional, however you must have both or neither. Can have more than one pair??? --><br />
<VertexData length="int"> <!-- I assume length is the number of verts or possibly the number of values given in data --><br />
data <!-- I assume this is a list of vert coords given in a list form (ie: x1,y1,z1,x2,y2,z2,...,xn,yn,zn maybe without commas) --><br />
</VertexData><br />
<IndexData> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
data <!-- maybe its vertex indicies for triangles? --><br />
</IndexData><br />
</Shape><br />
</CollisionObject><br />
<br />
<NodePointLight Color="list4:decimal" IsStatic="int" Name="string" Radius="decimal"> <!-- Color: string of four numbers, separated by spaces. --><br />
<!-- Optional Attributes:<br />
AffectsDomain="int" -- A search through the existing files has this as either "1" or "2", no other values. <br />
I don't know what these domains represent.<br />
IntensityPeriod="decimal"<br />
IntensityPeriodDelta="decimal"<br />
IntensityVariation="decimal"<br />
UseVariationTint="int"-- true/false, I believe <br />
--><br />
<!-- must have at least 1 of the following, can have more including duplicates apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
</NodePointLight><br />
<br />
<NodeWeapontrail Duration="decimal" MaterialObject="string" Name="string" SegmentLength="decimal"><br />
<!-- All MaterialObjects appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<Translation/><br />
<Rotation/><br />
</NodeWeaponTrail><br />
<br />
<Attribute AttributeName="string" SourceName="string"><br />
<!-- AttributeName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<!-- SourceName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</Attribute> <br />
<br />
<NodeUsePoint Name="string" Type="string"><br />
<!-- All Name values seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<!-- Type values: "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front <br />
and back, a few have all four types of nodeusepoint. --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
<NodeCrustHierarchy/> <!-- Optional --><br />
</NodeUsePoint><br />
<br />
<!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, <br />
and tools_bulb_ambient.mmh.xml. <br />
<br />
I would assume this type of node is used for calculating ambient light/shadows maybe like a radiosity pass or something.<br />
Might make some interesting lighting changes if you fiddle with it but be careful! might break your lighting --><br />
<NodeAmbientLight Color="List4:decimal" Name="string" Radius="double"> <br />
<!-- Color: string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, <br />
"0.498039 0.498039 0.498039 1.0" for the two tools <br />
Name: "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. <br />
Radius: 5.0 for the three lightrigs, "1e+007" (10000000?? big big radius!) for the two tools --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
</NodeAmbientLight><br />
<br />
<NodeEmitter> <!-- has a shit ton of attributes, all of which seem to pertain to particle emitter parameters (makes sense) --><br />
<!-- Attributes:<br />
Acceleration="decimal"<br />
Birthrate="decimal"<br />
BirthrateInParticlesPerMeter="int"<br />
BirthrateRange="decimal"<br />
EmitterType="string"<br />
EnableParticleCollisions="int" -- true/false ??<br />
GravityMultiplier="decimal"<br />
IneritVelocityInsteadOfPosition="int" -- true/false ??<br />
InitialRotationSpeedRange="decimal"<br />
InitialSpeed="decimal"<br />
InitialSpeedRange="decimal"<br />
Life="decimal"<br />
LinkParticlesTogether="int" -- true/false ??<br />
MaterialLibrary="string"<br />
MaterialObject="?string?"<br />
MovementSpread="List2:float" -- Two floating point values, representing movementspread X and movementspread Y <br />
Name="?string?" <br />
OrientationBehaviour="string"<br />
ParticleInheritance="string"<br />
ParticlesAffectedByWind="int" -- true/false ??<br />
ParticlesFollowPath="int" -- true/false ??<br />
RotationalAcceleration="decimal"<br />
ScaleRange="decimal"<br />
SpawnSpread="List2:float" -- Two floating point values, representing spawnspread X and spawnspread Y<br />
UpdateOnlyWhenVisible="int" -- true/false ??<br />
--> <br />
<!-- Optional Attributes:<br />
AgeMapColorMultiplier="List4:decimal"- - string of four numbers, separated by spaces.<br />
AgeMapScaleXMultiplier="decimal"<br />
AgeMapScaleYMultiplier="decimal"<br />
Bounciness="decimal"<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="int" -- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; <br />
if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1;<br />
if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;<br />
FramesPerSecond="decimal"<br />
InitialRotation="decimal"<br />
InitialRotationRange="decimal"<br />
InitialRotationSpeed="decimal"<br />
InvMovementSpreadUpdateDelay="decimal"<br />
KillParticleWhenTargetHit="int" -- true/false ??<br />
LOD="int" -- true/false maybe?? might be an index/identifier<br />
LifeRange="decimal"<br />
MeshParticleModel="?string?"<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces <br />
MovementSpreadUpdateDelay="decimal"<br />
ObjectSpaceAcceleration="int"<br />
PhysicsEmitter="int" -- true/false ??<br />
PhysicsObjectSpawn="int -- true/false ??<br />
RandomInitialRotation="int" -- true/false ??<br />
RandomStartFrame="int" --true/false ??<br />
SpawnDirectionTracksTarget="int" -- true/false ??<br />
SplatEmitter="int" -- true/false ?? might be index of a SplatEmitter if they exist<br />
TargetAttraction="decimal"><br />
TargetName="?string?" <br />
TargetRadius="decimal"<br />
UVDistributionSize="int"><br />
UseVariationTint="int" -- true/false ??<br />
UserParamName="??????" -- (datatype=ECString) << What is this?? -- ECString, not sure if there's any special formatting here <br />
VertexFormat="string" -- are there VertexFormats defined somewhere?><br />
WorldAxisAcceleration="List3:decimal" -- Three numbers separated by spaces <br />
--><br />
<!-- Requires 1 or more of the following, duplicates allowed apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
<EmitterAttachments><br />
<!-- Optional EmitterAttachments Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
--><br />
<EmitterAttachment Type="string"/><br />
<!-- Optional EmitterAttachment Attributes:<br />
Name="string"<br />
SpawnOnSurface="int" -- true/false ??<br />
UseNormalForVelocity="int" -- true/false ??<br />
--><br />
</EmitterAttachments><br />
<SpawnVolume InvertSpawnVolumeNormals="int" SpawnWithinVolume="int" > <!-- both look to be true/false values --><br />
<!-- Optional SpawnVolume Attributes:<br />
Axis="??????" -- no data type specified, assuming 3 numbers<br />
Length="decimal"<br />
MaxCorner="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
MinCorner="List3:decimal" -- Three numbers separated by spaces<br />
Radius="decimal"<br />
SpanwVolumeType="string" -- are there SpawnVolumeTypes defined somewhere???<br />
UseVolumeNormalsForDirection="int" -- true/false ??<br />
--><br />
<Data/><!-- 0 or more of these --><br />
</SpawnVolumn><br />
<SplatParticle> <!-- Optional - Not included in the 1 or more --><br />
<!-- SplatParticle Attributes:<br />
Height="decimal"<br />
Lifespan="int"<br />
MaterialObject="string"<br />
NumSamplesH="int"<br />
NumSamplesW="int"<br />
OrientationRangeRadians="int"<br />
Width="decimal"<br />
--><br />
<!-- Optional SplatParticle Attributes:<br />
AgeMapColorMultiplier="List4:decimal" -- four numbers separated by spaces<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="string" -- apparently not same as above in NodeEmitter<br />
FramesPerSecond="int"<br />
HoldLastFrame="int" -- true/false ??<br />
RandomStartFrame="int" -- true/false ??<br />
--><br />
<Export/> <!-- Optional --><br />
<AgeMap/><br />
</SplatParticle><br />
<AgeMap/> <!-- Not Optional - Required - Not included in the 1 or more --><br />
</NodeEmitter><br />
<br />
<Data Semantic="string"><br />
<!-- Optional Attributes:<br />
ElementCount="int"<br />
IndexCount="int"<br />
IndexType="string"<br />
Type="string"<br />
--><br />
data<br />
</Data><br />
<br />
<NodeEmitterGroup MaterialObject="string" Name="?string?"> <br />
<Translation/><br />
<Rotation/><br />
<NodeEmitter/> <!-- 0 or more of these --><br />
</NodeEmitterGroup><br />
<br />
<NodeEmitterTarget Name="string"><br />
<Translation/><br />
<Rotation/><br />
<Export/> <!-- 0 or more exports --><br />
</NodeEmitterTarget><br />
<br />
<NodeLightProbe Name="string"><br />
<Translation/><br />
<Rotation/><br />
<!-- following are optional elements, they are paired, can't have one without the other --><br />
<ReflectionMap ResName="string" /><br />
<IrradianceMap ResName="string" /><br />
</NodeLightProbe><br />
<br />
<AgeMap Count="int"><br />
<!-- contains one or more AgeMapElements --><br />
<AgeMapElement Alpha="decimal" Color="List4:decimal" PercentLifeElapsed="decimal" XScale="decimal" YScale="decimal" /><br />
<!-- Optional AgeMapElement Attributes: RotationSpeedMultiplier="decimal" --><br />
</AgeMap><br />
</pre><br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=MMH&diff=15739MMH2011-02-13T08:23:09Z<p>Eshme: /* Example .MMH.XML file */</p>
<hr />
<div>'''MMH''' ("Model Mesh Heirarchy") files are used to describe a wide variety of physical objects that appear in Dragon Age levels. It includes props, visual effects, creature models, weapon models, and so forth.<br />
<br />
MMH files are defined by XML files named with the .mmh.xml extension. BioWare generated these XML files using 3DSMax plugins that have some legal encumberances preventing their distribution, but the specifications for .mmh.xml will be released and it is hoped that converters will be able to be written for other file formats. See [[3rd_party_extensions]] for custom model export and import tools.<br />
<br />
The XML file is then run through the GraphicsProcessorMMH.exe program (found in the Dragon Age\Toolset\export_processors directory) to produce a binary file that is used by the game. The game can actually use the XML file directly, but this has poor performance (it runs it through GraphicsProcessorMMH every time the object is loaded) and should only be used for testing purposes.<br />
<br />
:GraphicsProcessorMMH [-outdir <out-dir>] [-platform <x360,pc,ps3>] [options] [-indir<input-directory> / <input-file>]<br />
<br />
Other options include:<br />
<br />
:-byteswapgff{{undocumented}}<!-- ask Graham Wihlidal about these --><br />
<br />
This is the command line you'll typically need:<br />
<br />
:GraphicsProcessorMMH -outdir %ls -platform pc %ls.mmh.xml<br />
<br />
MMH files reference [[MSH]] (mesh) files to define the actual triangles and vertexes used in models.<br />
<br />
== mmh.xml schema ==<br />
<br />
Joint types:<br />
*Cylindrical<br />
*6DOF<br />
*Distance<br />
*Fixed<br />
*PointInPlane<br />
*PointOnLine<br />
*Prismatic<br />
*Pulley<br />
*Revolute<br />
*Spherical<br />
<br />
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format. For a free converter/verifier, see [http://code.google.com/p/jing-trang/].<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><br />
<start><br />
<element name="ModelHierarchy"><br />
<optional><br />
<attribute name="FXActorName"><br />
<data type="NCName"/> <!-- An FXA file name --><br />
</attribute><br />
</optional><br />
<attribute name="ModelDataName"><br />
<data type="NCName"/> <!-- an MSH file name --><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/> <!-- An MMH file name --><br />
</attribute><br />
<optional><br />
<attribute name="PreSimulateTime"><br />
<data type="decimal"/> <!-- emitter presimulation time --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReferencedMeshes"/> <!-- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some have one or more .msh files named with spaces separating them. For example: ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh". Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.--><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialAlpha"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialDecalName"><br />
<data type="NCName"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialFresnelFalloff"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialInvertFresnel"><br />
<data type="integer"/> <!-- if UseRemoteMaterial is true. A true/false value --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialTintColor"/> <!-- if UseRemoteMaterial is true. Four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="UseRemoteMaterial"><br />
<data type="integer"/> <!-- a true/false value --><br />
</attribute><br />
</optional><br />
<choice><br />
<ref name="MeshHierarchy"/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<ref name="Node"/><br />
<ref name="NodeMesh"/><br />
</choice><br />
</element><br />
</start><br />
<define name="NodeMesh"><br />
<element name="NodeMesh"><br />
<optional><br />
<attribute name="BonesUsed"/> <!-- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, helmets, hair, eyes, etc. all have bonesused. --><br />
</optional><br />
<optional><br />
<attribute name="CastBakedShadow"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CastRuntimeShadow"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CutAway"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ID"><br />
<data type="NCName"/> <!-- A short string that always seems to be "_" followed by two or three random-looking numbers and letters --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IsVFXMesh"> <!-- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<optional><br />
<attribute name="MaterialLibrary"> <!-- Strings like "CAI_Floor03.mao" and "CavesInterior.mal" - mao and mal are material editor file types --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialObject"> <!-- Some boots had things like "pn_boo_hvyd_l3" here, a piece of corridor named fca_corridor01_0 had separate nodemeshes with both "fca_master" and "BLK_Master". I think this is referring to material libraries create by the material editor --><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshGroupName"> <!-- A lot of very generic-sounding names like "Box23" and "Object9331", mixed with a few more meaningful names like "MshMain_CAV_CaiPlatform03_0" --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshName"> <!-- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility) --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="PunchThrough"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveBakedShadow"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveRuntimeShadow"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveShadow"> <!-- I didn't find this referenced in the source code - deprecated, perhaps? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ShadowCasting"> <!-- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Attribute"/><br />
<ref name="BoundingBox"/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> I believe this is the two corners (min and max) of the bounding box. --><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="Scale"><br />
<data type="decimal"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="Node"><br />
<element name="Node"><br />
<optional><br />
<attribute name="BoneIndex"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="SoundMaterialType"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="BoundingBox"/><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodeLightProbe"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeUsePoint"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="NodeCloth"><br />
<attribute name="AttachmentResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="AttachmentTearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BendingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="CF_BENDING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_BENDING_ORTHO"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COLLISION_TWOWAY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COMDAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DISABLE_COLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_GRAVITY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_HARDWARE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_PRESSURE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_SELFCOLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_STATIC"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_TEARABLE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_VISUALIZATION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CollisionResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="DampingCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Density"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="Friction"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<attribute name="GustingDirectionAxisRatio"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="GustingDirectionChange"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ID"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MeshGroupName"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Pressure"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SleepLinearVelocity"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SolverIterations"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="SpeedTreeWindDirection"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindParams"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindUpdateTime"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="StretchingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="TearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Thickness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WakeUpCounter"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindDirection"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="WindEnabled"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="WindResponse"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindResponseLimit"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindSpace"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="WindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Attribute"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<element name="ClothAttachments"><br />
<element name="ClothAttachment"><br />
<attribute name="TearableAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="TwoWayAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</element><br />
<element name="MeshGroup"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<oneOrMore><br />
<ref name="Data"/><br />
</oneOrMore><br />
</element><br />
</element><br />
<element name="NodeSnaptoPoint"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeAmbientLight"/><br />
</optional><br />
</element><br />
</define><br />
<define name="MeshHierarchy"> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<element name="MeshHierarchy"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<ref name="BoundingBox"/><br />
<oneOrMore><br />
<choice><br />
<ref name="MeshHierarchy"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</optional><br />
<choice><br />
<ref name="NodeLightProbe"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="NodeCrustHierarchy"><br />
<element name="NodeCrustHierarchy"><br />
<attribute name="HookID"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<optional><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Node"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodePointLight"/><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeMesh"/><br />
</optional><br />
</element><br />
</define><br />
<define name="Export"><br />
<element name="Export"><br />
<attribute name="ControllerType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ExportName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<attribute name="TagName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</define><br />
<define name="BoundingBox"><br />
<element name="BoundingBox"> <!-- Vector4f min, Vector4f max --><br />
<text/><br />
</element><br />
</define><br />
<define name="Translation"><br />
<element name="Translation"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="Rotation"><br />
<element name="Rotation"> <!-- Quaternionf --><br />
<text/><br />
</element><br />
</define><br />
<define name="CollisionObject"><br />
<element name="CollisionObject"><br />
<optional><br />
<attribute name="Kinematic"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Static"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<element name="Shape"><br />
<attribute name="AllowEmitterSpawn"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="DimX"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimY"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimZ"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_CREATURES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_ITEMS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_PLACEABLES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TERRAIN_WALL"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TRIGGERS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_WALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Height"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Position"/> <!-- Vector4f --><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Rotation"/> <!-- Quaternionf --><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<element name="VertexData"><br />
<attribute name="length"><br />
<data type="integer"/><br />
</attribute><br />
<text/><br />
</element><br />
<element name="IndexData"> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
<text/><br />
</element><br />
</optional><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodePointLight"><br />
<element name="NodePointLight"><br />
<optional><br />
<attribute name="AffectsDomain"> <!-- A search through the existing files has this as either "1" or "2", no other values. I don't know what these domains represent. --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. --><br />
<optional><br />
<attribute name="IntensityPeriod"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityPeriodDelta"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityVariation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="IsStatic"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"> <!-- true/false, I believe --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodeWeapontrail"><br />
<element name="NodeWeapontrail"><br />
<attribute name="Duration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="MaterialObject"> <!-- All appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SegmentLength"><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="Attribute"><br />
<element name="Attribute"><br />
<attribute name="AttributeName"> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SourceName"><br />
<data type="NCName"/> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</attribute><br />
</element><br />
</define><br />
<define name="NodeUsePoint"><br />
<element name="NodeUsePoint"><br />
<attribute name="Name"> <!-- All seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Type"> <!-- "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front and back, a few have all four types of nodeusepoint. --><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<ref name="NodeCrustHierarchy"/><br />
</optional><br />
</element><br />
</define><br />
<define name="NodeAmbientLight"><br />
<element name="NodeAmbientLight"> <!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, and tools_bulb_ambient.mmh.xml. --><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, "0.498039 0.498039 0.498039 1.0" for the two tools --><br />
<attribute name="Name"><!-- "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"> <!-- 5.0 for the three lightrigs, "1e+007" for the two tools --><br />
<data type="double"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="NodeEmitter"><br />
<element name="NodeEmitter"><br />
<attribute name="Acceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- string of four numbers, separated by spaces. --><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleXMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleYMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Birthrate"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BirthrateInParticlesPerMeter"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="BirthrateRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="Bounciness"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="EmitterType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="EnableParticleCollisions"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"/> <!-- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1; if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;--><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="GravityMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InheritVelocityInsteadOfPosition"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="InitialRotation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="InitialRotationRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="InitialRotationSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialRotationSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="InvMovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="KillParticleWhenTargetHit"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="LOD"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Life"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="LifeRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="LinkParticlesTogether"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MeshParticleModel"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<attribute name="MovementSpread"/> <!-- Two floating point values, representing movementspread X and movementspread Y --><br />
<optional><br />
<attribute name="MovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="ObjectSpaceAcceleration"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="OrientationBehaviour"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticleInheritance"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticlesAffectedByWind"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="ParticlesFollowPath"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="PhysicsEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="PhysicsObjectSpawn"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomInitialRotation"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="RotationalAcceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ScaleRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="SpawnDirectionTracksTarget"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnSpread"/> <!-- Two floating point values, representing spawnspread X and spawnspread Y --><br />
<optional><br />
<attribute name="SplatEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetAttraction"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetRadius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UVDistributionSize"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="UpdateOnlyWhenVisible"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UserParamName"/> <!-- ECString, not sure if there's any special formatting here --><br />
</optional><br />
<optional><br />
<attribute name="VertexFormat"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="WorldAxisAcceleration"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="EmitterAttachments"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<element name="EmitterAttachment"><br />
<optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnOnSurface"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="UseNormalForVelocity"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
</element><br />
</element><br />
<element name="SpawnVolume"><br />
<optional><br />
<attribute name="Axis"/><br />
</optional><br />
<attribute name="InvertSpawnVolumeNormals"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="Length"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaxCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MinCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnVolumeType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnWithinVolume"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVolumeNormalsForDirection"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<ref name="Data"/><br />
</zeroOrMore><br />
</element><br />
</choice><br />
</oneOrMore><br />
<optional><br />
<element name="SplatParticle"><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Height"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="HoldLastFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Lifespan"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="NumSamplesH"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="NumSamplesW"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="OrientationRangeRadians"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Width"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<ref name="Export"/><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</define><br />
<define name="Data"><br />
<element name="Data"><br />
<optional><br />
<attribute name="ElementCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Semantic"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="NodeEmitterGroup"><br />
<element name="NodeEmitterGroup"><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeEmitterTarget"><br />
<element name="NodeEmitterTarget"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeLightProbe"><br />
<element name="NodeLightProbe"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<element name="ReflectionMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
<element name="IrradianceMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</optional><br />
</element><br />
</define><br />
<define name="AgeMap"><br />
<element name="AgeMap"><br />
<attribute name="Count"><br />
<data type="integer"/><br />
</attribute><br />
<oneOrMore><br />
<element name="AgeMapElement"><br />
<attribute name="Alpha"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Color"/><br />
<attribute name="PercentLifeElapsed"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="RotationSpeedMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="XScale"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="YScale"><br />
<data type="decimal"/><br />
</attribute><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
</grammar><br />
</pre><br />
<br />
<br />
== Example .MMH.XML file ==<br />
<pre><br />
<!-- A note on value types:<br />
List#:type -- means # amount of values of specified type with spaces in between<br />
<br />
string -- a series of characters, digits and underscores, can not start with a colon, no spaces<br />
?string? -- same as above except can start with a colon<br />
int -- an integer (whole number)<br />
decimal -- any number including one with digits appearing after a decimal point, <br />
all decimals MUST have a decimal point even if there are no digits after it (ie 1. not 1, or 0.0)<br />
--><br />
<br />
<ModelHierarchy ModelDataName="string" Name="string"><br />
<!-- Optional Attributes:<br />
FXActorName="string" -- An FXA file name <br />
PreSimulateTime="decimal" -- emitter presimulation time<br />
ReferencedMeshes="List:string" -- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some <br />
have one or more .msh files named with spaces separating them. For example: <br />
ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh"<br />
Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.<br />
RemoteMaterialAlpha="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialDecalName="string" -- if UseRemoteMaterial is true <br />
RemoteMaterialFresnelFalloff="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialInvertFresnel="int" -- if UseRemoteMaterial is true. A true/false value <br />
RemoteMaterialTintColor="List4:decimal"-- if UseRemoteMaterial is true. Four numbers separated by spaces <br />
UseRemoteMaterial="int" -- a true/false value <br />
--><br />
<!-- 1 of (defined below): --><br />
<MeshHierarchy/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<Node/><br />
<NodeMesh/> <br />
</ModelHierarchy><br />
<br />
<NodeMesh><br />
<!-- Optional Attributes:<br />
BonesUsed="List:int" -- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, <br />
helmets, hair, eyes, etc. all have bonesused. <br />
CastBakedShadow="int" -- true/false value <br />
CastRuntimeShadow="int" -- true/false value<br />
CutAway="int" -- true/false value (Cut Away enables Fading out on Isometric view in Dragon Age)<br />
ID="string" -- A short and unique string. It is unique across every mesh used in whole Dragon Age. Used by lightmapper to reference the mesh<br />
IsVFXMesh="int" -- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter<br />
MaterialColor="List4:decimal" -- String with four values - RGBA<br />
MaterialLibrary="string" -- Strings like "CavesInterior" - reference to MAL files, MAL are material editor file types. (may not actually be useful in the game)<br />
MaterialObject="?string?" -- Strings like "pn_boo_hvyd_l3" here, this is referring to material object (MAO files) create by the material editor <br />
MeshGroupName=string"> -- The Meshes Name, used to reference the meshchunk name in the MSH <br />
MeshName="string" -- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility)<br />
Name="string" -- name of the node<br />
PunchThrough="int" -- true/false value<br />
ReceiveBakedShadow="int" -- true/false value <br />
ReceiveRuntimeShadow="int" -- true/false value <br />
<<UNKNOWN>> ReceiveShadow="int" -- I didn't find this referenced in the source code - deprecated, perhaps? <br />
ShadowCasting="int" -- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms?<br />
UseVariationTint="int" -- true/false value<br />
--><br />
<!-- 0 or more of the following items come next, definitions follow later --><br />
<Attribute/><br />
<BoundingBox/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> <br />
I believe this is the two corners (min and max) of the bounding box. --><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeMesh/> <!-- appears to be able to handle a nodemesh within a nodemesh :O --><br />
<NodePointLight/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<Scale>"decimal"</Scale> <br />
<!-- I am assuming next bit means no more than one of the following (could be none): <br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
--><br />
<NodeAmbientLight/><br />
<NodeUsePoint/><br />
<NodeEmitter/><br />
</NodeMesh><br />
<br />
<Node Name="?string?"><br />
<!-- Optional Attributes:<br />
BoneIndex="int" ---- possibly the bone to which this node is attached to, not included if not attached to a bone?<br />
SoundMaterialType="int" ---- are there SoundMaterialType definitions somewhere? if so I guess this is the index of one<br />
--><br />
<!-- can have 0 or more of the following(including duplicates), however I assume having more than one of the same type<br />
would cause the compiler to go wtf? in some cases (like bounding box or translation). Definitions follow later in file<br />
--><br />
<BoundingBox/><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodeLightProbe/><br />
<NodeMesh/><br />
<NodePointLight/><br />
<NodeUsePoint/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<NodeCloth> <!-- has a shit load of attributes with no comments however I assume they all have to do with cloth simulation paramaters --><br />
<!-- NodeCloth Attributes:<br />
AttachmentResponseCoefficient="decimal" <br />
AttachmentTearFactor="decimal" <br />
BendingStiffness="decimal" <br />
CF_BENDING="int"<br />
CF_BENDING_ORTHO="int"<br />
CF_COLLISION_TWOWAY="int"<br />
CF_COMDAMPING="int"<br />
CF_DAMPING="int"<br />
CF_DISABLE_COLLISION="int"<br />
CF_GRAVITY="int"<br />
CF_HARDWARE="int"<br />
CF_PRESSURE="int"<br />
CF_SELFCOLLISION="int"<br />
CF_STATIC="int"<br />
CF_TEARABLE="int"<br />
CF_VISUALIZATION="int"<br />
CollisionResponseCoefficient="decimal"<br />
DampingCoefficient="decimal"<br />
Density="decimal"<br />
Fadeable="boolean"<br />
Friction="decimal"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
ID="string"<br />
MaterialLibrary="string"<br />
MaterialObject="string"<br />
MeshGroupName="string"<br />
Name="string"<br />
Pressure="decimal"<br />
SleepLinearVelocity="decimal"<br />
SolverIterations="int"<br />
StretchingStiffness="decimal"<br />
TearFactor="decimal"<br />
Thickness="decimal"<br />
WakeUpCounter="decimal"<br />
--><br />
<!-- Optional Attributes: GROUP_MASK_STATICGEOMETRY="boolean" --><br />
<Attribute/><br />
<Export/> <!-- can have 0 or more Exports --><br />
<Translation/><br />
<Rotation/><br />
<ClothAttachments><br />
<ClothAttachment TearableAttachment="int" TwoWayAttachment="int" Type="string"><br />
</ClothAttachment><br />
</ClothAttachments><br />
<MeshGroup Name="string"> <!-- contains 1 or more Data elements, defined later in file --><br />
<Data/> <br />
</MeshGroup><br />
</NodeCloth><br />
<NodeSnaptoPoint Name="string"><br />
<!-- can have 0 or more Exports --><br />
<Export/><br />
<!-- can have 0 or more of the following, defined later in file --><br />
<Translation/><br />
<Rotation/><br />
</NodeSnapToPoint><br />
<NodeAmbientLight/> <!-- Optional Element defined later in file--> <br />
</Node><br />
<br />
<!-- <<<WARNING: PROBABLY NOT A GOOD IDEA TO USE THIS ONE!!!>>> --><br />
<!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<!-- IE it is a REALLY old version of NodeMesh --><br />
<MeshHierarchy Name="string"> <br />
<BoundingBox/> <!-- Optional --><br />
<!-- These are Optional and apparently can have more than one if you want, defined lated in file --><br />
<MeshHierarchy/><br />
<Rotation/><br />
<Translation/><br />
<!-- can have either a NodeLightProbe or 0 or more NodeEmitters --><br />
<NodeLightProbe/><br />
<NodeEmitter/><br />
</MeshHierarchy><br />
<br />
<NodeCrustHierarchy HookID="int" Name="string"><br />
<Export/> <!-- can have 0 or more Exports, defined later in file --><br />
<Translation/> <!-- Optional --><br />
<Rotation/> <!-- Optional --> <br />
<NodeMesh/> <!-- Optional --><br />
<!-- can have 0 or more of the following (including duplicates apparently) --><br />
<Node/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodePointLight/><br />
</NodeCrustHierarchy><br />
<br />
<Rotation> <br />
data <!-- data is a Quaternionf and represents the relative rotation from its parent or the world axis if it has no parent--><br />
</Rotation><br />
<br />
<Export ControllerType="string" ExportName="?string?" TagName="string"/><br />
<!-- Optional Attribute: MaterialColor="List4:decimal" -- String with four values - RGBA --><br />
<!-- An export is what is used to connect nodes from an animation file to nodes in a model file. The key frames in an animation file affect the translations/rotations of the nodes with the corresponding exports of the same name. --><br />
<br />
<BoundingBox><br />
data <!-- data is Vector4f min, Vector4f max (ie: f f f f f f f f --><br />
</BoundingBox><br />
<br />
<Translation><br />
<!-- Optional Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal"-- Three numbers separated by spaces <br />
--><br />
data <!-- This is a vector4 representing the difference in position from its parent, or the origin if it has no parent --><br />
</Translation><br />
<br />
<CollisionObject><br />
<!-- Optional Attributes:<br />
Kinematic="boolean"<br />
Static="boolean"<br />
--><br />
<!-- can have 1 or more Shapes --><br />
<Shape><br />
<!-- Attributes:<br />
AllowEmitterSpawn="int"<br />
Fadeable="boolean"<br />
Name="string"<br />
Position --Vector4f but no required type??<br />
Rotation --Quaternionf but no required type??<br />
Type="string"<br />
--><br />
<!-- Optional Attributes:<br />
DimX="decimal"<br />
DimY="double" -- why double when other dims are decimal???<br />
DimZ="decimal"<br />
GROUP_MASK_CREATURES="boolean"<br />
GROUP_MASK_ITEMS="boolean"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
GROUP_MASK_PLACEABLES="boolean"<br />
GROUP_MASK_STATICGEOMETRY="boolean"<br />
GROUP_MASK_TERRAIN_WALL="boolean"<br />
GROUP_MASK_TRIGGERS="boolean"<br />
GROUP_MASK_WALKABLE="boolean"<br />
Height="double"<br />
Radius="decimal"<br />
--><br />
<!-- VertexData and IndexData are optional, however you must have both or neither. Can have more than one pair??? --><br />
<VertexData length="int"> <!-- I assume length is the number of verts or possibly the number of values given in data --><br />
data <!-- I assume this is a list of vert coords given in a list form (ie: x1,y1,z1,x2,y2,z2,...,xn,yn,zn maybe without commas) --><br />
</VertexData><br />
<IndexData> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
data <!-- maybe its vertex indicies for triangles? --><br />
</IndexData><br />
</Shape><br />
</CollisionObject><br />
<br />
<NodePointLight Color="list4:decimal" IsStatic="int" Name="string" Radius="decimal"> <!-- Color: string of four numbers, separated by spaces. --><br />
<!-- Optional Attributes:<br />
AffectsDomain="int" -- A search through the existing files has this as either "1" or "2", no other values. <br />
I don't know what these domains represent.<br />
IntensityPeriod="decimal"<br />
IntensityPeriodDelta="decimal"<br />
IntensityVariation="decimal"<br />
UseVariationTint="int"-- true/false, I believe <br />
--><br />
<!-- must have at least 1 of the following, can have more including duplicates apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
</NodePointLight><br />
<br />
<NodeWeapontrail Duration="decimal" MaterialObject="string" Name="string" SegmentLength="decimal"><br />
<!-- All MaterialObjects appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<Translation/><br />
<Rotation/><br />
</NodeWeaponTrail><br />
<br />
<Attribute AttributeName="string" SourceName="string"><br />
<!-- AttributeName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<!-- SourceName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</Attribute> <br />
<br />
<NodeUsePoint Name="string" Type="string"><br />
<!-- All Name values seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<!-- Type values: "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front <br />
and back, a few have all four types of nodeusepoint. --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
<NodeCrustHierarchy/> <!-- Optional --><br />
</NodeUsePoint><br />
<br />
<!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, <br />
and tools_bulb_ambient.mmh.xml. <br />
<br />
I would assume this type of node is used for calculating ambient light/shadows maybe like a radiosity pass or something.<br />
Might make some interesting lighting changes if you fiddle with it but be careful! might break your lighting --><br />
<NodeAmbientLight Color="List4:decimal" Name="string" Radius="double"> <br />
<!-- Color: string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, <br />
"0.498039 0.498039 0.498039 1.0" for the two tools <br />
Name: "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. <br />
Radius: 5.0 for the three lightrigs, "1e+007" (10000000?? big big radius!) for the two tools --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
</NodeAmbientLight><br />
<br />
<NodeEmitter> <!-- has a shit ton of attributes, all of which seem to pertain to particle emitter parameters (makes sense) --><br />
<!-- Attributes:<br />
Acceleration="decimal"<br />
Birthrate="decimal"<br />
BirthrateInParticlesPerMeter="int"<br />
BirthrateRange="decimal"<br />
EmitterType="string"<br />
EnableParticleCollisions="int" -- true/false ??<br />
GravityMultiplier="decimal"<br />
IneritVelocityInsteadOfPosition="int" -- true/false ??<br />
InitialRotationSpeedRange="decimal"<br />
InitialSpeed="decimal"<br />
InitialSpeedRange="decimal"<br />
Life="decimal"<br />
LinkParticlesTogether="int" -- true/false ??<br />
MaterialLibrary="string"<br />
MaterialObject="?string?"<br />
MovementSpread="List2:float" -- Two floating point values, representing movementspread X and movementspread Y <br />
Name="?string?" <br />
OrientationBehaviour="string"<br />
ParticleInheritance="string"<br />
ParticlesAffectedByWind="int" -- true/false ??<br />
ParticlesFollowPath="int" -- true/false ??<br />
RotationalAcceleration="decimal"<br />
ScaleRange="decimal"<br />
SpawnSpread="List2:float" -- Two floating point values, representing spawnspread X and spawnspread Y<br />
UpdateOnlyWhenVisible="int" -- true/false ??<br />
--> <br />
<!-- Optional Attributes:<br />
AgeMapColorMultiplier="List4:decimal"- - string of four numbers, separated by spaces.<br />
AgeMapScaleXMultiplier="decimal"<br />
AgeMapScaleYMultiplier="decimal"<br />
Bounciness="decimal"<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="int" -- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; <br />
if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1;<br />
if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;<br />
FramesPerSecond="decimal"<br />
InitialRotation="decimal"<br />
InitialRotationRange="decimal"<br />
InitialRotationSpeed="decimal"<br />
InvMovementSpreadUpdateDelay="decimal"<br />
KillParticleWhenTargetHit="int" -- true/false ??<br />
LOD="int" -- true/false maybe?? might be an index/identifier<br />
LifeRange="decimal"<br />
MeshParticleModel="?string?"<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces <br />
MovementSpreadUpdateDelay="decimal"<br />
ObjectSpaceAcceleration="int"<br />
PhysicsEmitter="int" -- true/false ??<br />
PhysicsObjectSpawn="int -- true/false ??<br />
RandomInitialRotation="int" -- true/false ??<br />
RandomStartFrame="int" --true/false ??<br />
SpawnDirectionTracksTarget="int" -- true/false ??<br />
SplatEmitter="int" -- true/false ?? might be index of a SplatEmitter if they exist<br />
TargetAttraction="decimal"><br />
TargetName="?string?" <br />
TargetRadius="decimal"<br />
UVDistributionSize="int"><br />
UseVariationTint="int" -- true/false ??<br />
UserParamName="??????" -- (datatype=ECString) << What is this?? -- ECString, not sure if there's any special formatting here <br />
VertexFormat="string" -- are there VertexFormats defined somewhere?><br />
WorldAxisAcceleration="List3:decimal" -- Three numbers separated by spaces <br />
--><br />
<!-- Requires 1 or more of the following, duplicates allowed apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
<EmitterAttachments><br />
<!-- Optional EmitterAttachments Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
--><br />
<EmitterAttachment Type="string"/><br />
<!-- Optional EmitterAttachment Attributes:<br />
Name="string"<br />
SpawnOnSurface="int" -- true/false ??<br />
UseNormalForVelocity="int" -- true/false ??<br />
--><br />
</EmitterAttachments><br />
<SpawnVolume InvertSpawnVolumeNormals="int" SpawnWithinVolume="int" > <!-- both look to be true/false values --><br />
<!-- Optional SpawnVolume Attributes:<br />
Axis="??????" -- no data type specified, assuming 3 numbers<br />
Length="decimal"<br />
MaxCorner="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
MinCorner="List3:decimal" -- Three numbers separated by spaces<br />
Radius="decimal"<br />
SpanwVolumeType="string" -- are there SpawnVolumeTypes defined somewhere???<br />
UseVolumeNormalsForDirection="int" -- true/false ??<br />
--><br />
<Data/><!-- 0 or more of these --><br />
</SpawnVolumn><br />
<SplatParticle> <!-- Optional - Not included in the 1 or more --><br />
<!-- SplatParticle Attributes:<br />
Height="decimal"<br />
Lifespan="int"<br />
MaterialObject="string"<br />
NumSamplesH="int"<br />
NumSamplesW="int"<br />
OrientationRangeRadians="int"<br />
Width="decimal"<br />
--><br />
<!-- Optional SplatParticle Attributes:<br />
AgeMapColorMultiplier="List4:decimal" -- four numbers separated by spaces<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="string" -- apparently not same as above in NodeEmitter<br />
FramesPerSecond="int"<br />
HoldLastFrame="int" -- true/false ??<br />
RandomStartFrame="int" -- true/false ??<br />
--><br />
<Export/> <!-- Optional --><br />
<AgeMap/><br />
</SplatParticle><br />
<AgeMap/> <!-- Not Optional - Required - Not included in the 1 or more --><br />
</NodeEmitter><br />
<br />
<Data Semantic="string"><br />
<!-- Optional Attributes:<br />
ElementCount="int"<br />
IndexCount="int"<br />
IndexType="string"<br />
Type="string"<br />
--><br />
data<br />
</Data><br />
<br />
<NodeEmitterGroup MaterialObject="string" Name="?string?"> <br />
<Translation/><br />
<Rotation/><br />
<NodeEmitter/> <!-- 0 or more of these --><br />
</NodeEmitterGroup><br />
<br />
<NodeEmitterTarget Name="string"><br />
<Translation/><br />
<Rotation/><br />
<Export/> <!-- 0 or more exports --><br />
</NodeEmitterTarget><br />
<br />
<NodeLightProbe Name="string"><br />
<Translation/><br />
<Rotation/><br />
<!-- following are optional elements, they are paired, can't have one without the other --><br />
<ReflectionMap ResName="string" /><br />
<IrradianceMap ResName="string" /><br />
</NodeLightProbe><br />
<br />
<AgeMap Count="int"><br />
<!-- contains one or more AgeMapElements --><br />
<AgeMapElement Alpha="decimal" Color="List4:decimal" PercentLifeElapsed="decimal" XScale="decimal" YScale="decimal" /><br />
<!-- Optional AgeMapElement Attributes: RotationSpeedMultiplier="decimal" --><br />
</AgeMap><br />
</pre><br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=MMH&diff=15738MMH2011-02-13T08:19:20Z<p>Eshme: /* Example .MMH.XML file */</p>
<hr />
<div>'''MMH''' ("Model Mesh Heirarchy") files are used to describe a wide variety of physical objects that appear in Dragon Age levels. It includes props, visual effects, creature models, weapon models, and so forth.<br />
<br />
MMH files are defined by XML files named with the .mmh.xml extension. BioWare generated these XML files using 3DSMax plugins that have some legal encumberances preventing their distribution, but the specifications for .mmh.xml will be released and it is hoped that converters will be able to be written for other file formats. See [[3rd_party_extensions]] for custom model export and import tools.<br />
<br />
The XML file is then run through the GraphicsProcessorMMH.exe program (found in the Dragon Age\Toolset\export_processors directory) to produce a binary file that is used by the game. The game can actually use the XML file directly, but this has poor performance (it runs it through GraphicsProcessorMMH every time the object is loaded) and should only be used for testing purposes.<br />
<br />
:GraphicsProcessorMMH [-outdir <out-dir>] [-platform <x360,pc,ps3>] [options] [-indir<input-directory> / <input-file>]<br />
<br />
Other options include:<br />
<br />
:-byteswapgff{{undocumented}}<!-- ask Graham Wihlidal about these --><br />
<br />
This is the command line you'll typically need:<br />
<br />
:GraphicsProcessorMMH -outdir %ls -platform pc %ls.mmh.xml<br />
<br />
MMH files reference [[MSH]] (mesh) files to define the actual triangles and vertexes used in models.<br />
<br />
== mmh.xml schema ==<br />
<br />
Joint types:<br />
*Cylindrical<br />
*6DOF<br />
*Distance<br />
*Fixed<br />
*PointInPlane<br />
*PointOnLine<br />
*Prismatic<br />
*Pulley<br />
*Revolute<br />
*Spherical<br />
<br />
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format. For a free converter/verifier, see [http://code.google.com/p/jing-trang/].<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><br />
<start><br />
<element name="ModelHierarchy"><br />
<optional><br />
<attribute name="FXActorName"><br />
<data type="NCName"/> <!-- An FXA file name --><br />
</attribute><br />
</optional><br />
<attribute name="ModelDataName"><br />
<data type="NCName"/> <!-- an MSH file name --><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/> <!-- An MMH file name --><br />
</attribute><br />
<optional><br />
<attribute name="PreSimulateTime"><br />
<data type="decimal"/> <!-- emitter presimulation time --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReferencedMeshes"/> <!-- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some have one or more .msh files named with spaces separating them. For example: ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh". Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.--><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialAlpha"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialDecalName"><br />
<data type="NCName"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialFresnelFalloff"><br />
<data type="decimal"/> <!-- if UseRemoteMaterial is true --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialInvertFresnel"><br />
<data type="integer"/> <!-- if UseRemoteMaterial is true. A true/false value --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RemoteMaterialTintColor"/> <!-- if UseRemoteMaterial is true. Four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="UseRemoteMaterial"><br />
<data type="integer"/> <!-- a true/false value --><br />
</attribute><br />
</optional><br />
<choice><br />
<ref name="MeshHierarchy"/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<ref name="Node"/><br />
<ref name="NodeMesh"/><br />
</choice><br />
</element><br />
</start><br />
<define name="NodeMesh"><br />
<element name="NodeMesh"><br />
<optional><br />
<attribute name="BonesUsed"/> <!-- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, helmets, hair, eyes, etc. all have bonesused. --><br />
</optional><br />
<optional><br />
<attribute name="CastBakedShadow"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CastRuntimeShadow"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="CutAway"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ID"><br />
<data type="NCName"/> <!-- A short string that always seems to be "_" followed by two or three random-looking numbers and letters --><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IsVFXMesh"> <!-- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<optional><br />
<attribute name="MaterialLibrary"> <!-- Strings like "CAI_Floor03.mao" and "CavesInterior.mal" - mao and mal are material editor file types --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaterialObject"> <!-- Some boots had things like "pn_boo_hvyd_l3" here, a piece of corridor named fca_corridor01_0 had separate nodemeshes with both "fca_master" and "BLK_Master". I think this is referring to material libraries create by the material editor --><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshGroupName"> <!-- A lot of very generic-sounding names like "Box23" and "Object9331", mixed with a few more meaningful names like "MshMain_CAV_CaiPlatform03_0" --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshName"> <!-- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility) --><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="PunchThrough"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveBakedShadow"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveRuntimeShadow"> <!-- appears to be a true/false value --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ReceiveShadow"> <!-- I didn't find this referenced in the source code - deprecated, perhaps? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="ShadowCasting"> <!-- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms? --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Attribute"/><br />
<ref name="BoundingBox"/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> I believe this is the two corners (min and max) of the bounding box. --><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="Scale"><br />
<data type="decimal"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="Node"><br />
<element name="Node"><br />
<optional><br />
<attribute name="BoneIndex"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="SoundMaterialType"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="BoundingBox"/><br />
<ref name="CollisionObject"/><br />
<ref name="Export"/><br />
<ref name="Node"/><br />
<ref name="NodeCrustHierarchy"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodeLightProbe"/><br />
<ref name="NodeMesh"/><br />
<ref name="NodePointLight"/><br />
<ref name="NodeUsePoint"/><br />
<ref name="NodeWeapontrail"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="NodeCloth"><br />
<attribute name="AttachmentResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="AttachmentTearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BendingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="CF_BENDING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_BENDING_ORTHO"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COLLISION_TWOWAY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_COMDAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DAMPING"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_DISABLE_COLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_GRAVITY"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_HARDWARE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_PRESSURE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_SELFCOLLISION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_STATIC"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_TEARABLE"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CF_VISUALIZATION"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="CollisionResponseCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="DampingCoefficient"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Density"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="Friction"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<attribute name="GustingDirectionAxisRatio"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="GustingDirectionChange"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMaxStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinDuration"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinInterval"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="GustingMinStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ID"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MeshGroupName"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Pressure"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SleepLinearVelocity"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="SolverIterations"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="SpeedTreeWindDirection"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindParams"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="SpeedTreeWindUpdateTime"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="StretchingStiffness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="TearFactor"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Thickness"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WakeUpCounter"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindDirection"/> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<attribute name="WindEnabled"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="boolean"/><br />
</attribute><br />
<attribute name="WindResponse"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindResponseLimit"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="WindSpace"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="WindStrength"> <!-- removed, no longer supported by resource exporter. see bug 114919 --><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Attribute"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<element name="ClothAttachments"><br />
<element name="ClothAttachment"><br />
<attribute name="TearableAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="TwoWayAttachment"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</element><br />
<element name="MeshGroup"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<oneOrMore><br />
<ref name="Data"/><br />
</oneOrMore><br />
</element><br />
</element><br />
<element name="NodeSnaptoPoint"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeAmbientLight"/><br />
</optional><br />
</element><br />
</define><br />
<define name="MeshHierarchy"> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<element name="MeshHierarchy"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<ref name="BoundingBox"/><br />
<oneOrMore><br />
<choice><br />
<ref name="MeshHierarchy"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</optional><br />
<choice><br />
<ref name="NodeLightProbe"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
</element><br />
</define><br />
<define name="NodeCrustHierarchy"><br />
<element name="NodeCrustHierarchy"><br />
<attribute name="HookID"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<optional><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</optional><br />
<zeroOrMore><br />
<choice><br />
<ref name="Node"/><br />
<ref name="NodeEmitter"/><br />
<ref name="NodeEmitterGroup"/><br />
<ref name="NodeEmitterTarget"/><br />
<ref name="NodePointLight"/><br />
</choice><br />
</zeroOrMore><br />
<optional><br />
<ref name="NodeMesh"/><br />
</optional><br />
</element><br />
</define><br />
<define name="Export"><br />
<element name="Export"><br />
<attribute name="ControllerType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ExportName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MaterialColor"/> <!-- String with four values - RGBA --><br />
</optional><br />
<attribute name="TagName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</define><br />
<define name="BoundingBox"><br />
<element name="BoundingBox"> <!-- Vector4f min, Vector4f max --><br />
<text/><br />
</element><br />
</define><br />
<define name="Translation"><br />
<element name="Translation"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="Rotation"><br />
<element name="Rotation"> <!-- Quaternionf --><br />
<text/><br />
</element><br />
</define><br />
<define name="CollisionObject"><br />
<element name="CollisionObject"><br />
<optional><br />
<attribute name="Kinematic"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Static"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<element name="Shape"><br />
<attribute name="AllowEmitterSpawn"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="DimX"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimY"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="DimZ"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Fadeable"><br />
<data type="boolean"/><br />
</attribute><br />
<optional><br />
<attribute name="GROUP_MASK_CREATURES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_ITEMS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_NONWALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_PLACEABLES"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_STATICGEOMETRY"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TERRAIN_WALL"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_TRIGGERS"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="GROUP_MASK_WALKABLE"><br />
<data type="boolean"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="Height"><br />
<data type="double"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Position"/> <!-- Vector4f --><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Rotation"/> <!-- Quaternionf --><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<element name="VertexData"><br />
<attribute name="length"><br />
<data type="integer"/><br />
</attribute><br />
<text/><br />
</element><br />
<element name="IndexData"> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
<text/><br />
</element><br />
</optional><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodePointLight"><br />
<element name="NodePointLight"><br />
<optional><br />
<attribute name="AffectsDomain"> <!-- A search through the existing files has this as either "1" or "2", no other values. I don't know what these domains represent. --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. --><br />
<optional><br />
<attribute name="IntensityPeriod"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityPeriodDelta"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IntensityVariation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="IsStatic"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"> <!-- true/false, I believe --><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
</choice><br />
</oneOrMore><br />
</element><br />
</define><br />
<define name="NodeWeapontrail"><br />
<element name="NodeWeapontrail"><br />
<attribute name="Duration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="MaterialObject"> <!-- All appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SegmentLength"><br />
<data type="decimal"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="Attribute"><br />
<element name="Attribute"><br />
<attribute name="AttributeName"> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SourceName"><br />
<data type="NCName"/> <!-- This attribute's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</attribute><br />
</element><br />
</define><br />
<define name="NodeUsePoint"><br />
<element name="NodeUsePoint"><br />
<attribute name="Name"> <!-- All seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Type"> <!-- "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front and back, a few have all four types of nodeusepoint. --><br />
<data type="NCName"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<ref name="NodeCrustHierarchy"/><br />
</optional><br />
</element><br />
</define><br />
<define name="NodeAmbientLight"><br />
<element name="NodeAmbientLight"> <!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, and tools_bulb_ambient.mmh.xml. --><br />
<attribute name="Color"/> <!-- string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, "0.498039 0.498039 0.498039 1.0" for the two tools --><br />
<attribute name="Name"><!-- "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. --><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Radius"> <!-- 5.0 for the three lightrigs, "1e+007" for the two tools --><br />
<data type="double"/><br />
</attribute><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
</element><br />
</define><br />
<define name="NodeEmitter"><br />
<element name="NodeEmitter"><br />
<attribute name="Acceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- string of four numbers, separated by spaces. --><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleXMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="AgeMapScaleYMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Birthrate"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="BirthrateInParticlesPerMeter"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="BirthrateRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="Bounciness"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="EmitterType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="EnableParticleCollisions"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"/> <!-- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1; if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;--><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="GravityMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InheritVelocityInsteadOfPosition"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="InitialRotation"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="InitialRotationRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="InitialRotationSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialRotationSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeed"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="InitialSpeedRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="InvMovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="KillParticleWhenTargetHit"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="LOD"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Life"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="LifeRange"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="LinkParticlesTogether"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialLibrary"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="MeshParticleModel"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<attribute name="MovementSpread"/> <!-- Two floating point values, representing movementspread X and movementspread Y --><br />
<optional><br />
<attribute name="MovementSpreadUpdateDelay"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<optional><br />
<attribute name="ObjectSpaceAcceleration"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="OrientationBehaviour"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticleInheritance"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="ParticlesAffectedByWind"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="ParticlesFollowPath"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="PhysicsEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="PhysicsObjectSpawn"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomInitialRotation"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="RotationalAcceleration"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="ScaleRange"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="SpawnDirectionTracksTarget"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnSpread"/> <!-- Two floating point values, representing spawnspread X and spawnspread Y --><br />
<optional><br />
<attribute name="SplatEmitter"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetAttraction"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="TargetRadius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UVDistributionSize"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="UpdateOnlyWhenVisible"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVariationTint"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="UserParamName"/> <!-- ECString, not sure if there's any special formatting here --><br />
</optional><br />
<optional><br />
<attribute name="VertexFormat"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="WorldAxisAcceleration"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<oneOrMore><br />
<choice><br />
<ref name="Export"/><br />
<ref name="Rotation"/><br />
<ref name="Translation"/><br />
<element name="EmitterAttachments"><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<element name="EmitterAttachment"><br />
<optional><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnOnSurface"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="UseNormalForVelocity"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
</element><br />
</element><br />
<element name="SpawnVolume"><br />
<optional><br />
<attribute name="Axis"/><br />
</optional><br />
<attribute name="InvertSpawnVolumeNormals"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="Length"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="MaxCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleRollAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MeshParticleUpAxis"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="MinCorner"/> <!-- Three numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="Radius"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="SpawnVolumeType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="SpawnWithinVolume"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="UseVolumeNormalsForDirection"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<zeroOrMore><br />
<ref name="Data"/><br />
</zeroOrMore><br />
</element><br />
</choice><br />
</oneOrMore><br />
<optional><br />
<element name="SplatParticle"><br />
<optional><br />
<attribute name="AgeMapColorMultiplier"/> <!-- four numbers separated by spaces --><br />
</optional><br />
<optional><br />
<attribute name="FlipbookColumns"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookRows"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FlipbookType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="FramesPerSecond"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Height"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="HoldLastFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Lifespan"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="NumSamplesH"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="NumSamplesW"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="OrientationRangeRadians"><br />
<data type="integer"/><br />
</attribute><br />
<optional><br />
<attribute name="RandomStartFrame"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<attribute name="Width"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<ref name="Export"/><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</optional><br />
<ref name="AgeMap"/><br />
</element><br />
</define><br />
<define name="Data"><br />
<element name="Data"><br />
<optional><br />
<attribute name="ElementCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexCount"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IndexType"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Semantic"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="Type"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<text/><br />
</element><br />
</define><br />
<define name="NodeEmitterGroup"><br />
<element name="NodeEmitterGroup"><br />
<attribute name="MaterialObject"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeEmitterTarget"><br />
<element name="NodeEmitterTarget"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<zeroOrMore><br />
<ref name="Export"/><br />
</zeroOrMore><br />
</element><br />
</define><br />
<define name="NodeLightProbe"><br />
<element name="NodeLightProbe"><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<ref name="Translation"/><br />
<ref name="Rotation"/><br />
<optional><br />
<element name="ReflectionMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
<element name="IrradianceMap"><br />
<attribute name="ResName"><br />
<data type="NCName"/><br />
</attribute><br />
</element><br />
</optional><br />
</element><br />
</define><br />
<define name="AgeMap"><br />
<element name="AgeMap"><br />
<attribute name="Count"><br />
<data type="integer"/><br />
</attribute><br />
<oneOrMore><br />
<element name="AgeMapElement"><br />
<attribute name="Alpha"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Color"/><br />
<attribute name="PercentLifeElapsed"><br />
<data type="decimal"/><br />
</attribute><br />
<optional><br />
<attribute name="RotationSpeedMultiplier"><br />
<data type="decimal"/><br />
</attribute><br />
</optional><br />
<attribute name="XScale"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="YScale"><br />
<data type="decimal"/><br />
</attribute><br />
</element><br />
</oneOrMore><br />
</element><br />
</define><br />
</grammar><br />
</pre><br />
<br />
<br />
== Example .MMH.XML file ==<br />
<pre><br />
<!-- A note on value types:<br />
List#:type -- means # amount of values of specified type with spaces in between<br />
<br />
string -- a series of characters, digits and underscores, can not start with a colon, no spaces<br />
?string? -- same as above except can start with a colon<br />
int -- an integer (whole number)<br />
decimal -- any number including one with digits appearing after a decimal point, <br />
all decimals MUST have a decimal point even if there are no digits after it (ie 1. not 1, or 0.0)<br />
--><br />
<br />
<ModelHierarchy ModelDataName="string" Name="string"><br />
<!-- Optional Attributes:<br />
FXActorName="string" -- An FXA file name <br />
PreSimulateTime="decimal" -- emitter presimulation time<br />
ReferencedMeshes="List:string" -- List of names of referenced meshes. Most of the files I see this in have an empty string here, but some <br />
have one or more .msh files named with spaces separating them. For example: <br />
ReferencedMeshes="fx_l_plane.msh fx_l_plane.msh"<br />
Every file with ReferencedMeshes defined was exported by the VFX editor so this is a VFX thing.<br />
RemoteMaterialAlpha="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialDecalName="string" -- if UseRemoteMaterial is true <br />
RemoteMaterialFresnelFalloff="decimal" -- if UseRemoteMaterial is true <br />
RemoteMaterialInvertFresnel="int" -- if UseRemoteMaterial is true. A true/false value <br />
RemoteMaterialTintColor="List4:decimal"-- if UseRemoteMaterial is true. Four numbers separated by spaces <br />
UseRemoteMaterial="int" -- a true/false value <br />
--><br />
<!-- 1 of (defined below): --><br />
<MeshHierarchy/> <!-- MeshHierarchy is a deprecated synonym for "NodeMesh". --><br />
<Node/><br />
<NodeMesh/> <br />
</ModelHierarchy><br />
<br />
<NodeMesh><br />
<!-- Optional Attributes:<br />
BonesUsed="List:int" -- list of integers. Bodies have a lot of bones listed, other body parts have fewer. Boots, armor, gloves, <br />
helmets, hair, eyes, etc. all have bonesused. <br />
CastBakedShadow="int" -- appears to be a true/false value <br />
CastRuntimeShadow="int" -- appears to be a true/false value<br />
CutAway="int" -- appears to be a true/false value<br />
ID="string" -- A short string that always seems to be "_" followed by two or three random-looking numbers and letters <br />
IsVFXMesh="int" -- if this mesh is categorized as a VFX Mesh, load in the MaterialColor parameter<br />
MaterialColor="List4:decimal" -- String with four values - RGBA<br />
MaterialLibrary="string" -- Strings like "CavesInterior" - reference to MAL files, MAL are material editor file types. (may not actually be useful in the game)<br />
MaterialObject="?string?" -- Strings like "pn_boo_hvyd_l3" here, this is referring to material object (MAO files) create by the material editor <br />
MeshGroupName=string"> -- The Meshes Name, used to reference the meshchunk name in the MSH <br />
MeshName="string" -- the mesh file that the meshchunk is in. if this isn't set, it will default to the first mesh in the model (for backwards compatibility)<br />
Name="string" -- name of the node<br />
PunchThrough="int" -- true/false value<br />
ReceiveBakedShadow="int" -- true/false value <br />
ReceiveRuntimeShadow="int" -- true/false value <br />
<<UNKNOWN>> ReceiveShadow="int" -- I didn't find this referenced in the source code - deprecated, perhaps? <br />
ShadowCasting="int" -- used to set GFF_MMH_MESH_CAST_RUNTIME_SHADOW in the source code, same as CastRuntimeShadow above - synonyms?<br />
UseVariationTint="int" -- true/false value<br />
--><br />
<!-- 0 or more of the following items come next, definitions follow later --><br />
<Attribute/><br />
<BoundingBox/> <!-- may be empty, or may contain something of the form <![CDATA[-8.00051 -32.0 -0.0103784 1.0 8.01207 0.0 30.0 1.0]]> <br />
I believe this is the two corners (min and max) of the bounding box. --><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeMesh/> <!-- appears to be able to handle a nodemesh within a nodemesh :O --><br />
<NodePointLight/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<Scale>"decimal"</Scale> <br />
<!-- I am assuming next bit means no more than one of the following (could be none): <br />
<choice><br />
<ref name="NodeAmbientLight"/><br />
<ref name="NodeUsePoint"/><br />
<zeroOrMore><br />
<ref name="NodeEmitter"/><br />
</zeroOrMore><br />
</choice><br />
--><br />
<NodeAmbientLight/><br />
<NodeUsePoint/><br />
<NodeEmitter/><br />
</NodeMesh><br />
<br />
<Node Name="?string?"><br />
<!-- Optional Attributes:<br />
BoneIndex="int" ---- possibly the bone to which this node is attached to, not included if not attached to a bone?<br />
SoundMaterialType="int" ---- are there SoundMaterialType definitions somewhere? if so I guess this is the index of one<br />
--><br />
<!-- can have 0 or more of the following(including duplicates), however I assume having more than one of the same type<br />
would cause the compiler to go wtf? in some cases (like bounding box or translation). Definitions follow later in file<br />
--><br />
<BoundingBox/><br />
<CollisionObject/><br />
<Export/><br />
<Node/><br />
<NodeCrustHierarchy/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodeLightProbe/><br />
<NodeMesh/><br />
<NodePointLight/><br />
<NodeUsePoint/><br />
<NodeWeapontrail/><br />
<Rotation/><br />
<Translation/><br />
<NodeCloth> <!-- has a shit load of attributes with no comments however I assume they all have to do with cloth simulation paramaters --><br />
<!-- NodeCloth Attributes:<br />
AttachmentResponseCoefficient="decimal" <br />
AttachmentTearFactor="decimal" <br />
BendingStiffness="decimal" <br />
CF_BENDING="int"<br />
CF_BENDING_ORTHO="int"<br />
CF_COLLISION_TWOWAY="int"<br />
CF_COMDAMPING="int"<br />
CF_DAMPING="int"<br />
CF_DISABLE_COLLISION="int"<br />
CF_GRAVITY="int"<br />
CF_HARDWARE="int"<br />
CF_PRESSURE="int"<br />
CF_SELFCOLLISION="int"<br />
CF_STATIC="int"<br />
CF_TEARABLE="int"<br />
CF_VISUALIZATION="int"<br />
CollisionResponseCoefficient="decimal"<br />
DampingCoefficient="decimal"<br />
Density="decimal"<br />
Fadeable="boolean"<br />
Friction="decimal"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
ID="string"<br />
MaterialLibrary="string"<br />
MaterialObject="string"<br />
MeshGroupName="string"<br />
Name="string"<br />
Pressure="decimal"<br />
SleepLinearVelocity="decimal"<br />
SolverIterations="int"<br />
StretchingStiffness="decimal"<br />
TearFactor="decimal"<br />
Thickness="decimal"<br />
WakeUpCounter="decimal"<br />
--><br />
<!-- Optional Attributes: GROUP_MASK_STATICGEOMETRY="boolean" --><br />
<Attribute/><br />
<Export/> <!-- can have 0 or more Exports --><br />
<Translation/><br />
<Rotation/><br />
<ClothAttachments><br />
<ClothAttachment TearableAttachment="int" TwoWayAttachment="int" Type="string"><br />
</ClothAttachment><br />
</ClothAttachments><br />
<MeshGroup Name="string"> <!-- contains 1 or more Data elements, defined later in file --><br />
<Data/> <br />
</MeshGroup><br />
</NodeCloth><br />
<NodeSnaptoPoint Name="string"><br />
<!-- can have 0 or more Exports --><br />
<Export/><br />
<!-- can have 0 or more of the following, defined later in file --><br />
<Translation/><br />
<Rotation/><br />
</NodeSnapToPoint><br />
<NodeAmbientLight/> <!-- Optional Element defined later in file--> <br />
</Node><br />
<br />
<!-- <<<WARNING: PROBABLY NOT A GOOD IDEA TO USE THIS ONE!!!>>> --><br />
<!-- MeshHierarchy is a deprecated synonym for "NodeMesh". Only 14 files still use it out of nearly 8000 in our internal sources. --><br />
<!-- IE it is a REALLY old version of NodeMesh --><br />
<MeshHierarchy Name="string"> <br />
<BoundingBox/> <!-- Optional --><br />
<!-- These are Optional and apparently can have more than one if you want, defined lated in file --><br />
<MeshHierarchy/><br />
<Rotation/><br />
<Translation/><br />
<!-- can have either a NodeLightProbe or 0 or more NodeEmitters --><br />
<NodeLightProbe/><br />
<NodeEmitter/><br />
</MeshHierarchy><br />
<br />
<NodeCrustHierarchy HookID="int" Name="string"><br />
<Export/> <!-- can have 0 or more Exports, defined later in file --><br />
<Translation/> <!-- Optional --><br />
<Rotation/> <!-- Optional --> <br />
<NodeMesh/> <!-- Optional --><br />
<!-- can have 0 or more of the following (including duplicates apparently) --><br />
<Node/><br />
<NodeEmitter/><br />
<NodeEmitterGroup/><br />
<NodeEmitterTarget/><br />
<NodePointLight/><br />
</NodeCrustHierarchy><br />
<br />
<Rotation> <br />
data <!-- data is a Quaternionf and represents the relative rotation from its parent or the world axis if it has no parent--><br />
</Rotation><br />
<br />
<Export ControllerType="string" ExportName="?string?" TagName="string"/><br />
<!-- Optional Attribute: MaterialColor="List4:decimal" -- String with four values - RGBA --><br />
<!-- An export is what is used to connect nodes from an animation file to nodes in a model file. The key frames in an animation file affect the translations/rotations of the nodes with the corresponding exports of the same name. --><br />
<br />
<BoundingBox><br />
data <!-- data is Vector4f min, Vector4f max (ie: f f f f f f f f --><br />
</BoundingBox><br />
<br />
<Translation><br />
<!-- Optional Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal"-- Three numbers separated by spaces <br />
--><br />
data <!-- This is a vector4 representing the difference in position from its parent, or the origin if it has no parent --><br />
</Translation><br />
<br />
<CollisionObject><br />
<!-- Optional Attributes:<br />
Kinematic="boolean"<br />
Static="boolean"<br />
--><br />
<!-- can have 1 or more Shapes --><br />
<Shape><br />
<!-- Attributes:<br />
AllowEmitterSpawn="int"<br />
Fadeable="boolean"<br />
Name="string"<br />
Position --Vector4f but no required type??<br />
Rotation --Quaternionf but no required type??<br />
Type="string"<br />
--><br />
<!-- Optional Attributes:<br />
DimX="decimal"<br />
DimY="double" -- why double when other dims are decimal???<br />
DimZ="decimal"<br />
GROUP_MASK_CREATURES="boolean"<br />
GROUP_MASK_ITEMS="boolean"<br />
GROUP_MASK_NONWALKABLE="boolean"<br />
GROUP_MASK_PLACEABLES="boolean"<br />
GROUP_MASK_STATICGEOMETRY="boolean"<br />
GROUP_MASK_TERRAIN_WALL="boolean"<br />
GROUP_MASK_TRIGGERS="boolean"<br />
GROUP_MASK_WALKABLE="boolean"<br />
Height="double"<br />
Radius="decimal"<br />
--><br />
<!-- VertexData and IndexData are optional, however you must have both or neither. Can have more than one pair??? --><br />
<VertexData length="int"> <!-- I assume length is the number of verts or possibly the number of values given in data --><br />
data <!-- I assume this is a list of vert coords given in a list form (ie: x1,y1,z1,x2,y2,z2,...,xn,yn,zn maybe without commas) --><br />
</VertexData><br />
<IndexData> <!-- UINT16? don't know what this one's for, ask for clarification --><br />
data <!-- maybe its vertex indicies for triangles? --><br />
</IndexData><br />
</Shape><br />
</CollisionObject><br />
<br />
<NodePointLight Color="list4:decimal" IsStatic="int" Name="string" Radius="decimal"> <!-- Color: string of four numbers, separated by spaces. --><br />
<!-- Optional Attributes:<br />
AffectsDomain="int" -- A search through the existing files has this as either "1" or "2", no other values. <br />
I don't know what these domains represent.<br />
IntensityPeriod="decimal"<br />
IntensityPeriodDelta="decimal"<br />
IntensityVariation="decimal"<br />
UseVariationTint="int"-- true/false, I believe <br />
--><br />
<!-- must have at least 1 of the following, can have more including duplicates apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
</NodePointLight><br />
<br />
<NodeWeapontrail Duration="decimal" MaterialObject="string" Name="string" SegmentLength="decimal"><br />
<!-- All MaterialObjects appear to be in either weapontrail_streaks or weapontrail_arrow --><br />
<Translation/><br />
<Rotation/><br />
</NodeWeaponTrail><br />
<br />
<Attribute AttributeName="string" SourceName="string"><br />
<!-- AttributeName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files) --><br />
<!-- SourceName's value is almost universally "BaseLight" (11167 times out of 11170 in 7010 files)--><br />
</Attribute> <br />
<br />
<NodeUsePoint Name="string" Type="string"><br />
<!-- All Name values seem to be of the form "UserPoint##", where ## is a zero-padded low number (highest I've seen is 14) --><br />
<!-- Type values: "Front", "Back", "Right", "Left" are options. Most items seem to get by with just nodeusepoints of front <br />
and back, a few have all four types of nodeusepoint. --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
<NodeCrustHierarchy/> <!-- Optional --><br />
</NodeUsePoint><br />
<br />
<!-- Only 5 files had one of these; lightrig_day01.mmh.xml, lightrig_int01.mmh.xml, lightrig_night01.mmh.xml, tools_ambient.mmh.xml, <br />
and tools_bulb_ambient.mmh.xml. <br />
<br />
I would assume this type of node is used for calculating ambient light/shadows maybe like a radiosity pass or something.<br />
Might make some interesting lighting changes if you fiddle with it but be careful! might break your lighting --><br />
<NodeAmbientLight Color="List4:decimal" Name="string" Radius="double"> <br />
<!-- Color: string of four numbers, separated by spaces. "0.0705882 0.0862745 0.0980392 1.0" for the three lightrigs, <br />
"0.498039 0.498039 0.498039 1.0" for the two tools <br />
Name: "BWDA_OmniLight04" for the three lightrigs, "BWDA_OmniLight01" for the two tools. <br />
Radius: 5.0 for the three lightrigs, "1e+007" (10000000?? big big radius!) for the two tools --><br />
<Export/> <!-- 0 or more exports --><br />
<Translation/><br />
<Rotation/><br />
</NodeAmbientLight><br />
<br />
<NodeEmitter> <!-- has a shit ton of attributes, all of which seem to pertain to particle emitter parameters (makes sense) --><br />
<!-- Attributes:<br />
Acceleration="decimal"<br />
Birthrate="decimal"<br />
BirthrateInParticlesPerMeter="int"<br />
BirthrateRange="decimal"<br />
EmitterType="string"<br />
EnableParticleCollisions="int" -- true/false ??<br />
GravityMultiplier="decimal"<br />
IneritVelocityInsteadOfPosition="int" -- true/false ??<br />
InitialRotationSpeedRange="decimal"<br />
InitialSpeed="decimal"<br />
InitialSpeedRange="decimal"<br />
Life="decimal"<br />
LinkParticlesTogether="int" -- true/false ??<br />
MaterialLibrary="string"<br />
MaterialObject="?string?"<br />
MovementSpread="List2:float" -- Two floating point values, representing movementspread X and movementspread Y <br />
Name="?string?" <br />
OrientationBehaviour="string"<br />
ParticleInheritance="string"<br />
ParticlesAffectedByWind="int" -- true/false ??<br />
ParticlesFollowPath="int" -- true/false ??<br />
RotationalAcceleration="decimal"<br />
ScaleRange="decimal"<br />
SpawnSpread="List2:float" -- Two floating point values, representing spawnspread X and spawnspread Y<br />
UpdateOnlyWhenVisible="int" -- true/false ??<br />
--> <br />
<!-- Optional Attributes:<br />
AgeMapColorMultiplier="List4:decimal"- - string of four numbers, separated by spaces.<br />
AgeMapScaleXMultiplier="decimal"<br />
AgeMapScaleYMultiplier="decimal"<br />
Bounciness="decimal"<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="int" -- UINT8 nFlipbookType = FLIPBOOKTYPE_NONE = 0; <br />
if (a_sFlipbookType.CompareNoCase(L"ContactSheet")) nFlipbookType = FLIPBOOKTYPE_CONTACT_SHEET = 1;<br />
if (a_sFlipbookType.CompareNoCase(L"Volume")) nFlipbookType = FLIPBOOKTYPE_VOLUME = 2;<br />
FramesPerSecond="decimal"<br />
InitialRotation="decimal"<br />
InitialRotationRange="decimal"<br />
InitialRotationSpeed="decimal"<br />
InvMovementSpreadUpdateDelay="decimal"<br />
KillParticleWhenTargetHit="int" -- true/false ??<br />
LOD="int" -- true/false maybe?? might be an index/identifier<br />
LifeRange="decimal"<br />
MeshParticleModel="?string?"<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces <br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces <br />
MovementSpreadUpdateDelay="decimal"<br />
ObjectSpaceAcceleration="int"<br />
PhysicsEmitter="int" -- true/false ??<br />
PhysicsObjectSpawn="int -- true/false ??<br />
RandomInitialRotation="int" -- true/false ??<br />
RandomStartFrame="int" --true/false ??<br />
SpawnDirectionTracksTarget="int" -- true/false ??<br />
SplatEmitter="int" -- true/false ?? might be index of a SplatEmitter if they exist<br />
TargetAttraction="decimal"><br />
TargetName="?string?" <br />
TargetRadius="decimal"<br />
UVDistributionSize="int"><br />
UseVariationTint="int" -- true/false ??<br />
UserParamName="??????" -- (datatype=ECString) << What is this?? -- ECString, not sure if there's any special formatting here <br />
VertexFormat="string" -- are there VertexFormats defined somewhere?><br />
WorldAxisAcceleration="List3:decimal" -- Three numbers separated by spaces <br />
--><br />
<!-- Requires 1 or more of the following, duplicates allowed apparently --><br />
<Export/><br />
<Rotation/><br />
<Translation/><br />
<EmitterAttachments><br />
<!-- Optional EmitterAttachments Attributes:<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
--><br />
<EmitterAttachment Type="string"/><br />
<!-- Optional EmitterAttachment Attributes:<br />
Name="string"<br />
SpawnOnSurface="int" -- true/false ??<br />
UseNormalForVelocity="int" -- true/false ??<br />
--><br />
</EmitterAttachments><br />
<SpawnVolume InvertSpawnVolumeNormals="int" SpawnWithinVolume="int" > <!-- both look to be true/false values --><br />
<!-- Optional SpawnVolume Attributes:<br />
Axis="??????" -- no data type specified, assuming 3 numbers<br />
Length="decimal"<br />
MaxCorner="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleRollAxis="List3:decimal" -- Three numbers separated by spaces<br />
MeshParticleUpAxis="List3:decimal" -- Three numbers separated by spaces<br />
MinCorner="List3:decimal" -- Three numbers separated by spaces<br />
Radius="decimal"<br />
SpanwVolumeType="string" -- are there SpawnVolumeTypes defined somewhere???<br />
UseVolumeNormalsForDirection="int" -- true/false ??<br />
--><br />
<Data/><!-- 0 or more of these --><br />
</SpawnVolumn><br />
<SplatParticle> <!-- Optional - Not included in the 1 or more --><br />
<!-- SplatParticle Attributes:<br />
Height="decimal"<br />
Lifespan="int"<br />
MaterialObject="string"<br />
NumSamplesH="int"<br />
NumSamplesW="int"<br />
OrientationRangeRadians="int"<br />
Width="decimal"<br />
--><br />
<!-- Optional SplatParticle Attributes:<br />
AgeMapColorMultiplier="List4:decimal" -- four numbers separated by spaces<br />
FlipbookColumns="int" -- true/false ??<br />
FlipbookRows="int" -- true/false??<br />
FlipbookType="string" -- apparently not same as above in NodeEmitter<br />
FramesPerSecond="int"<br />
HoldLastFrame="int" -- true/false ??<br />
RandomStartFrame="int" -- true/false ??<br />
--><br />
<Export/> <!-- Optional --><br />
<AgeMap/><br />
</SplatParticle><br />
<AgeMap/> <!-- Not Optional - Required - Not included in the 1 or more --><br />
</NodeEmitter><br />
<br />
<Data Semantic="string"><br />
<!-- Optional Attributes:<br />
ElementCount="int"<br />
IndexCount="int"<br />
IndexType="string"<br />
Type="string"<br />
--><br />
data<br />
</Data><br />
<br />
<NodeEmitterGroup MaterialObject="string" Name="?string?"> <br />
<Translation/><br />
<Rotation/><br />
<NodeEmitter/> <!-- 0 or more of these --><br />
</NodeEmitterGroup><br />
<br />
<NodeEmitterTarget Name="string"><br />
<Translation/><br />
<Rotation/><br />
<Export/> <!-- 0 or more exports --><br />
</NodeEmitterTarget><br />
<br />
<NodeLightProbe Name="string"><br />
<Translation/><br />
<Rotation/><br />
<!-- following are optional elements, they are paired, can't have one without the other --><br />
<ReflectionMap ResName="string" /><br />
<IrradianceMap ResName="string" /><br />
</NodeLightProbe><br />
<br />
<AgeMap Count="int"><br />
<!-- contains one or more AgeMapElements --><br />
<AgeMapElement Alpha="decimal" Color="List4:decimal" PercentLifeElapsed="decimal" XScale="decimal" YScale="decimal" /><br />
<!-- Optional AgeMapElement Attributes: RotationSpeedMultiplier="decimal" --><br />
</AgeMap><br />
</pre><br />
[[Category:File types]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Model&diff=13535Model2010-09-12T17:16:00Z<p>Eshme: /* Modding / Creation */</p>
<hr />
<div>Models are ordinary, textured, static or animatable 3D Meshes. They make up a big part of every visible entity in the game. The builder consolidates models, along with other files, into a complete visible package which is then seen in the game world.<br />
<br />
A Model is an [[Art Resources|Art Resource]].<br />
<br />
== Overview ==<br />
<br />
A Model is made up of a collection of files which define its shape, material, and other important information. These are created using external modelling applications such as 3DSMax or Blender which then export information into a game-readable Format. Models can be static, or animated.<br />
<br />
The only editor that makes direct use of them is the [[level editor]], but things like creatures and placeables will make use of them indirectly via [[2DA]] definitions.<br />
<br />
One model may be used in many different places and contexts. Changing a single model can cause multiple changes in a game world.<br />
<br />
'''Note:''' A Model is an intermediate resource, which are used as part to design entities you see in game. To create or change the design of existing entities, based on existing Models, go straight to [[Design]].<br />
<br />
=== Basic Integration ===<br />
<br />
{| border="3" cellpadding="5" cellspacing="0" align"left"<br />
|- style="background-color:white;"<br />
| colspan="5" rowspan="2" style="border-right:3px solid black;background-color:#D3CFA0" align="center" |[[MSH|MSH File (Mesh Data)]]<br />
| align="center" style="border-right:2px solid black; background-color:#FFAD6B"|[[Textureformats|Diffuse]]<br />
| align="center" style="border-right:2px solid black; background-color:#FFAD6B"|[[Textureformats|Specular]]<br />
| align="center" style="border-right:2px solid black; background-color:#FFAD6B"|[[Textureformats|Normal]]<br />
| align="center" style="background-color:#FFAD6B"|[[Textureformats|Tint]]<br />
|-<br />
| colspan="4" align="center" style="background-color:#FFAD6B"| [[MAO|MAO Material File]]<br />
|- style="background-color:#E0E0E0;font-weight:bold;text-align:center;"<br />
| colspan="9" width="700pt" height="50pt" align="center" |<br />
&uarr;&darr;<br />
[[MMH|MMH/PHY Model File]]<br />
&uarr;&darr;<br />
|- style="background-color:white;"<br />
| colspan="3" align="center" style="border-right:3px solid black; background-color:#FFFFE0" |[[ItemVariations.xls|ItemVariations.XLS]] [[2DA|(2DA)]]<br />
| colspan="2" align="center" style="border-right:3px solid black; background-color:#E0C0C0" |[[APR_base.xls|APR_base.XLS]] [[2DA|(2DA)]]<br />
| colspan="2" align="center" style="border-right:3px solid black; background-color:#BD9970" |[[Placeables.xls|Placeables.XLS]] [[2DA|(2DA)]]<br />
| colspan="2" align="center" style="background-color:#C0C0E0" |[[Model Placement|Model]] [[Resource palette|(ResourcePalette)]]<br />
|-<br />
| align="center" style="background-color:#FFFFE0" |[[ItemVariations.xls|Cloth_var.,]]<br />
| align="center" style="background-color:#FFFFE0" |[[ItemVariations.xls|Longbows_var.,]]<br />
| align="center" style="border-right:3px solid black; background-color:#FFFFE0" |[[ItemVariations.xls|etc.]]<br />
| colspan="2" rowspan="3" align="center" style="border-right:3px solid black; background-color:#E0C0C0" |[[Creature|Creature: Appearance]]<br />
| colspan="2" rowspan="3" align="center" style="border-right:3px solid black; background-color:#BD9970" |[[Placeable|Placeable: Appearance]]<br />
| colspan="2" rowspan="6" align="center" style="border-bottom:2px solid black; background-color:#C0C0E0" |[[Level editor|Level Editor]]<br />
|-<br />
| colspan="3" align="center" style="border-right:3px solid black; background-color:#FFFFE0" |[[2DA base.xls|(M)2DA_base.XLS worksheet ref]]<br />
<br />
|-<br />
| colspan="3" align="center" style="border-right:3px solid black; background-color:#FFFFE0" |[[BITM_base.xls|BITM_base.XLS worksheet ref by ID]]<br />
<br />
|-<br />
| colspan="3" align="center" style="border-right:3px solid black; background-color:#FFFFE0" |[[Item|Item: Base Item Type]]<br />
| colspan="2" rowspan="3" align="center" style="border-right:3px solid black; border-bottom:2px solid black; background-color:#E0C0C0" |[[Creature|Creature "*.utc"]] [[Resource palette|(ResourcePalette)]]<br />
| colspan="2" rowspan="3" align="center" style="border-right:3px solid black; border-bottom:2px solid black; background-color:#BD9970" |[[Placeable|Placeable "*.utp"]] [[Resource palette|(ResourcePalette)]]<br />
|-<br />
| colspan="3" align="center" style="border-right:3px solid black; background-color:#FFFFE0" |[[Item|Item: Itemvariation]]<br />
|-<br />
| colspan="3" align="center" style="border-right:3px solid black; border-bottom:2px solid black; background-color:#FFFFE0" |[[Item|Item "*.uti"]] [[Resource palette|(ResourcePalette)]]<br />
|-<br />
| colspan="3" align="center" style="border-right:3px solid black"|'''Game (as Armour/Cloth/etc)'''<br />
| colspan="2" align="center" style="border-right:3px solid black"|'''Game (as Creatures/NPC's/etc)'''<br />
| colspan="2" align="center" style="border-right:3px solid black"|'''Game (as interactive Level Layout)'''<br />
| colspan="2" align="center" |'''Game (as static Level Layouts)'''<br />
|}<br />
<br />
<br />
These are the basic dependencies a model got with the Game, in its forms, where each entry links directly to the next. The Level Editor gets direct access to any Model, where the others are listed in [[2DA|2DA's]]. Where the [[2DA|2DA's]] are the place to begin listing any new Items. <br />
<!-- At least to my observations!! --><br />
<br />
== File Formats ==<br />
<br />
Models are principally defined using the following two file formats: [[MMH]] and [[MSH]]<br />
<br />
A Model's Material is defined in a [[MAO]] file which includes a list of Textures, in DDS format, used in the material. <br />
<br />
Bioware made models are stored in the Dragon Age file system's [[ERF]] files. They all share a [[Naming conventions|Naming Convention]].<br />
<br />
=== Textures ===<br />
<br />
*[[Textureformats]] in DAO<br />
<br />
== Modding / Creation ==<br />
<br />
Creating or Modding a Model can be done in multiple ways. A common activity in modding is retexturing an existing model. However, entirely new Models can also be created. Custom model import is possible by placing the MMH and all custom files referenced by the MMH into your module's override folder. These files would include any custom [[MAO]] files with their associated DDS files and the [[MSH]] and [[PHY]] files.<br />
<br />
See the table above, to work out which dependency is needed to gain the desired endresult. When the goal is to create a Sword, the dependency for a Model has to made with the [[ItemVariations.xls]] in a 2 way connection. In this case, the Itemvariation inquires the Filename and you give the Model the Filename. Bear in mind that such example isnt easily applied to anything, but each 2 items have to have the connection somewhere. <br />
<br />
Many hardcoded conventions apply, which is best found out individually. On other pages, or by learning.<br />
<br />
In any case, once the new Model is available to be applied in the Toolset and for the Designer, you should get carried on over to the [[Design]] Portal. This also accounts for any Resource already in use by the Single Player campaign.<br />
<br />
=== Meshes ===<br />
<br />
*Model Import/Export for gmax/3dsmax: see http://social.bioware.com/project/2336/ (Fully featured Model Import Export)<br />
*Model Import: see http://social.bioware.com/project/218/ (Converts game resource files into a readable format by external Modelling Applications. Tutorial needed)<br />
*Model Export for 3dsmax: see http://social.bioware.com/project/563/ (Works for static and animated Models, soon to work for Animations. Tutorial needed)<br />
*Model Export for Blender: see http://social.bioware.com/project/899/ (Able to mod Meshes, Tutorial needed)<br />
<br />
=== Materials ===<br />
<br />
*Model Import/Export for gmax/3dsmax: see http://social.bioware.com/project/2336/ -custom material type accessible within max material editor<br />
*[[Material editor]] - Part of the Toolset, and will create [[MAO]] files.<br />
*Model Export for 3dsmax: see http://social.bioware.com/project/563/ - which also may generate Material [[MAO]] by demand.<br />
<br />
See Related Tutorials for workflows.<br />
<br />
== Related Tutorials ==<br />
<br />
*[[Tutorial: Adding a Custom Model to Toolset]]<br />
*[[Tutorial: Reskinning an Item]]<br />
*[[Tutorial: Creating a custom placeable from a model]]<br />
<br />
<br />
<br />
-------<br />
See also: <br />
<br />
*[[Art]] --Dragon Age Game Art<br />
*[[Model list]] --For a list of Models placable in the Level Editor. Static Models.<br />
<br />
[[Category:Art resources]]</div>Eshmehttp://datoolset.net/mw/index.php?title=3rd_party_extensions&diff=135013rd party extensions2010-09-11T17:43:47Z<p>Eshme: /* Models */</p>
<hr />
<div>List 3rd party extensions and applications here!<br />
__NOTOC__<br />
== Third party applications ==<br />
<br />
=== Models ===<br />
<br />
* [http://social.bioware.com/project/218/ Tazpn's command line tools] - This packages includes an command line application for converting Dragon Age models from the native format to something that can be manipulated or used a reference for non-derivative works.<br />
* [http://social.bioware.com/project/1060/ GUI for tazpn's Command Line Tools] - This is an easy-to-use program to convert Dragon Age Models utilizing tazpn's Command Line Tools & the Dragon Age Toolset Command Line Tools.<br />
*[http://social.bioware.com/project/41/ DATool: DA model manipulator] - This is a tool for viewing, retexturing and resizing DA models. DATool allows you to easily browse the available DA models and make certain modifications to them.<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Can export static and animatable models. Also Collision,Materials,Animation. Current Version: 1.5.0<br />
*[http://social.bioware.com/project/899/ Blender Import-Export Script] - A set of tools to import-export meshes and extract resources from erf or rim files, all working into Blender.<br />
*[http://social.bioware.com/project/2246/ LightWave import-export plugin] - a plugin for [http://www.newtek.com/lightwave/ NewTek LightWave 3D]. Currently allows to import .msh files into LightWave and export 3d data from Modeler module to .msh.xml format.<br />
*[http://social.bioware.com/project/1511/ Lightmap Post Processor] - Remove black artifacts from lightmaps.<br />
*[http://social.bioware.com/project/2336/ GMax/3DSMax DA:O Model and Animation Import Export] - Importing and Exporting of Models and Animation. Model Creation Tools. Supports the free GMax as well as 3dsmax4 to 2011. Latest Version5.30 (08/23/2010)<br />
<br />
=== Animation ===<br />
<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Exports Animation. Also Models/Materials/Collision.<br />
*[http://social.bioware.com/project/2336/ GMax/3DSMax DA:O Model and Animation Import Export] - Importing and Exporting of Models and Animation. Makes Animations for use in Cutscenes or in Animation Blend Tree for use on Characters. Supports the free tool GMax as well as 3dsmax4 to 2010.<br />
<br />
=== Game data ===<br />
<br />
*[http://social.bioware.com/project/755/ GDApp] - GDApp is a simple editor that natively creates or modifies Dragon Age: Origins GD2A spreadsheet files (*.gda), without the need of Excel files.</div>Eshmehttp://datoolset.net/mw/index.php?title=ANI&diff=13200ANI2010-07-25T01:09:52Z<p>Eshme: /* Example .ANI.xml File */</p>
<hr />
<div>Animation sequence: holds single animation sequence. These are created via external Tools. See Article: [[3rd party extensions]]<br />
<br />
[[Model|Models]] ,which are animatable, will be animated with a animation sequence. See Article: [[Model]]<br />
<br />
== ani.xml schema ==<br />
<br />
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format. For a free converter/verifier, see [http://code.google.com/p/jing-trang/].<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><br />
<start><br />
<element name="Animation"><br />
<optional><br />
<attribute name="Additive"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IgnoreScale"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Length"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="Override"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="QuaternionCompressedSize"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<element name="Meta"><br />
<element name="CombatRange"><br />
<attribute name="Value"><br />
<data type="decimal"/><br />
</attribute><br />
</element><br />
<optional><br />
<element name="GOBAnim"><br />
<attribute name="Value"><br />
<data type="integer"/><br />
</attribute><br />
</element><br />
</optional><br />
</element><br />
</optional><br />
<zeroOrMore><br />
<element name="AnimationNode"><br />
<attribute name="Elements"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="ExportName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<attribute name="Source"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SourceType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Target"><br />
<data type="NCName"/><br />
</attribute><br />
<element name="KeyFrame"><br />
<text/><br />
</element><br />
</element><br />
</zeroOrMore><br />
</element><br />
</start><br />
</grammar><br />
</pre><br />
<br />
== Example .ANI.xml File ==<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<Animation Length="decimal" Name="string"><br />
<!-- Attributes:<br />
Length is the length of the animation in seconds<br />
Name is the name of the animation<br />
--><br />
<!-- Optional Attributes: <br />
Additive="string" -- True or False (additive or rigid)<br />
IgnoreScale="string" -- probably True or False<br />
Override="string" -- True or False<br />
QuaternionCompressedSize="int" -- size of compressed quaternion in bits (32 or 64)<br />
--><br />
<br />
<!-- Optional Element --><br />
<Meta><br />
<CombatRange Value="decimal"/><br />
<!-- Optional Element --><br />
<GOBAnim Value="int"/> 1 or 0, enables "GAD" Transform (allows free horizontal movement of the actor), requires GOB transformation and rotation values<br />
</Meta><br />
<br />
<!-- 0 or more of these, obviously having at least one would be usefull... It appears that each bone or node (not nodemeshes) gets one --><br />
<AnimationNode Elements="int" ExportName="?string?" Source="string" Target="string" SourceType="string"><br />
<!-- Attributes:<br />
Element refers to the number of elements in the data type. eg: 3 for a vector, 4 for a quaternion<br />
ExportName is the name the node will take on export<br />
Source is the type of the source <br />
Target is the type of the target<br />
SourceType seems to always be "KeyFrame"<br />
--><br />
<!-- Notes:<br />
For the Source and Target I have seen "Vector", "Quaternion", "Float32" and "Color4" with Elements="3", Elements="4", <br />
Elements="1" and Elements="4" respectively<br />
Vector was used for position info, Quaternion for rotation info, Float32 and Color4 for vfx info like birthrate, alpha and colour<br />
--><br />
<KeyFrame><br />
data <!-- starts with <![CDATA[ followed with lines of the format "time ntuple" where time is the time in seconds of the<br />
keyframe and ntuple is the components of the source type (the 3 elements in a vector or 4 elements in a quaternion or 1 element in a float)<br />
Therefore there will be Element+1 numbers per line<br />
ends with ]]><br />
--><br />
</KeyFrame><br />
</AnimationNode><br />
</Animation><br />
</pre><br />
<br />
<br />
[[Category:File types]]<br />
[[Category:Animations]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Engine_ApplyEffectAtLocation&diff=13052Engine ApplyEffectAtLocation2010-06-22T16:13:13Z<p>Eshme: </p>
<hr />
<div>{{dafunction<br />
|name=Engine_ApplyEffectAtLocation<br />
|brief=This function applies an effect at a location.<br />
|param1type=int<br />
|param1name=nDurationType<br />
|param1desc=can be [[EFFECT_DURATION_TYPE_PERMANENT]], [[EFFECT_DURATION_TYPE_INSTANT]] or [[EFFECT_DURATION_TYPE_TEMPORARY]]<br />
|param1default=<br />
|param2type=effect<br />
|param2name=eEffect<br />
|param2desc=the effect to be applied<br />
|param2default=<br />
|param3type=location<br />
|param3name=lLocation<br />
|param3desc=the location at which the effect is applied<br />
|param3default=<br />
|param4type=float<br />
|param4name=fDuration<br />
|param4desc=this value needs to be set only when nDurationType is EFFECT_DURATION_TYPE_TEMPORARY<br />
|param4default=0.0<br />
|param5type=object<br />
|param5name=oCreator<br />
|param5desc=effect creator<br />
|param5default=OBJECT_SELF<br />
|param6type=int<br />
|param6name=nAbilityId<br />
|param6desc=ability id<br />
|param6default=0<br />
|returntype=void<br />
|returndesc=<br />
|sourcefile=script.ldf<br />
|sourcemodule=<br />
}}<br />
<br />
== Description ==<br />
<!-- This section contains the full description from the functions comments. Do not change unless you are confident these are incomplete or incorrect. --><br />
Applies eEffect to lLocation. If nDurationType is EFFECT_DURATION_TYPE_TEMPORARY, then fDuration is the duration of the effect. <br />
<br />
<!-- == Remarks == --><br />
<!-- This section contains additional comments, observations and known issues. --><br />
<br />
<!-- == Examples == --><br />
<!-- This section contains examples transcluded from the snippet library. --><br />
<br />
<!-- == See also == --><br />
<!-- This section contains links to articles, functions or constant groups. --><br />
<br />
[[Category: Effect access functions]]</div>Eshmehttp://datoolset.net/mw/index.php?title=VFX_Tutorial&diff=13051VFX Tutorial2010-06-22T07:44:21Z<p>Eshme: /* Creating a new visual effect */</p>
<hr />
<div>{{Infobox vfx}}<br />
<br />
PDF Version Part 1 [[File:VFX_Tut_p1.pdf]]<br />
<br />
PDF Version Part 2 [[File:VFX_Tut_p2.pdf]]<br />
<br />
PDF Version Part 3 [[File:VFX_Tut_p3.pdf]]<br />
<br />
----<br />
<br />
== VFX Tutorial Part 1 ==<br />
<br />
This tutorial is to get you started in creating your own visual effects to be used in the DA toolset. Tutorial #1 will cover the basics of creating, editing, and implementing the visual effect.<br />
<br />
=== Creating a new visual effect ===<br />
<br />
To create a new VFX, right click on the palette window and select “NEW > VFX”<br />
<br />
[[File:new VFX.jpg|250px]]<br />
<br />
The VFX Editor will open up showing a square grid and a “Select VFX” window in the middle. For this tutorial we will be doing a Placeable effect, so select “Placeable” and click “OK”.<br />
<br />
On the top left, you should see a little globe called “VFXRoot” and in the Object Inspector you should see the properties of VFXRoot.<br />
At this point, save your work by selecting “File > Save As” or clicking the Save Icon in the upper left. You will be prompted for a file name. I like to keep all of my VFX files in one place so in My Documents/Bioware/Dragon Age folder I created a VFX folder to save my files.<br />
<br />
For this tutorial we will be creating a bonfire type of effect and to stay with Dragon Age [[Naming conventions]], we will use a 3 letter prefix, underscore, and then the file name. Name the file “fxp_bonfire_jp”<br />
The “fxp” is for “Visual Effect Placeable” (all VFX files start with fx*) “bonfire” tells me what the effect is, and the “jp” on the end lets me know that it is my effect and not someone else’s, you can add whatever suffix you want. Click “Save” when done.<br />
<br />
You can close the toolset at any time and return to this tutorial. You can open your effect again later by selecting “File > Open” and navigate to and select the file you just saved.<br />
<br />
=== VFX root properties ===<br />
<br />
[[File:t1_root_obj_inspector.jpg|250px]]<br />
<br />
'''VFXRoot Properties:'''<br />
I’ll just cover the ones that we will be using.<br />
<br />
'''Name:''' This is the resource name and is what will be used when we Post to Local. Change it to match the file name.<br />
<br />
'''Impact Length:''' Time in seconds for the stating phase of the effect. Example, a Runner starting off from the start line reaching max speed.<br />
<br />
'''Duration Length:''' Time in seconds for the duration of the effect. Example, the time it takes the runner to reach the finish line after reaching max speed.<br />
<br />
'''Cessation Length:''' Time in seconds for the ending of the effect. Example, the runner slowing down after crossing the finish line.<br />
<br />
We are making a bonfire effect, so we want the fire to start off small, grow in size, then burn itself out. So set the Impact Length to 3 seconds, this will start the fire and grown to its max size. Set the Duration Length to 3 seconds. This will allow us plenty of time to vary the coloration of the flames. Set the Cessation time to 3 seconds as well, as the fire burns out.<br />
<br />
You may be thinking that 9 seconds is a very short fire. When the effect is set in a script, the duration time is set within the function ApplyEffect*. This duration time causes the duration time of the animation to loop over and over. So for example, if this bon fire effect is applied to an object for 6 min, the duration part of the effect will loop 120 times, 3 second duration * 120 loops = 360 seconds = 6 minutes. Then the Cessation time plays and the effect is done.<br />
<br />
After setting these times, you should now see a time line something like this, More on this in part 2.<br />
<br />
[[File:T1_time_line.jpg|640px]]<br />
<br />
=== Adding an emitter ===<br />
<br />
Next we need an emitter. Right click on the window and select “Insert > Insert Emitter”. You should get a pulsating white capsule in the center of the grid and a “NewEmitter” object added to the list on the left.<br />
<br />
[[File:T1_emitter.jpg|640px]]<br />
<br />
Select the NewEmitter object and you will see the properties in the Object inspector window.<br />
<br />
[[File:T1_op_properties.jpg|250px]]<br />
<br />
'''Properties Window:'''<br />
<br />
'''Name:''' Change the name of the emitter to “Base” this will be the main base of the fire. Naming the emitter will help sort them out when building an effect with several emitters.<br />
<br />
'''Material Library:''' This is the library that we will be selecting our particle material from. The DA Effect Libraries start with the prefix fx_*Click on the Material Library box to open the resource window. Select the fx_firelibrary and click OK.<br />
<br />
'''Material Object:''' This is the martial that we will use from the above selected Library. For this select “FireFlipbook”.<br />
Before we continue, save your work and let’s talk about Flipbooks.<br />
<br />
A flipbook is a particle that consists of columns and rows of varying images. The animation is created by the effect rapidly flipping through each image, much like a cartoon animation. At this point you should see 4 columns of flickering flames. Note that not all particles are in flipbook form, some are a static image. A simple way to see if the particle is a flipbook, and to see how many columns and rows there are is to set the Birth Rate to 1. Click on the “Emission” tab in the Object Properties and change the top parameter “Birth Rate” to 1. You should now see an image that consists of 4 rows and 4 columns of small flame images. This is a single particle, 4x4 flipbook. Set the Birth Rate back to 10, and return to the “Properties” tab of the Object Inspector, more on Birth Rate later.<br />
<br />
[[File:T1_flip.jpg]]<br />
<br />
'''Flipbook Type:''' Select “ContactSheet”. <br />
<br />
'''Flipbook Random Start Frame:''' This selects a random frame within the flipbook to start with on each emission. Set this to TRUE. This will help give us diversity and make the flame look more “real”.<br />
<br />
'''Flipbook Rows:''' This is how many Rows there are in the flipbook, set this number to 4.<br />
<br />
'''Flipbook Columns:''' This is the number of Columns in the flipbook, set this to 4 also.<br />
<br />
'''Flipbook Frames per Second:''' The particle image has 4 rows and 4 colunms, there are 16 total images to flip through. This value should be a factor of Rows and Columns, so 4 x 4 = 16. Set this value to at least 16 flips per second.<br />
<br />
You should now see a single column of what nearly looks like fire.<br />
Right now the flames flicker a bit too slow for me, so set the Flipbook Frames per Second to 32. This makes the flames flicker twice as fast because it is now flipping through all 16 images twice per second instead of once.<br />
Save your work.<br />
<br />
[[File:T1_fire.jpg]]<br />
<br />
'''Age Map:'''<br />
<br />
[[File:T1_agemap.jpg]]<br />
<br />
In the Object Inspector click the “Age Map” Tab.<br />
<br />
Here we can manipulate the color and the scale of the effect.<br />
<br />
Color values are in percentage of 0 to 100% on a scale of 0 to 1, so 50% Blue would be 0.5.<br />
<br />
Most normal fires aren’t white, so set Color B (blue) to 0. Your flame should now be yellow. Set Color G (green) to 0.4. We now have a orangey-red color.<br />
<br />
Color A (alph) is the flames color intensity setting this to 0.5, the fire is half as intense. Set it where you like.<br />
<br />
The scale X and Y values can be any number from 0 to infinity. Setting the scale to 1 is the particles normal size. Because the particle image is a 2d image, there is no Z scale. Changing Scale X will affect the X (width) direction of the flame and Scale Y will affect the Y (Height) direction of the particle. For now we will leave them alone.<br />
<br />
The corresponding multipliers simply multiply the values in the general section. For example, if you set Color G back to 1, then set Green Color Multiplier to 0.4 you will have the same result. 1 * 0.4 = 0.4<br />
<br />
There is a notable difference between the 2 however, the General settings affect the particles over the lifetime of each particle while the Multipliers affect all the particles over the length of the animation. This will be explored further in Part 2. Go ahead and play with the color settings until you have it the way you want it, and then save your work.<br />
<br />
'''Emissions'''<br />
<br />
[[File:T1_emissions.jpg]]<br />
<br />
Now click on the “Emission” tab these settings control the particle emissions.<br />
<br />
'''Birth Rate:''' This is how many particle emit per second. The default is 10, which works out for the fire pretty good. However the flicker is pretty static. So we will change that in a minute.<br />
<br />
'''Birth Rate +/-:''' This setting will cause the particle Birth Rate to randomly vary by a positive number or a negative number. If we set this value to 1, the Birth Rate then will vary between 9 and 11 particles per second. Since a 10 Birth Rate seems to be a good number for the most particles per second, set the +/- value to 2, and change the Birth Rate to 8. This will make the max 10 and the min 6 particles per second.<br />
<br />
'''Initial Speed:''' This is how fast the particles travel when emitted from the emitter. Changing this value appears to change how long the particles last. However this is not the case, they simple move further before the particle life has expired.<br />
<br />
'''Initial Speed +/-:''' This setting works the same as the Birth Rate +/- setting but instead affects the Initial Speed. Set this value to 0.5 which will now give the particles a varying speed between 0.5 and 1.5.<br />
<br />
'''Life Expectancy (s):''' This is how long each particle last, in seconds, before vanishing. <br />
<br />
'''Life Expectancy +/-''': Again is a random variance to the value set in Life Expectancy. Set this value to 0.5, making the particle last longer and shorter as the fire burns.<br />
<br />
'''Scale Range:''' This adds a random variance to the size of the particle much like the other +/- settings. Set this to 0. 6. You should now see the flame vary in size as it emits from the base emitter.<br />
<br />
Play with these settings a bit to get familiar with them. In the end you should have a raging fire animation. When you are happy, save your work.<br />
<br />
[[File:T1_fire_1.jpg]]<br />
<br />
'''Getting the effect in game:''' Right click on the Root and select “Post to Local”. You'll find the new VFX under the model palette. It can be placed directly in the level editor or the cutscene editor but not the area editor. You can also add the effect dynamically to an area using a script.<br />
<br />
'''Notes:''' Because an effect is Art work, at present will not be included with a Builder to Builder Create and must be sent separately. Scripting examples to come later once there is a client to test for accuracy.<br />
<br />
[[File:T1_ptl.jpg]]<br />
<br />
So now you have a raging fire. In part 2 of this tutorial, we will make this fire dance and sing. Part 2 will introduce using the time line settings to very coloration, scale, size and other more advanced settings as well as explore some of the settings introduce here a bit deeper. Keep the bonfire effect you created with this tutorial, we will need it in the second part. The bonfire effect can also be downloaded from the social site.<br />
<br />
== VFX Tutorial Part 2 ==<br />
<br />
In tutorial #1 we created a good bone fire as a base and up until now we only changed the values directly in the properties on the effect. As we can see this works well for simple effects. Changing the values in this manor alters the effect over its entire life time. <br />
We have seen how to change the color and scale of the effect by changing the values in the properties age map. This is great for a basic flame but we want to add more life to it by making the flame vary in color and size over the length of the effect. To start, Set all the Values back to default as shown in the 2 pictures below.<br />
Note: This tutorial assumes you have read Tutorial #1 or are familiar with the basics of the VFX editor.<br />
<br />
[[File:T2_agemap_01.jpg]][[File:T2_emission_01.jpg]]<br />
<br />
Setting any of these values directly will affect the visual over the entire length of the effect. Instead we want to vary these values so the flame will change from reds, yellows, and orange. We also want to change its size during the impact, duration, and cessation phases of the effect. To do this, we will use the time line to set colors and scale so they change over the course of the effect.<br />
<br />
Before we continue, we need to make a small change. Select the Root of the effect and in the Object Inspector, change the Impact time to 5 sec and the Cessation time to 8 sec. The 5 sec impact will allow us enough time to see the changes in the flame as it grows and the longer cessation time is for the smoke we will be adding later on.<br />
<br />
[[File:T2_root_01.png]]<br />
<br />
<br />
Select the “Base” object, at the top right corner there is a drop down window, select “Color” from the list. Note, when using the time lines, make sure you have the correct emitter object selected. In this case it is the Base emitter. You should then see a time line like the one below.<br />
<br />
[[File:T2_color_01.jpg|680px]]<br />
<br />
<br />
Notice at the top of the time line is reads “Particle Lifetime”. This means that the changes we make here will affect each partial over the lifetime of each particle. The lifetime of the particle is directly related to the “Lifetime” value setting in the Emissions Tab, which currently is set to 1 sec.<br />
<br />
<br />
=== Parts of the Time line ===<br />
<br />
[[File:T2_timeparts_01.jpg|680px]]<br />
<br />
'''Control Point:''' The round dots allow you move the value up, down, left, or right within the time line.<br />
<br />
'''Value Rang:''' The left side of the time line shows the value range. At this current control point, the value is 1, which is the current value for all 4 colors in the Age map.<br />
<br />
'''Current Value:''' The dotted line shows the current value any place on the time line. Currently it is set to 1 over the entire length of the particle lifetime. When a control point is added, the line between the 2 control points will become solid.<br />
<br />
'''Visible:''' This box shows which time lines are visible, the dotted or solid line. You can select or unselect these time lines. Currently all 4 are selected and visible. All 4 also are set at the same value so you only see one control point as all 4 are stacked from top to bottom, Color A being the one on top.<br />
<br />
Click inside the time line and you will get a vertical bar. Drag the bar to the far right until the end of the timeline is reached. This bar represents that point in time and I will refer to this bar as the Point bar. Clicking anywhere on the time line will move the point bar to that point in time. <br />
<br />
[[File:T1_v_bar.jpg]]<br />
<br />
<br />
Right click on the time line and select “Add Control Point”. This adds a node at the point in which the point bar and the time line intersects. Also note that the Colors in the age map turn red, this indicates that the values are now controlled by the time line and can vary in value depending on the point in time. Also note that this adds a Control Point to each time line that is visible, so all 4 colors get an added node.<br />
Before we continue, save your work. Next turn the Loop Animation Off by clicking on it at the top right so it is no longer highlighted.<br />
<br />
[[File:T2_timeparts_02.jpg]]<br />
<br />
<br />
There are 2 ways that we can set the values on the time line, directly in the value box of the Age Map, or by dragging the control points on the time line. To see how it affects the animation, first make sure the point bar is to the far right at 100. Change the value Color B to 0 directly in the Age Map properties, just as we did in Tutorial 1. You should now see a blue line starting at 1 and dropping to 0 at the end of the time line. By changing the value on the Age Map, you affect the control point that intersects with the Point Bar. The Flame should now be white at the bottom and Yellow at the top.<br />
<br />
[[File:T2_cb.jpg|680px]]<br />
<br />
<br />
To see what happens to each particle, go to the Emission tab and change the birth rate to 1. You will see the particle start from the emitter as white, and then gradually change to yellow. Set the Birth rate back to 10 and return to the Age Map.<br />
<br />
Now move the point bar to the far left on 0. Notice that the value in Color B on the Age Map is again 1. Change this to 0 also and the left most control point will drop to 0 and you time line should now look like this.<br />
<br />
[[File:T2_cb_2.jpg|680px]]<br />
<br />
<br />
The small box in the lower right corner in the above image indicates which time lines are visible. Right now all 4 colors are visible on the time line. Next we will affect the green color by dragging the control points instead of changing the value directly in the Age Map. However the green time line in underneath the Alpha time line. So to make it visible, click the check mark to unselect the Alpha Color. The Alpha line goes away and we can now see the Green time line. Also uncheck the Red and Blue color time lines so only the Green is visible.<br />
<br />
Next Click and hold on the far left (0) control point of the Green time line and drag it down a bit, about half way between 1 and 0, you should see the flame change colors as you drag it down. Grab the right most control point and drag it down to 0. You should now have a flame that is brighter red at the bottom and darker at the top.<br />
<br />
[[File:T2_cg.jpg|680px]]<br />
<br />
<br />
Now we are going to add 2 more control points to the Green time line. Move the Point Bar to 5 on the Particle Lifetime line, right click and select “Add Control Point”. Now move the Point Bar to 10 on the timeline and add a second control point. Grab the first control point we just added, the one at 5, and drag it up to about 0.7. This will create a bright flicker at the base of the fire.<br />
<br />
[[File:T2_cg_2.jpg|680px]]<br />
<br />
<br />
Now we just need to fade out the top of the flame a bit so the bottom is more intense than the top. Uncheck the green timeline and check the Color A (Alpha). Color A is a transparency color and can be use to alter the intensity of the particle. Grab the Right most control point and drag it down to about 40% (0.4). You will see that the top is less visible than the bottom of the flame. Save your work.<br />
<br />
<br />
=== Changing its size ===<br />
<br />
Right now the flame is a single column that is the same size at the top as it is at the base, this is not very realistic so we will remedy that by changing the scale of the particle. <br />
<br />
In the drop down menu at the top right, select “Scale”. Again you will see a time line labeled “Particle Lifetime” a Control point, and a box showing the “Scale Y” and “Scale X” time lines. As we did before, move the Point Bar to the far right at 100 and right click and select “Add Control Point”. Now uncheck the Scale X time line so only the Scale Y line is visible. Move the Left control point to about 1.5 and the right control point to about 1.75. Check the Scale X timeline to make it visible and move the left control point to about 1.5 and the right control point to 0.5. This will widen the base and stretch the top to a point much like a real fire.<br />
<br />
[[File:T2_scale.jpg|680px]]<br />
<br />
<br />
Now the fun begins. Up until now we have been changing values over the lifetime of the particles. Now we will start changing values over the Impact, Duration, and Cessation time of the effect, but first save your work.<br />
<br />
Select the “Emissions” Tab in the Object Properties. In the drop down menu, select “Birth Rate”. This time you will see a bit different looking time line. At the top you will see 3 sections, Impact which starts at 0 and ends at 5000, Duration starting at 5001 and ending at 8000, and the Cessation which starts at 8001 and ends at 1600. These times correlate to the 5 sec Impact, 3 second Duration, and the 8 second Cessation times specified in the VFX root.<br />
<br />
'''TIP:''' You can Zoom Extents by double clicking inside the time graph, or zoom in/out by using the mouse scroll wheel.<br />
<br />
When an effect is used in game, the Impact time plays, then the Duration time is looped for the length of the applied effect, then the Cessation time plays. For example, if the fire effect is applied to a wood pile for 3 min, the Impact time plays then the 2 second duration is looped for 3 min then the cessation time plays. With this in mind, we want the fire to build up to the a full blown fire, then taper off and go out.<br />
<br />
In the Birth Rate time line, add 3 more control points, one at the Duration start, one at the duration end, and one at about 12000. Starting from the left move the left most control point to 0, move the second Control Point to 10, the third Control Point to 10 and the fourth to 0.<br />
<br />
[[File:T2_br_2.jpg|680px]]<br />
<br />
<br />
Notice that the flame stops burning like it was before. This is because now the total effect length is a factor. Slide the Point Bar back and forth on the time line, you can see what happens to the fire at any point in time. Now to view the animation of the effect, you must click the Play button in the upper right corner. The Point Bar will scroll across the time line and the results can be viewed in the effect window.<br />
<br />
The fire should now start out slow and build up then taper off and go out at around 12 seconds. You can click on the Loop Animation if you want and the effect will continue to loop until paused by the Pause Animation button or by clicking in the time line.<br />
<br />
Now select Life in the drop down menu. Right now each point in time the flame last 1 second. We want to change this so the flame when first starting out or ending doesn’t last that long. Keep the tip I gave above in mind, and make the Life time line look like the one in the picture. The Control Point times from left to right are 0, 1, 1.4, 1, 0 then save your work.<br />
<br />
[[File:T2_life.jpg|680px]]<br />
<br />
<br />
'''Let’s Dance:'''<br />
<br />
Right now we have our fire looking pretty good, but there is one element still missing, the wavering and dancing of a real fire. On the Emission table item 12 and 13 are “Spawn Spread X (Deg)” and “Spawn Spread Y (Deg)”. These settings affect the spread of the particles in the X and Y directions, that is the particles can emit in varying directions in degrees from the emitter. Set both of these to 20 degrees.<br />
<br />
Now our fire dances. Note that these settings could be set using the time line “Spawn Spread” as well, feel free to play with that if you wish.<br />
<br />
We can get a better Idea of what our effect will look like in game by adding a reference model. Right click on the Root and select “Insert > Insert Reference Model”. In the Resource window Name field we can filter the list to make it easier to find what we are looking for, so enter *fire* and press enter. Now your resource list will only show those items with the word fire in it.<br />
<br />
[[File:T2_resource.jpg]]<br />
<br />
<br />
Choose the resource “plc_firepit_01_1”. Turn Bounding box Off by clicking it at the top to un-highlight it. This gets rid of the yellow square around the objects. Turn the Collision Plane on by clicking on it to highlight it. This will simulate a stone floor at the walk mesh level.<br />
<br />
Now play you animation. You can also select the Base object and click anywhere in the time line, for example if you place the Point Bar anyplace in the Duration time you can watch your fire burn at it’s full potential.<br />
<br />
'''Challenge:''' Replace the plc_firepit_01_1 with the plc_bonfire01_1 reference model. Scale your fire up, and increase it’s life time to engulf the wood pile in flames.<br />
Don’t forget to save your work.<br />
<br />
[[File:T2_fin.jpg|680px]]<br />
<br />
This concludes Part 2 of the tutorial. In Part 3 we will be adding smoke and lighting to the flame and make the flickering flame reflect off of surrounding objects.<br />
<br />
== VFX Tutorial Part 3 ==<br />
<br />
This tutorial assumes you have read Tutorial #1 and #2 and are now familiar with using the time lines to adjust values over time. You can down load the final effect from Tutorial #2 from the social site if you need it to continue with Tutorial #3.<br />
<br />
'''Where there’s smoke:'''<br />
<br />
Our fire is missing 2 more elements to be complete, smoke and lighting.<br />
<br />
First we will add the smoke.<br />
Right click on the effect Root and select “Insert > Insert Emitter”. You will see a second emitter appear on top of the first one.<br />
Select the new emitter and in the Object Inspector properties, change its name to Smoke. For Material Library, select fx_smoke_vol. For Material Object select fx_smoke_vol_blend.<br />
<br />
In the First tutorial we talked about the Flipbook Type: Contact Sheet. For this effect we will be using the Flipbook Type: Volume. This works similar to the Contact Sheet type except that the Flipbook Rows is the number of layers, usually 2 or 4. The Flipbook Columns should always be 1 and the Frame per second is a factor of the 2, i.e. Rows x Columns. Set these to 2, 1, and 2 respectively.<br />
<br />
In the Age map, set the colors R, G, B to 0.5 and Color A to 0.7. Our smoke should now look more like smoke, but we have a ways to go yet.<br />
Smoke usually bellows upwards and spreads out as it rises. We can simulate this with a combination of the Scale and Scale Multiplier time lines.<br />
Select the smoke emitter and the Scale time line from the top right drop down menu. We want the smoke to grow in size both in the X and Y directions, but more so in the X direction.<br />
<br />
[[File:T3_scale.jpg|thumb|680px|center]]<br />
<br />
Both X and Y should start at 1 and X should end around 5.5 and Y should end around 3.5 over the life of the particle. This will give us a funnel shape.<br />
<br />
Now select the Scale Multiplier time line. We can use this line to make the smoke grow in proportion to the flame during it’s impact, duration, and cessation times.<br />
<br />
Start out at a 0 multiplier and raise it to 1 at the start and during the duration time, then taper it back down to 0 during the Cessation time. Notice that at around 12000, the flame is gone and we are only left with smoke for the last 4 seconds of the effect.<br />
<br />
[[File:T3_scale_mult.jpg|thumb|680px|center]]<br />
<br />
Now we need to change a few of the Emissions. Set the Birth rate to 3, Life Expectancy to 2.5 and Life Expectancy +/- to 0.5. If you recall from previous tutorials the +/- will give us a variance on how long the particle last. As we did with the flame, we want the smoke to also waver from left to right and forward and back, set the Spawn Spread X (Deg) and Spawn Spread Y (Deg) to 10.<br />
<br />
'''Changing Position:'''<br />
<br />
By now you may have noticed that when you play the effect in full, the smoke stays at ground level. Smoke naturally rises from the top of the flame, not from the base. This is OK during the Impact and cessation phase as the fire is small and near the ground level. However, we need the smoke to rise to the top of the flame during the Duration phase. To do this we will use the position time line to make the smoke rise, and lower as the flame grows.<br />
<br />
With the smoke emitter selected, select the Position Time Line. Unselect the X and Y position time lines so only the Z line is visible. Add a control point at the start and end of the Duration time. Also add a control point at around 12000 and one at the end of the effect time.<br />
<br />
Raise the control points at the start and end of the duration to about 1.2, so it looks like the pic below.<br />
<br />
[[File:T3_position.jpg|thumb|680px|center]]<br />
<br />
Now when you play the effect, the smoke should rise and lower with the flame. Feel free to play with any of these settings to get the look you like best.<br />
<br />
'''Fade it out:'''<br />
<br />
If you zoom out and look at the Animation as a whole you will notice that the smoke just suddenly disappears at the top, looks a bit odd. Instead we will fade it out so this isn’t seen.<br />
<br />
Select the Smoke emitter and then select the Color time line. Uncheck all the colors except the Alpha color. Add 2 or 3 control points towards the end of the time line and tapper the alpha down to 0 at the end of the particle life time. This makes the smoke fade out naturally. Save your work.<br />
<br />
[[File:T3_colora.jpg|thumb|680px|center]]<br />
<br />
'''Light My Fire:'''<br />
<br />
Before we continue, let’s put our fire into a game scene. Select the VFX Root and in the Object Inspector, under “Layout Settings”. You can select a area and see what your effect will look like in game. In Layout, select the area resource. Your effect should be near the upper right corner.<br />
<br />
[[File:T3_arena.jpg|thumb|680px|center]]<br />
<br />
Play the VFX a few times, notice there is no light given off by the fire.<br />
<br />
Right click the VFX root and select Insert > Insert Light. A new light object will be inserted on top of the fire emitter. It’s right where we need it to be, by default.<br />
<br />
[[File:T3_light_2.jpg]]<br />
<br />
Light Properties:<br />
Affects Characters: Set this to true. This setting specifies if the light should reflect off nearby creatures and characters.<br />
Affects Level: same as above but it applies to the surrounding terrain.<br />
Name: Name your light, I called mine “Flicker”<br />
<br />
First we need to give the light some color, a good yellowish – red should do. Set Color G to 0.5 and Color B 0. To make the fire flicker, we will change the intensity of the color to coincide with the flame.<br />
<br />
Select the Flame object and then select the “Color Intensity” time line from the drop down list. Add several control points and adjust the intensity up and down so it climaxes during the duration, similar to the image shown.<br />
<br />
[[File:T3_intens.jpg|thumb|680px|center]]<br />
<br />
Be sure to drop the intensity to 0 at around 12000 as this is where the flame goes out.<br />
<br />
TIP: You can manually slide the time bar left and right on the time line to get a visual check of the intensity control points.<br />
<br />
Now we have a nice bon fire complete with smoke and lighting.<br />
<br />
[[File:T3_flame.jpg|thumb|680px|center]]<br />
<br />
'''Challenge:''' Using the Material Library “fx_distortionmatlib” add a third emitter and give your fire distortion.<br />
<br />
This concludes the basic VFX Tutorials, Thanks for reading.<br />
Author: Jassper<br />
<br />
<br />
<br />
[[Category:Tutorials]]<br />
[[Category:VFX]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Deleting_resources&diff=12989Deleting resources2010-06-03T19:05:02Z<p>Eshme: made this a redirect to the article this is in</p>
<hr />
<div>#REDIRECT [[Designer_Resources#Deleting resources]]</div>Eshmehttp://datoolset.net/mw/index.php?title=3rd_party_extensions&diff=129593rd party extensions2010-05-24T06:16:07Z<p>Eshme: /* Third party applications */</p>
<hr />
<div>List 3rd party extensions and applications here!<br />
__NOTOC__<br />
== Third party applications ==<br />
<br />
=== Models ===<br />
<br />
* [http://social.bioware.com/project/218/ Tazpn's command line tools] - This packages includes an command line application for converting Dragon Age models from the native format to something that can be manipulated or used a reference for non-derivative works.<br />
* [http://social.bioware.com/project/1060/ GUI for tazpn's Command Line Tools] - This is an easy-to-use program to convert Dragon Age Models utilizing tazpn's Command Line Tools & the Dragon Age Toolset Command Line Tools.<br />
*[http://social.bioware.com/project/41/ DATool: DA model manipulator] - This is a tool for viewing, retexturing and resizing DA models. DATool allows you to easily browse the available DA models and make certain modifications to them.<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Can export static and animatable models. Also Collision,Materials,Animation. Current Version: 1.5.0<br />
*[http://social.bioware.com/project/899/ Blender Import-Export Script] - A set of tools to import-export meshes and extract resources from erf or rim files, all working into Blender.<br />
*[http://social.bioware.com/project/2246/ LightWave import-export plugin] - a plugin for [http://www.newtek.com/lightwave/ NewTek LightWave 3D]. Currently allows to import .msh files into LightWave and export 3d data from Modeler module to .msh.xml format.<br />
*[http://social.bioware.com/project/2312/ Blender-DragonAge Model Converter] - Create and Manipulate level models and props. Feature keywords: Walk mesh, Collision mesh, Lightmapped models...<br />
*[http://social.bioware.com/project/1511/ Lightmap Post Processor] - Remove black artifacts from lightmaps.<br />
*[http://social.bioware.com/project/2336/ GMax/3DSMax DA:O Model and Animation Import Export] - Importing and Exporting of Models and Animation. Does almost everything for now. Supports the free tool GMax as well as 3dsmax4 to 2010.<br />
<br />
=== Animation ===<br />
<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Exports Animation. Also Models/Materials/Collision.<br />
*[http://social.bioware.com/project/2336/ GMax/3DSMax DA:O Model and Animation Import Export] - Importing and Exporting of Models and Animation. Makes Animations for use in Cutscenes or in Animation Blend Tree for use on Characters. Supports the free tool GMax as well as 3dsmax4 to 2010.<br />
<br />
=== Game data ===<br />
<br />
*[http://social.bioware.com/project/755/ GDApp] - GDApp is a simple editor that natively creates or modifies Dragon Age: Origins GD2A spreadsheet files (*.gda), without the need of Excel files.</div>Eshmehttp://datoolset.net/mw/index.php?title=3rd_party_extensions&diff=129583rd party extensions2010-05-24T06:12:23Z<p>Eshme: /* Models */</p>
<hr />
<div>List 3rd party extensions and applications here!<br />
__NOTOC__<br />
== Third party applications ==<br />
<br />
=== Models ===<br />
<br />
* [http://social.bioware.com/project/218/ Tazpn's command line tools] - This packages includes an command line application for converting Dragon Age models from the native format to something that can be manipulated or used a reference for non-derivative works.<br />
* [http://social.bioware.com/project/1060/ GUI for tazpn's Command Line Tools] - This is an easy-to-use program to convert Dragon Age Models utilizing tazpn's Command Line Tools & the Dragon Age Toolset Command Line Tools.<br />
*[http://social.bioware.com/project/41/ DATool: DA model manipulator] - This is a tool for viewing, retexturing and resizing DA models. DATool allows you to easily browse the available DA models and make certain modifications to them.<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Can export static and animatable models. Also Collision,Materials,Animation. Current Version: 1.5.0<br />
*[http://social.bioware.com/project/899/ Blender Import-Export Script] - A set of tools to import-export meshes and extract resources from erf or rim files, all working into Blender.<br />
*[http://social.bioware.com/project/2246/ LightWave import-export plugin] - a plugin for [http://www.newtek.com/lightwave/ NewTek LightWave 3D]. Currently allows to import .msh files into LightWave and export 3d data from Modeler module to .msh.xml format.<br />
*[http://social.bioware.com/project/2312/ Blender-DragonAge Model Converter] - Create and Manipulate level models and props. Feature keywords: Walk mesh, Collision mesh, Lightmapped models...<br />
*[http://social.bioware.com/project/1511/ Lightmap Post Processor] - Remove black artifacts from lightmaps.<br />
*[http://social.bioware.com/project/2336/ GMax/3DSMax DA:O Model and Animation Import Export] - Importing and Exporting of Models and Animation. Does almost everything for now. Supports the free tool GMax as well as 3dsmax4 to 2010.<br />
<br />
=== Animation ===<br />
<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Exports Animation. Also Models/Materials/Collision.<br />
*[http://social.bioware.com/project/2336/ DA:O Model Importer ] - 3DS max and GMax. Imports all Models and Animations. Combatible with the Exporter.<br />
<br />
=== Game data ===<br />
<br />
*[http://social.bioware.com/project/755/ GDApp] - GDApp is a simple editor that natively creates or modifies Dragon Age: Origins GD2A spreadsheet files (*.gda), without the need of Excel files.</div>Eshmehttp://datoolset.net/mw/index.php?title=3rd_party_extensions&diff=128863rd party extensions2010-04-23T00:34:40Z<p>Eshme: /* Animation */</p>
<hr />
<div>List 3rd party extensions and applications here!<br />
__NOTOC__<br />
== Third party applications ==<br />
<br />
=== Models ===<br />
<br />
* [http://social.bioware.com/project/218/ Tazpn's command line tools] - This packages includes an command line application for converting Dragon Age models from the native format to something that can be manipulated or used a reference for non-derivative works.<br />
* [http://social.bioware.com/project/1060/ GUI for tazpn's Command Line Tools] - This is an easy-to-use program to convert Dragon Age Models utilizing tazpn's Command Line Tools & the Dragon Age Toolset Command Line Tools.<br />
*[http://social.bioware.com/project/41/ DATool: DA model manipulator] - This is a tool for viewing, retexturing and resizing DA models. DATool allows you to easily browse the available DA models and make certain modifications to them.<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Can export static and animatable models. Also Collision,Materials,Animation. Current Version: 1.5.0<br />
*[http://social.bioware.com/project/899/ Blender Import-Export Script] - A set of tools to import-export meshes and extract resources from erf or rim files, all working into Blender.<br />
*[http://social.bioware.com/project/2246/ LightWave import-export plugin] - a plugin for [http://www.newtek.com/lightwave/ NewTek LightWave 3D]. Currently allows to import .msh files into LightWave and export 3d data from Modeler module to .msh.xml format.<br />
*[http://social.bioware.com/project/2312/ Blender-DragonAge Model Converter] - Create and Manipulate level models and props. Feature keywords: Walk mesh, Collision mesh, Lightmapped models...<br />
*[http://social.bioware.com/project/1511/ Lightmap Post Processor] - Remove black artifacts from lightmaps.<br />
<br />
=== Animation ===<br />
<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Exports Animation. Also Models/Materials/Collision.<br />
*[http://social.bioware.com/project/2336/ DA:O Model Importer ] - 3DS max and GMax. Imports all Models and Animations. Combatible with the Exporter.<br />
<br />
=== Game data ===<br />
<br />
*[http://social.bioware.com/project/755/ GDApp] - GDApp is a simple editor that natively creates or modifies Dragon Age: Origins GD2A spreadsheet files (*.gda), without the need of Excel files.</div>Eshmehttp://datoolset.net/mw/index.php?title=APR_base.xls&diff=12884APR base.xls2010-04-21T16:04:51Z<p>Eshme: </p>
<hr />
<div>{{infobox creature}}<br />
<br />
This [[2DA]] defines base appearances, such as "Hurlock - Normal", used by the creature editor.<br />
<br />
This Excel document has only two worksheets; APR_base and _Creature_Types. Most of the detail is in the APR_base worksheet, _Creature_Types merely lists the basic creature types that are used in the "CREATURE_TYPE" column of APR_base.<br />
<br />
The columns of APR_base are: <br clear="all"/><br />
<br />
{{2da start|APR_base}}<br />
{{2da column| LABEL |string| the name of the appearance type, as seen in the toolset when selecting appearance type for a creature.}}<br />
{{2da column| STRING_REF |int| }}<br />
{{2da column| MODELTYPE |string| sets whether the model is set up to allow interchangeable parts for customization. There are four types of model:<br />
* Simple (S) - Model with only one mesh.<br />
* Welded/Baked (W) - the creature has its own weapon and cannot equip new ones.<br />
* Wield, Head (H) - The creature's head is a separate mesh that can be swapped with other meshes.<br />
* Parts (P) - a fully customizable model that accepts parts such as gloves, boots, and armor. The player races have examples of this kind of model.}}<br />
{{2da column| MODELRACE |string| not sure what this one does. E for elf, D for dwarf, H for human, K for children, N for certain NPCs, and C for a wide variety of other creatures. Appears to match the first letter of the model name. }}<br />
{{2da column| MODELNAME |string| The name of the model file used for this appearance. (See: [[Naming conventions#Model File Naming Convention|Model File Naming Convention]])}}<br />
{{2da column|PlayHumanoidAnimations |bool|}}<br />
{{2da column|MODELGENDEROVERRIDE |bool| Gender is important for loading the models ssociated with an apperance type. Gender will be used as the second letter in the resource. For example: HM_ARM_HVYa corresponds to the armor for a human male. CN_BDY_HLKa is the body for a neutral hurlock. Gender usually comes from the designer toolset. But in some cases only one gender is supported from a model perspective. The letter in this column will be used in those cases to override designer data when loading models (note that this is only used for loading models everywhere else the selection in the designer toolset applies). Valid values are M, F, or N. If you don't want to override the gender (allowing it to be defined in the toolset) use "****".}}<br />
{{2da column|MaxScaleLevel |int|}}<br />
{{2da column|AvoidAOEChance |int| Percentage chance to exit AOE per round }}<br />
{{2da column|RULESRACE|int| A default rules race for each appearance.}}<br />
{{2da column|SYNCHRONIZEDCOMBAT |int| 0 for no synchronized combat, 1 for synchronized combat.}}<br />
{{2da column|AI_ARMOR_TYPE|int| Used by the AI to figure out how tough a creature is.}}<br />
{{2da column|CRUST_EFFECT|int|- defines a visual effect to apply to the creature as a "crust".}}<br />
{{2da column|MODELTREE |string| The main [[blend tree]] name. "Blend tree name" correspond to the value of "Tree Name" field of the Blend tree nodes properties. The Blend trees can be downloaded from the project http://social.bioware.com/project/1331/#files and opened into Toolset for a better understanding.}}<br />
{{2da column|COMBATMODELTREE|string| The [[blend tree]] name used for the animations of the action in combat. This blend tree, groups animations to use when creature perform attacks, avoid attacks, take damage etc.}}<br />
{{2da column|MOVEMENTTREE|string| [[Blend tree]] name used for creature movement}}<br />
{{2da column|COMBATMOIVETREE|string| [[Blend tree]] name used for the animations of the movements in combat. This blend tree, groups animations to use when during combat, creature perform base movements such as walk/run forward, walk/run back, strafe etc.}}<br />
{{2da column|OVERLAYTREE|string|}}<br />
{{2da column|OVERRIDETREE|string|}}<br />
{{2da column|AMBIENTOVERRIDE|string|}}<br />
{{2da column|BLENDCURVES|string|}}<br />
{{2da column|BlendTrees|comment|}}<br />
{{2da column|WEAPONSCALE|float|}}<br />
{{2da column|WEAPONOFFSET|float|}}<br />
{{2da column|BLOODCOLR|string| R for red.}}<br />
{{2da column|ANIM_WALKSPEED|float|Walking speed of the source animation}}<br />
{{2da column|ANIM_RUNSPEED|float|Running speed of the source animation}}<br />
{{2da column|ANIM_CBTSTRFSPEED|float|Combat movement speed of the source animation = distance x 30/# frames}}<br />
{{2da column|ANIM_CBTSPEED|float|Combat movement speed of the source animation}}<br />
{{2da column|GAME_WALKSPEED|float|Desired in-game walking speed of the creature}}<br />
{{2da column|GAME_RUNSPEED|float|Desired in-game running speed of the creature}}<br />
{{2da column|GAME_CBTSTRFSPEED|float|In-game speed for combat walking/strafing}}<br />
{{2da column|GAME_CBTSPEED|float|Deired in-game combat movement speed of the creature}}<br />
{{2da column|AnimationSpeeds|comment|}}<br />
{{2da column|HEIGHT|float|}}<br />
{{2da column|HEIGHT_F|float|Height for females. Used to position the camera in conversations.}}<br />
{{2da column|MODELSCALEX|float|Scaling Factor for Animations (ie shorter steps for short legs)}}<br />
{{2da column|MODELSCALEY|float|Scaling Factor for Animations (seems to be a key to allow many animations used cross creature)}}<br />
{{2da column|MODELSCALEZ|float|Scaling Factor for Animations}}<br />
{{2da column|ModelSizes|comment|}}<br />
{{2da column|TerrainFollowPitch|float|Max angle in degrees for pitch adjustment in slopes}}<br />
{{2da column|TerrainFollowRoll|float|Max angle in degrees for roll adjustment in slopes}}<br />
{{2da column|TerrainFollowData|comment|}}<br />
{{2da column|HEAD_WORKSHEET|int|number of the 2DA where the selectable heads for this appearance are listed (you can find the number in the M2DA_base file, with the core worksheets organized in the [[Heads.xls]] file.)}}<br />
{{2da column|HAIR_WORKSHEET|int|number of the 2DA where are listed the selectable hair styles for this appearance}}<br />
{{2da column|EYES_WORKSHEET|int|number of the 2DA where are listed the selectable eyes types for this appearance}}<br />
{{2da column|BEARD_WORKSHEET|int|number of the 2DA where are listed the selectable beard styles for this appearance}}<br />
{{2da column|NECK_MODEL|string|}}<br />
{{2da column|Parts|comment|}}<br />
{{2da column|TARGETABLE|bool|}}<br />
{{2da column|disabled_armor_sounds|bool|}}<br />
{{2da column|disabled_weapon_sounds|bool|}}<br />
{{2da column|default_SOUND_set|string|}}<br />
{{2da column|SOUND_Footstep_type|string| column name in sound_movement_footstep}}<br />
{{2da column|SOUND_unarmed |int| material, when creature has no weapon equipped, like: bare hands, claws}}<br />
{{2da column|SOUND_default_armor|int|}}<br />
{{2da column|SOUND_monster_size |string| used for bodyfalls. Values can be "small", "medium", "huge", or "unknown".}}<br />
{{2da column|Sound_X|comment|}}<br />
{{2da column|HasTurnAttacks|bool| 1 is true. Appearance can execute left and right attacks that reorient it 90 degrees.}}<br />
{{2da column|ValidDeathBlows|int|<br />
* -1 Unknown<br />
* 0x0 - standard humanoid<br />
* 0x1 - beast or large creatures<br />
* 0x2 - large creature positional<br />
}}<br />
{{2da column|CREATURE_TYPE| int | Bitfield, with each bit in the integer enabeling a deathblow type (max 32).<br />
* 0x1 - unused<br />
* 0x2 - standard humanoid<br />
* 0x4 - decap (only if neck node present)<br />
* (0x8) creature deathblow<br />
}}<br />
{{2da column|CREATURE_GROUP| int | associates appearances with creature treasure groups in [[TS_Group.xls]]. less than 0 means No Treasure, 0 means Generic Treasure Group, greater than 0 means Specific Treasure Group}}<br />
{{2da column|OneShotKills |int| If set, creature scales to 1 hp only.}}<br />
{{2da column|CanDoDeathblows |int|}}<br />
{{2da column|DefaultEffectFlags|int|<br />
* 1 Disable Movement<br />
* 2 Disable Turning<br />
* 4 Disable combat<br />
* 8 Disable talents<br />
* 16 Disable spells<br />
* 32 Disable skills<br />
* 64 Disable items<br />
* 128 Disable input<br />
}}<br />
{{2da column|PERSPACE |float|}}<br />
{{2da column|MeleeRingUpdateAlways|bool|Force the melee ring to run updates all the time even while the creature is not being attacked. Useful for creatures that can't move or large creatures that have directional abilities.}}<br />
{{2da column|MeleeRingDisabledStart|float|The start angle at which the melee ring will be considered disabled}}<br />
{{2da column|MeleeRingDisabledEnd|float|The end angle at which the melee ring will be considered disabled}}<br />
{{2da column|MeleeRingOffset|float|Offset the main melee ring forward or backwards according to the creature orientation. Value is in meteres. Positive offsets move the ring forward. Range allowed: -0.5 to 0.5 meters}}<br />
{{2da column|MeleeRingsData |comment|}}<br />
{{2da column|bHasAppearAnim|int|0: Creature has no default appear animation<br />
1: Creature does have a default appear animation}}<br />
{{2da column|bHasDisappearAnim|int|0: Creature has no default disappear animation<br />
1: Creature does have a default disappear animation}}<br />
{{2da column|AppearVFX|int|}}<br />
{{2da column|AppearDisappear |comment|}}<br />
{{2da column|bCanBleed|int| determines whether a creature has a blood effect when hit.}}<br />
{{2da column|BloodPool|int| The size of the blood pool that forms under the creature's body when it's killed.<br />
*0-none<br />
*1-small<br />
*2-medium<br />
*3-large<br />
}}<br />
{{2da column|DefaultWeapon|resource|}}<br />
{{2da column|DefaultArmor|resource|}}<br />
{{2da column|CorpseModel|string| A dead creature decays into this model after some time. Note that model "plc_bagcoin03_0" will disappear completely after the user loots its content. So, spells that normally require dead bodies (e.g. to get life or mana) will not work then. For this reason, this model should be used with care. See [[Bodybag]].}}<br />
{{2da column|DecayBehaviour|int|<br />
* 0 = Decay completeley<br />
* 1 = Don't decay, but remove physics (i.e. won't block movement anymore)<br />
* 2 = Don't decay and don't remove physics either<br />
}}<br />
{{2da column|AttackFL|float|Attack angle front left - large creature only}}<br />
{{2da column|AttackFLWidth|float|Width of attack cone}}<br />
{{2da column|AttackFLRing|int|Melee ring ID (for very large creatures)}}<br />
{{2da column|AttackFR|float|}}<br />
{{2da column|AttackFRWidth|float|}}<br />
{{2da column|AttackFRRing|int|Melee ring ID (for very large creatures)}}<br />
{{2da column|AttackBR|float|}}<br />
{{2da column|AttackBRWidth|float|}}<br />
{{2da column|AttackBRRing|int|Melee ring ID (for very large creatures)}}<br />
{{2da column|AttackBL|float|}}<br />
{{2da column|AttackBLWidth|float|}}<br />
{{2da column|AttackBLRing|int|Melee ring ID (for very large creatures)}}<br />
{{2da column|AttackReach|float|Reach of the attacks}}<br />
{{2da column|LargeCreature| comment |}}<br />
{{2da column|CodexPlot|string| Which codex plot contains a page giving information about this creature.}}<br />
{{2da column|CodexFlag|int| Which flag within the given codex plot to set when the first creature of this type is killed by the player.}}<br />
{{2da column|AprRulesFlags|int|0x1 - Count as construct (for damage)}}<br />
{{2da column|bDisableGore|int|Disables all gore updates on the creature via sys_gore_h.nss}}<br />
{{2da column|BumpLevel|int|creature with higher value bumps lower valued creatures (player = 100)}}<br />
{{2da column|AppearanceRestrictionGroup|int| A bit flag indicating which appearance groups this creature belongs to. Abilities can set a condition to restrict use of an ability to a specific appearance group. Only creatures that sport appearances that belong to this group will be allowed to use those abilities.}}<br />
{{2da column|AppearanceRating|float|}}<br />
{{2da column|GroupType|int|}}<br />
{{2da end}}<br />
<br />
[[Category:XLS files]]</div>Eshmehttp://datoolset.net/mw/index.php?title=3rd_party_extensions&diff=127523rd party extensions2010-03-24T20:36:50Z<p>Eshme: </p>
<hr />
<div>List 3rd party extensions and applications here!<br />
__NOTOC__<br />
== Third party applications ==<br />
<br />
=== Models ===<br />
<br />
* [http://social.bioware.com/project/218/ Tazpn's command line tools] - This packages includes an command line application for converting Dragon Age models from the native format to something that can be manipulated or used a reference for non-derivative works.<br />
* [http://social.bioware.com/project/1060/ GUI for tazpn's Command Line Tools] - This is an easy-to-use program to convert Dragon Age Models utilizing tazpn's Command Line Tools & the Dragon Age Toolset Command Line Tools.<br />
*[http://social.bioware.com/project/41/ DATool: DA model manipulator] - This is a tool for viewing, retexturing and resizing DA models. DATool allows you to easily browse the available DA models and make certain modifications to them.<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Can export static and animatable models. Also Collision,Materials,Animation. Current Version: 1.0.1<br />
*[http://social.bioware.com/project/899/ Blender Import-Export Script] - A set of tools to import-export meshes and extract resources from erf or rim files, all working into Blender.<br />
*[http://social.bioware.com/project/2246/ LightWave import-export plugin] - a plugin for [http://www.newtek.com/lightwave/ NewTek LightWave 3D]. Currently allows to import .msh files into LightWave and export 3d data from Modeler module to .msh.xml format.<br />
*[http://social.bioware.com/project/2312/ Blender-DragonAge Model Converter] - Create and Manipulate level models and props. Feature keywords: Walk mesh, Collision mesh, Lightmapped models...<br />
*[http://social.bioware.com/project/1511/ Lightmap Post Processor] - Remove black artifacts from lightmaps.<br />
<br />
=== Animation ===<br />
<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Exports Animation. Also Models/Materials/Collision.<br />
*[http://social.bioware.com/project/2336/ DA:O Importer and Bone Creator] - 3DS max and GMax. Currently Imports Bones from MMH and Animation files. Combatible with the Exporter.<br />
<br />
=== Game data ===<br />
<br />
*[http://social.bioware.com/project/755/ GDApp] - GDApp is a simple editor that natively creates or modifies Dragon Age: Origins GD2A spreadsheet files (*.gda), without the need of Excel files.</div>Eshmehttp://datoolset.net/mw/index.php?title=3rd_party_extensions&diff=127173rd party extensions2010-03-19T10:24:48Z<p>Eshme: I think that a multifold tool can have a multifold description!</p>
<hr />
<div>List 3rd party extensions and applications here!<br />
<br />
== Third party applications ==<br />
<br />
=== Models ===<br />
<br />
* [http://social.bioware.com/project/218/ Tazpn's command line tools] - This packages includes an command line application for converting Dragon Age models from the native format to something that can be manipulated or used a reference for non-derivative works.<br />
* [http://social.bioware.com/project/1060/ GUI for tazpn's Command Line Tools] - This is an easy-to-use program to convert Dragon Age Models utilizing tazpn's Command Line Tools & the Dragon Age Toolset Command Line Tools.<br />
*[http://social.bioware.com/project/41/ DATool: DA model manipulator] - This is a tool for viewing, retexturing and resizing DA models. DATool allows you to easily browse the available DA models and make certain modifications to them.<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Can export static and animatable models. Also Collision,Materials,Animation. Current Version: 1.0.1<br />
*[http://social.bioware.com/project/899/ Blender Import-Export Script] - A set of tools to import-export meshes and extract resources from erf or rim files, all working into Blender.<br />
*[http://social.bioware.com/project/2246/ LightWave import-export plugin] - a plugin for [http://www.newtek.com/lightwave/ NewTek LightWave 3D]. Currently allows to import .msh files into LightWave and export 3d data from Modeler module to .msh.xml format.<br />
*[http://social.bioware.com/project/2312/ Blender-DragonAge Model Converter] - Create and Manipulate level models and props. Feature keywords: Walk mesh, Collision mesh, Lightmapped models...<br />
*[http://social.bioware.com/project/1511/ Lightmap Post Processor] - Remove black artifacts from lightmaps.<br />
<br />
=== Animation ===<br />
<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - 3DS max and GMax. Exports Animation. Also Models/Materials/Collision.<br />
<br />
=== Game data ===<br />
<br />
*[http://social.bioware.com/project/755/ GDApp] - GDApp is a simple editor that natively creates or modifies Dragon Age: Origins GD2A spreadsheet files (*.gda), without the need of Excel files.</div>Eshmehttp://datoolset.net/mw/index.php?title=3rd_party_extensions&diff=127163rd party extensions2010-03-19T10:14:14Z<p>Eshme: </p>
<hr />
<div>List 3rd party extensions and applications here!<br />
<br />
== Third party applications ==<br />
<br />
=== Models ===<br />
<br />
* [http://social.bioware.com/project/218/ Tazpn's command line tools] - This packages includes an command line application for converting Dragon Age models from the native format to something that can be manipulated or used a reference for non-derivative works.<br />
* [http://social.bioware.com/project/1060/ GUI for tazpn's Command Line Tools] - This is an easy-to-use program to convert Dragon Age Models utilizing tazpn's Command Line Tools & the Dragon Age Toolset Command Line Tools.<br />
*[http://social.bioware.com/project/41/ DATool: DA model manipulator] - This is a tool for viewing, retexturing and resizing DA models. DATool allows you to easily browse the available DA models and make certain modifications to them.<br />
*[http://social.bioware.com/project/563/ DA:O Toolset Model Exporter] - Project to create a 3DSMax exporter script. Current Version: 1.0.1<br />
*[http://social.bioware.com/project/899/ Blender Import-Export Script] - A set of tools to import-export meshes and extract resources from erf or rim files, all working into Blender.<br />
*[http://social.bioware.com/project/2246/ LightWave import-export plugin] - a plugin for [http://www.newtek.com/lightwave/ NewTek LightWave 3D]. Currently allows to import .msh files into LightWave and export 3d data from Modeler module to .msh.xml format.<br />
*[http://social.bioware.com/project/2312/ Blender-DragonAge Model Converter] - Create and Manipulate level models and props. Feature keywords: Walk mesh, Collision mesh, Lightmapped models...<br />
*[http://social.bioware.com/project/1511/ Lightmap Post Processor] - Remove black artifacts from lightmaps.<br />
<br />
=== Game data ===<br />
<br />
*[http://social.bioware.com/project/755/ GDApp] - GDApp is a simple editor that natively creates or modifies Dragon Age: Origins GD2A spreadsheet files (*.gda), without the need of Excel files.</div>Eshmehttp://datoolset.net/mw/index.php?title=Talk:GFF&diff=12536Talk:GFF2010-03-15T22:51:28Z<p>Eshme: /* Field information incorrect */</p>
<hr />
<div>Here's some more info on it for consideration. As is, the wiki article leaves you to guess at a lot of what's going on. Listing it here for now so I don't lose track of it.<br />
* http://social.bioware.com/forum/1/topic/8/index/464166<br />
* http://social.bioware.com/forum/1/topic/72/index/508109<br />
--[[User:FollowTheGourd|FollowTheGourd]] 06:56, 26 January 2010 (UTC)<br />
<br />
----<br />
== Field information incorrect ==<br />
After checking a .das file with the GFF editor that comes with the toolset, it would appear that FieldType is TypeID *then* flags. Also the flags are Reference (MSB, bit 16), List (bit 15), and Struct (bit 14).<br />
<br />
This can be verified with:<br />
<br />
<pre><br />
# let data be an array of the gff file<br />
# let offset be the start of a field in the field array<br />
(id, type, flags, index) = unpack("I H H I),data[offset:offset+12])<br />
<br />
isList = (flags & (1 << 15) >0)<br />
isStruct = (flags & (1 << 14) >0)<br />
isRef = (flags & (1 << 16) >0)<br />
</pre><br />
<br />
Given this, I'm going to change the page. If I'm incorrect, feel free to revert and explain why here.<br />
<br />
--[[User:Overture1943|Overture1943]] 19:22, 6 November 2009 (UTC)<br />
<br />
:I say this is not easy, however i think the original was correct. I dont have big explanation at hand, the Bonesused List in MMH for example has Bit 1 set. The "Generic List" has Bit 1 and 3 set (Where with Bit3 Data contains a Struct reference). And lastly "Struct List" has Bit 1 and 2 set. (Where with bit2 the Data contains the Struct itself) All of them data are referenced in itself, however i think that is a given for Lists. <br />
:With which if only Bit3 is set, then the Data isnt referenced, but a struct is referenced ,and it is not a list or so it seems to me. [[User:Eshme|Eshme]] 07:25, 15 March 2010 (UTC)<br />
::This appears true in GAD files as well, solely Bit1 is set for a Float32 list. [[User:Eshme|Eshme]] 22:51, 15 March 2010 (UTC)</div>Eshmehttp://datoolset.net/mw/index.php?title=Talk:GFF&diff=12532Talk:GFF2010-03-15T07:25:55Z<p>Eshme: /* Field information incorrect */</p>
<hr />
<div>Here's some more info on it for consideration. As is, the wiki article leaves you to guess at a lot of what's going on. Listing it here for now so I don't lose track of it.<br />
* http://social.bioware.com/forum/1/topic/8/index/464166<br />
* http://social.bioware.com/forum/1/topic/72/index/508109<br />
--[[User:FollowTheGourd|FollowTheGourd]] 06:56, 26 January 2010 (UTC)<br />
<br />
----<br />
== Field information incorrect ==<br />
After checking a .das file with the GFF editor that comes with the toolset, it would appear that FieldType is TypeID *then* flags. Also the flags are Reference (MSB, bit 16), List (bit 15), and Struct (bit 14).<br />
<br />
This can be verified with:<br />
<br />
<pre><br />
# let data be an array of the gff file<br />
# let offset be the start of a field in the field array<br />
(id, type, flags, index) = unpack("I H H I),data[offset:offset+12])<br />
<br />
isList = (flags & (1 << 15) >0)<br />
isStruct = (flags & (1 << 14) >0)<br />
isRef = (flags & (1 << 16) >0)<br />
</pre><br />
<br />
Given this, I'm going to change the page. If I'm incorrect, feel free to revert and explain why here.<br />
<br />
--[[User:Overture1943|Overture1943]] 19:22, 6 November 2009 (UTC)<br />
<br />
:I say this is not easy, however i think the original was correct. I dont have big explanation at hand, the Bonesused List in MMH for example has Bit 1 set. The "Generic List" has Bit 1 and 3 set (Where with Bit3 Data contains a Struct reference). And lastly "Struct List" has Bit 1 and 2 set. (Where with bit2 the Data contains the Struct itself) All of them data are referenced in itself, however i think that is a given for Lists. <br />
:With which if only Bit3 is set, then the Data isnt referenced, but a struct is referenced ,and it is not a list or so it seems to me. [[User:Eshme|Eshme]] 07:25, 15 March 2010 (UTC)</div>Eshmehttp://datoolset.net/mw/index.php?title=Talk:GFF&diff=12531Talk:GFF2010-03-15T07:25:47Z<p>Eshme: /* Field information incorrect */</p>
<hr />
<div>Here's some more info on it for consideration. As is, the wiki article leaves you to guess at a lot of what's going on. Listing it here for now so I don't lose track of it.<br />
* http://social.bioware.com/forum/1/topic/8/index/464166<br />
* http://social.bioware.com/forum/1/topic/72/index/508109<br />
--[[User:FollowTheGourd|FollowTheGourd]] 06:56, 26 January 2010 (UTC)<br />
<br />
----<br />
== Field information incorrect ==<br />
After checking a .das file with the GFF editor that comes with the toolset, it would appear that FieldType is TypeID *then* flags. Also the flags are Reference (MSB, bit 16), List (bit 15), and Struct (bit 14).<br />
<br />
This can be verified with:<br />
<br />
<pre><br />
# let data be an array of the gff file<br />
# let offset be the start of a field in the field array<br />
(id, type, flags, index) = unpack("I H H I),data[offset:offset+12])<br />
<br />
isList = (flags & (1 << 15) >0)<br />
isStruct = (flags & (1 << 14) >0)<br />
isRef = (flags & (1 << 16) >0)<br />
</pre><br />
<br />
Given this, I'm going to change the page. If I'm incorrect, feel free to revert and explain why here.<br />
<br />
--[[User:Overture1943|Overture1943]] 19:22, 6 November 2009 (UTC)<br />
<br />
:I say this is not easy, however i think the original was correct. I dont have big explanation at hand, the Bonesused List in MMH for example has Bit 1 set. The "Generic List" has Bit 1 and 3 set (Where with Bit3 Data contains a Struct reference). And lastly "Struct List" has Bit 1 and 2 set. (Where with bit2 the Data contains the Struct itself) All of them data are referenced in itself, however i think that is a given for Lists. <br />
With which if only Bit3 is set, then the Data isnt referenced, but a struct is referenced ,and it is not a list or so it seems to me. [[User:Eshme|Eshme]] 07:25, 15 March 2010 (UTC)</div>Eshmehttp://datoolset.net/mw/index.php?title=ANI&diff=12183ANI2010-02-25T20:43:34Z<p>Eshme: /* Example .ANI.xml File */</p>
<hr />
<div>Animation sequence: holds single animation sequence. These are created via external Tools. See Article: [[3rd party extensions]]<br />
<br />
[[Model|Models]] ,which are animatable, will be animated with a animation sequence. See Article: [[Model]]<br />
<br />
== ani.xml schema ==<br />
<br />
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format. For a free converter/verifier, see [http://code.google.com/p/jing-trang/].<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><br />
<start><br />
<element name="Animation"><br />
<optional><br />
<attribute name="Additive"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IgnoreScale"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Length"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="Override"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="QuaternionCompressedSize"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<element name="Meta"><br />
<element name="CombatRange"><br />
<attribute name="Value"><br />
<data type="decimal"/><br />
</attribute><br />
</element><br />
<optional><br />
<element name="GOBAnim"><br />
<attribute name="Value"><br />
<data type="integer"/><br />
</attribute><br />
</element><br />
</optional><br />
</element><br />
</optional><br />
<zeroOrMore><br />
<element name="AnimationNode"><br />
<attribute name="Elements"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="ExportName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<attribute name="Source"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SourceType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Target"><br />
<data type="NCName"/><br />
</attribute><br />
<element name="KeyFrame"><br />
<text/><br />
</element><br />
</element><br />
</zeroOrMore><br />
</element><br />
</start><br />
</grammar><br />
</pre><br />
<br />
== Example .ANI.xml File ==<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<Animation Length="decimal" Name="string"><br />
<!-- Attributes:<br />
Length is the length of the animation in seconds<br />
Name is the name of the animation<br />
--><br />
<!-- Optional Attributes: <br />
Additive="string" -- true or false (additive or rigid)<br />
IgnoreScale="string" -- probably true or false<br />
Override="string" -- probably true or false<br />
QuaternionCompressedSize="int" -- size of compressed quaternion in bits (32 or 64)<br />
--><br />
<br />
<!-- Optional Element --><br />
<Meta><br />
<CombatRange Value="decimal"/><br />
<!-- Optional Element --><br />
<GOBAnim Value="int"/> 1 or 0, enables "GAD" Transform (allows free horizontal movement of the actor), requires GOB transformation and rotation values<br />
</Meta><br />
<br />
<!-- 0 or more of these, obviously having at least one would be usefull... It appears that each bone or node (not nodemeshes) gets one --><br />
<AnimationNode Elements="int" ExportName="?string?" Source="string" Target="string" SourceType="string"><br />
<!-- Attributes:<br />
Element refers to the number of elements in the data type. eg: 3 for a vector, 4 for a quaternion<br />
ExportName is the name the node will take on export<br />
Source is the type of the source <br />
Target is the type of the target<br />
SourceType seems to always be "KeyFrame"<br />
--><br />
<!-- Notes:<br />
For the Source and Target I have seen "Vector", "Quaternion", "Float32" and "Color4" with Elements="3", Elements="4", <br />
Elements="1" and Elements="4" respectively<br />
Vector was used for position info, Quaternion for rotation info, Float32 and Color4 for vfx info like birthrate, alpha and colour<br />
--><br />
<KeyFrame><br />
data <!-- starts with <![CDATA[ followed with lines of the format "time ntuple" where time is the time in seconds of the<br />
keyframe and ntuple is the components of the source type (the 3 elements in a vector or 4 elements in a quaternion or 1 element in a float)<br />
Therefore there will be Element+1 numbers per line<br />
ends with ]]><br />
--><br />
</KeyFrame><br />
</AnimationNode><br />
</Animation><br />
</pre><br />
<br />
<br />
[[Category:File types]]<br />
[[Category:Animations]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ANI&diff=12182ANI2010-02-25T20:41:23Z<p>Eshme: /* Example .ANI.xml File */</p>
<hr />
<div>Animation sequence: holds single animation sequence. These are created via external Tools. See Article: [[3rd party extensions]]<br />
<br />
[[Model|Models]] ,which are animatable, will be animated with a animation sequence. See Article: [[Model]]<br />
<br />
== ani.xml schema ==<br />
<br />
See [http://www.oasis-open.org/committees/relax-ng/spec.html] for information on the RELAX NG 1.0 XML schema format. For a free converter/verifier, see [http://code.google.com/p/jing-trang/].<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<grammar ns="" xmlns="http://relaxng.org/ns/structure/1.0" datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"><br />
<start><br />
<element name="Animation"><br />
<optional><br />
<attribute name="Additive"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="IgnoreScale"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<attribute name="Length"><br />
<data type="decimal"/><br />
</attribute><br />
<attribute name="Name"><br />
<data type="NCName"/><br />
</attribute><br />
<optional><br />
<attribute name="Override"><br />
<data type="NCName"/><br />
</attribute><br />
</optional><br />
<optional><br />
<attribute name="QuaternionCompressedSize"><br />
<data type="integer"/><br />
</attribute><br />
</optional><br />
<optional><br />
<element name="Meta"><br />
<element name="CombatRange"><br />
<attribute name="Value"><br />
<data type="decimal"/><br />
</attribute><br />
</element><br />
<optional><br />
<element name="GOBAnim"><br />
<attribute name="Value"><br />
<data type="integer"/><br />
</attribute><br />
</element><br />
</optional><br />
</element><br />
</optional><br />
<zeroOrMore><br />
<element name="AnimationNode"><br />
<attribute name="Elements"><br />
<data type="integer"/><br />
</attribute><br />
<attribute name="ExportName"><br />
<data type="NMTOKEN"/><br />
</attribute><br />
<attribute name="Source"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="SourceType"><br />
<data type="NCName"/><br />
</attribute><br />
<attribute name="Target"><br />
<data type="NCName"/><br />
</attribute><br />
<element name="KeyFrame"><br />
<text/><br />
</element><br />
</element><br />
</zeroOrMore><br />
</element><br />
</start><br />
</grammar><br />
</pre><br />
<br />
== Example .ANI.xml File ==<br />
<br />
<pre><br />
<?xml version="1.0" encoding="UTF-8"?><br />
<Animation Length="decimal" Name="string"><br />
<!-- Attributes:<br />
Length is the length of the animation in seconds<br />
Name is the name of the animation<br />
--><br />
<!-- Optional Attributes: <br />
Additive="string" -- true or false (additive or rigid)<br />
IgnoreScale="string" -- probably true or false<br />
Override="string" -- probably true or false<br />
QuaternionCompressedSize="int" -- size of compressed quaternion in bits (32 or 64)<br />
--><br />
<br />
<!-- Optional Element --><br />
<Meta><br />
<CombatRange Value="decimal"/><br />
<!-- Optional Element --><br />
<GOBAnim Value="int"/><br />
</Meta><br />
<br />
<!-- 0 or more of these, obviously having at least one would be usefull... It appears that each bone or node (not nodemeshes) gets one --><br />
<AnimationNode Elements="int" ExportName="?string?" Source="string" Target="string" SourceType="string"><br />
<!-- Attributes:<br />
Element refers to the number of elements in the data type. eg: 3 for a vector, 4 for a quaternion<br />
ExportName is the name the node will take on export<br />
Source is the type of the source <br />
Target is the type of the target<br />
SourceType seems to always be "KeyFrame"<br />
--><br />
<!-- Notes:<br />
For the Source and Target I have seen "Vector", "Quaternion", "Float32" and "Color4" with Elements="3", Elements="4", <br />
Elements="1" and Elements="4" respectively<br />
Vector was used for position info, Quaternion for rotation info, Float32 and Color4 for vfx info like birthrate, alpha and colour<br />
--><br />
<KeyFrame><br />
data <!-- starts with <![CDATA[ followed with lines of the format "time ntuple" where time is the time in seconds of the<br />
keyframe and ntuple is the components of the source type (the 3 elements in a vector or 4 elements in a quaternion or 1 element in a float)<br />
Therefore there will be Element+1 numbers per line<br />
ends with ]]><br />
--><br />
</KeyFrame><br />
</AnimationNode><br />
</Animation><br />
</pre><br />
<br />
<br />
[[Category:File types]]<br />
[[Category:Animations]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Naming_conventions&diff=12053Naming conventions2010-02-24T18:11:05Z<p>Eshme: /* See Also */</p>
<hr />
<div>BioWare's resources follow a naming convention which allows for easy management and easy location of resources needed. When creating new resources it is a good idea to follow the existing naming convention (or your own scheme if you have a preferred one), to differentiate your work from that of others and to help you keep your resources organized.<br />
<br />
For the most part the names you give your resources will matter only to you, there are very few situations where the toolset pays attention to the specific form that a resource name takes. So provided you're working on your own any naming convention that suits your particular style will suffice.<br />
<br />
Although only one campaign is loaded at a time in game, unintended conflict can arise between the campaign and any core resource mods the player may have installed. If two design resources have the same name, only one will load. This is determined by the [[Source directory priorities]]. So, it's good to choose names that are likely to be unique. <br />
<br />
Usually resources are separated by underscores into categories and have prefixes sorting them based on a certain main class, or suffixes giving them certain variations.<br />
<br />
__TOC__<br />
<br />
== Resource Naming Convention ==<br />
<br />
Design resource names are free-form. As a matter of convenience and courtesy to players, you might prefer to follow a convention that reduces the risk of conflict between add-ins and improves compatibility with future Bioware releases. Bear in mind that only one resource with a given name will load in game. <br />
<br />
For simple mods, it might be sufficient to use a unique resource name prefix which is unlikely to be used by anyone else.<br />
<br />
Larger mods and campaigns may prefer a more professional approach which makes scripting more legible by identifying the resource type etc.<br />
<br />
In either case, it would be wise to avoid a prefix that Bioware has already used, such as "gen". <br />
<br />
The convention used in the main Single Player campaign of Dragon Age is as follows:<br />
<br />
<pre>cir200cr_bloodmage</pre><br />
<br />
*Three-letter prefix indicating which large-scale area of the game the resource begins to (particular origin story, prelude, etc) or "gen" for global resources.<br />
*three-digit number unique to a particular area, generally starting with 100 and incrementing in hundreds for major areas. Accessory areas are given numbers within the block of one hundred that their 'parent' area belongs to. "global" resources are often given the number 000.<br />
*two-letter code indicating what general type of resource it is ("ar" for area, "al" for area list, "ip" for placeable, "cr" for creature, "im" for item, "tr" for trigger, "pt" for plot, "st" for stage, "cs" for cutscene, "wp" for waypoint). A major exception here is event scripts, which have exactly the same name as the resource they're the script for. Dialogue files are also generally named exactly the same as their owner resource. Merchants usually have the owner name, with the prefix "store_".<br />
*An underscore.<br />
*The remainder of the name is free-form and human-readable, a descriptive term to remind you at a glance what the resource is.<br />
<br />
== Model File Naming Convention ==<br />
<br />
=== Items ===<br />
<br />
<pre>[MainClass]_[MODELTYPE]_[MODELSUBTYPE][MODELVARIATION]_[LOD].MMH / PHY <br />
<br />
[ef]_[rob]_[enc][a]_[0].mmh (ef_rob_enca_0.mmh)</pre><br />
<br />
*Where [MainClass] is of General type of a Model. The Toolset will build the MainClass based on Race/Gender/Itemtype etc, so this must be correct. (see below)<br />
*[MODELTYPE] as defined with [[2DA|2DAs]]. Typically a short name describing the Model ie. Wolf. See: [[ItemVariations.xls]]<br />
*[MODELSUBTYPE] is optional as defined with [[2DA|2DAs]]. Typically a short name describing different Variations of a Model. See: [[ItemVariations.xls]]<br />
*[MODELVARIATION] is optional as defined with [[2DA|2DAs]]. Typically one letter a, b, c describing further Variations. See: [[ItemVariations.xls]]<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. Options are dependant on resourcetype, however 0 is always required if LOD is applicable.<br />
<br />
=== Creatures ===<br />
<br />
<pre>[MainClass]+[ModelName]_[LOD].MMH / PHY<br />
<br />
[c]_[deepstkra]_[0].mmh (c_deepstkra_0.mmh)</pre><br />
<br />
*[MainClass] is the general type of the model. When no override is set in [[APR base.xls]], the toolset will generate it based on race and gender. (see below)<br />
*[ModelName] is the Modelname (including mainclass) described in [[APR base.xls]]. When no Modelname is given, and Modeltype is P, the toolset will generate it based on [[NakedVariations.xls]] (unsure)<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. Options are dependant on resourcetype, however 0 is always required if LOD is applicable. <br />
<br />
This accounts for the game being able to locate a [[MMH]] via 2DA definitions. [[MSH]] / [[MAO]] / [[DDS]] Files are referenced by the MMH and each other but follow similar schemes.<br />
<br />
=== Model Main Class Naming Convention ===<br />
<br />
*base<br />
*blk - black boxes of various sizes and proportions, used to obscure the portions of models that lie "outside" an interior level where the player shouldn't be able to see.<br />
*c - creature<br />
*cai - Cave Int. <br />
*cav - Caves<br />
*cdr - Cave Deep Road<br />
*che - Chantry Exterior<br />
*chi - Chantry Interior<br />
*cn - Commmon Body Meshes <br />
*cs<br />
*df - dwarf female accessories and components<br />
*dm - dwarf male accessories and components<br />
*dne - dwarf noble exterior level pieces<br />
*dni - dwarf noble interior level pieces<br />
*dse - Dwarf Slum Exterior<br />
*dsi - Dwarf Slum Interior<br />
*dwe - Dwarven Exterior (Orzammar City) <br />
*dwi - Dwarven Interior<br />
*ef - elf female accessories and components<br />
*el<br />
*em - elf male accessories and components<br />
*fca - Fereldan Castle<br />
*fce - Fereldan Castle/City Exterior <br />
*fci - Fereldan Castle Interior<br />
*fde<br />
*fdi - Fereldan Dungeon Interior<br />
*fhe - Fereldan Human Exterior<br />
*fhec<br />
*fhi - Ferelden Human Interior<br />
*fne - Ferelden noble exterior level pieces<br />
*frt<br />
*fti - Fereldan Town Interior<br />
*ftr<br />
*fve - Fereldan Village Exterior<br />
*fx - Effects<br />
*fxa<br />
*fxc<br />
*fxe<br />
*fxg<br />
*fxm<br />
*fxp<br />
*hf - human female accessories and components<br />
*hm - human male accessories and components<br />
*hro - Hero Sets<br />
*kn<br />
*lightrig<br />
*material<br />
*nm<br />
*pf - Female specific Gear<br />
*plc - placeables<br />
*pm - Male or Genderless specific Gear<br />
*pn - <br />
*prp - props<br />
*prv<br />
*qm<br />
*sb - Skybox<br />
*sca<br />
*sr<br />
*tce - Tevinter Castle Exterior<br />
*tci - Tevinter Castle Interior<br />
*tfi - Tevinter Fade Interior<br />
*tools - models used by the toolset<br />
*trn<br />
*tti - Tevinter Tower Interior<br />
*tve - Tevinter Exterior<br />
*tvi - Tevinter Interior<br />
*tvm<br />
*ue<br />
*uem - Face Bits <br />
*uh - Face Bits <br />
*uhm - Face Bits <br />
*ul<br />
*ulm - eyelashes<br />
*v<br />
*vfx - Visual Effects<br />
*vis - Vista Objects<br />
*vst - Vista Objects<br />
*w - weapon models<br />
*water - waterfall pieces<br />
*zz - models used in debugging<br />
<br />
== Voice Over File Naming Convention ==<br />
<br />
<pre>[LineID]_m.WAV</pre><br />
<br />
*with [LineID] replaced by the ID number for the conversation line's string table entry.<br />
<br />
This accounts for being able to locate thousands of VO lines, when assigning them to their conversation line.<br />
<br />
See [[voice over]] for more information on how to manage voice over recording.<br />
<br />
== Animation File Naming Convention ==<br />
<br />
<pre>mh.dg_5p_tn_l_45.ANI</pre><br />
<br />
The various parts of the animation name gives you information about the type of animation. This for example means "male human dialogue 5 paces turn left 45 degrees."<br />
<br />
All humanoid animations prefix with mh. (male human). There is also a small list of fh (female human), These work across all races pretty much.<br />
<br />
After the prefix you have the following:<br />
*2p - a 2 person animation... usually lined up (i.e. give and receive, punch and punched, kiss and kissed)<br />
*am - ambient... full animations that so specific actions (i.e. blacksmith, cheering, clean floor)<br />
*cb - combat animations<br />
*cu - custom animation, usually for a specific cutscene or purpose<br />
*dg - dialog... animation fpr the purpose of use within dialogs (although we use all these animations)<br />
*po - pose based animations - these are specific poses and gestures for talking dialogs<br />
*wi - world interaction - similar to ambient but more about interacting with world objects (desks, leaning, sitting)<br />
<br />
After the above second prefix the rest is usually descriptive (or some what). Key thing to note:<br />
*en - enter animation... this is the animation that gets the actor doing the animation... usually from a standing neutral position<br />
*lp - looping animation - this is the animation that loops to keep the actor in a pose or position<br />
*ex - exit animation - this is the animation that gets the actor out of the lp animation... usually to a standing neutral position<br />
*tw - twitch, an animation that plays from the lp animation<br />
<br />
So, for example:<br />
*mh.wi_sit_en - animation goes from standing neutral to sitting<br />
*mh.wi_sit_lp - animation loops in the sitting pose<br />
*mh.wi_sit_ex - animation goes from sitting to standing neutral<br />
*mh.wi_sit_tw1 - an animation that plays from sit_lp, such as someone scratching their head<br />
<br />
== Vegetation (Speedtree) File Naming Convention ==<br />
<br />
<pre>tre c oakfixl.SPT</pre><br />
<br />
Vegetation is sorted in main categories via Prefix:<br />
<br />
*bsh - Bushes<br />
*gra - Grass<br />
*tre - Trees<br />
<br />
The last part is a short description of the vegetation type, ie Oak, which is a Oaktree.<br />
<br />
== See Also == <br />
<br />
*[[Art Resources]]<br />
*[[Designer Resources]]<br />
<br />
<br />
[[Category:Art resources]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Naming_conventions&diff=12052Naming conventions2010-02-24T18:09:16Z<p>Eshme: /* Creatures */</p>
<hr />
<div>BioWare's resources follow a naming convention which allows for easy management and easy location of resources needed. When creating new resources it is a good idea to follow the existing naming convention (or your own scheme if you have a preferred one), to differentiate your work from that of others and to help you keep your resources organized.<br />
<br />
For the most part the names you give your resources will matter only to you, there are very few situations where the toolset pays attention to the specific form that a resource name takes. So provided you're working on your own any naming convention that suits your particular style will suffice.<br />
<br />
Although only one campaign is loaded at a time in game, unintended conflict can arise between the campaign and any core resource mods the player may have installed. If two design resources have the same name, only one will load. This is determined by the [[Source directory priorities]]. So, it's good to choose names that are likely to be unique. <br />
<br />
Usually resources are separated by underscores into categories and have prefixes sorting them based on a certain main class, or suffixes giving them certain variations.<br />
<br />
__TOC__<br />
<br />
== Resource Naming Convention ==<br />
<br />
Design resource names are free-form. As a matter of convenience and courtesy to players, you might prefer to follow a convention that reduces the risk of conflict between add-ins and improves compatibility with future Bioware releases. Bear in mind that only one resource with a given name will load in game. <br />
<br />
For simple mods, it might be sufficient to use a unique resource name prefix which is unlikely to be used by anyone else.<br />
<br />
Larger mods and campaigns may prefer a more professional approach which makes scripting more legible by identifying the resource type etc.<br />
<br />
In either case, it would be wise to avoid a prefix that Bioware has already used, such as "gen". <br />
<br />
The convention used in the main Single Player campaign of Dragon Age is as follows:<br />
<br />
<pre>cir200cr_bloodmage</pre><br />
<br />
*Three-letter prefix indicating which large-scale area of the game the resource begins to (particular origin story, prelude, etc) or "gen" for global resources.<br />
*three-digit number unique to a particular area, generally starting with 100 and incrementing in hundreds for major areas. Accessory areas are given numbers within the block of one hundred that their 'parent' area belongs to. "global" resources are often given the number 000.<br />
*two-letter code indicating what general type of resource it is ("ar" for area, "al" for area list, "ip" for placeable, "cr" for creature, "im" for item, "tr" for trigger, "pt" for plot, "st" for stage, "cs" for cutscene, "wp" for waypoint). A major exception here is event scripts, which have exactly the same name as the resource they're the script for. Dialogue files are also generally named exactly the same as their owner resource. Merchants usually have the owner name, with the prefix "store_".<br />
*An underscore.<br />
*The remainder of the name is free-form and human-readable, a descriptive term to remind you at a glance what the resource is.<br />
<br />
== Model File Naming Convention ==<br />
<br />
=== Items ===<br />
<br />
<pre>[MainClass]_[MODELTYPE]_[MODELSUBTYPE][MODELVARIATION]_[LOD].MMH / PHY <br />
<br />
[ef]_[rob]_[enc][a]_[0].mmh (ef_rob_enca_0.mmh)</pre><br />
<br />
*Where [MainClass] is of General type of a Model. The Toolset will build the MainClass based on Race/Gender/Itemtype etc, so this must be correct. (see below)<br />
*[MODELTYPE] as defined with [[2DA|2DAs]]. Typically a short name describing the Model ie. Wolf. See: [[ItemVariations.xls]]<br />
*[MODELSUBTYPE] is optional as defined with [[2DA|2DAs]]. Typically a short name describing different Variations of a Model. See: [[ItemVariations.xls]]<br />
*[MODELVARIATION] is optional as defined with [[2DA|2DAs]]. Typically one letter a, b, c describing further Variations. See: [[ItemVariations.xls]]<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. Options are dependant on resourcetype, however 0 is always required if LOD is applicable.<br />
<br />
=== Creatures ===<br />
<br />
<pre>[MainClass]+[ModelName]_[LOD].MMH / PHY<br />
<br />
[c]_[deepstkra]_[0].mmh (c_deepstkra_0.mmh)</pre><br />
<br />
*[MainClass] is the general type of the model. When no override is set in [[APR base.xls]], the toolset will generate it based on race and gender. (see below)<br />
*[ModelName] is the Modelname (including mainclass) described in [[APR base.xls]]. When no Modelname is given, and Modeltype is P, the toolset will generate it based on [[NakedVariations.xls]] (unsure)<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. Options are dependant on resourcetype, however 0 is always required if LOD is applicable. <br />
<br />
This accounts for the game being able to locate a [[MMH]] via 2DA definitions. [[MSH]] / [[MAO]] / [[DDS]] Files are referenced by the MMH and each other but follow similar schemes.<br />
<br />
=== Model Main Class Naming Convention ===<br />
<br />
*base<br />
*blk - black boxes of various sizes and proportions, used to obscure the portions of models that lie "outside" an interior level where the player shouldn't be able to see.<br />
*c - creature<br />
*cai - Cave Int. <br />
*cav - Caves<br />
*cdr - Cave Deep Road<br />
*che - Chantry Exterior<br />
*chi - Chantry Interior<br />
*cn - Commmon Body Meshes <br />
*cs<br />
*df - dwarf female accessories and components<br />
*dm - dwarf male accessories and components<br />
*dne - dwarf noble exterior level pieces<br />
*dni - dwarf noble interior level pieces<br />
*dse - Dwarf Slum Exterior<br />
*dsi - Dwarf Slum Interior<br />
*dwe - Dwarven Exterior (Orzammar City) <br />
*dwi - Dwarven Interior<br />
*ef - elf female accessories and components<br />
*el<br />
*em - elf male accessories and components<br />
*fca - Fereldan Castle<br />
*fce - Fereldan Castle/City Exterior <br />
*fci - Fereldan Castle Interior<br />
*fde<br />
*fdi - Fereldan Dungeon Interior<br />
*fhe - Fereldan Human Exterior<br />
*fhec<br />
*fhi - Ferelden Human Interior<br />
*fne - Ferelden noble exterior level pieces<br />
*frt<br />
*fti - Fereldan Town Interior<br />
*ftr<br />
*fve - Fereldan Village Exterior<br />
*fx - Effects<br />
*fxa<br />
*fxc<br />
*fxe<br />
*fxg<br />
*fxm<br />
*fxp<br />
*hf - human female accessories and components<br />
*hm - human male accessories and components<br />
*hro - Hero Sets<br />
*kn<br />
*lightrig<br />
*material<br />
*nm<br />
*pf - Female specific Gear<br />
*plc - placeables<br />
*pm - Male or Genderless specific Gear<br />
*pn - <br />
*prp - props<br />
*prv<br />
*qm<br />
*sb - Skybox<br />
*sca<br />
*sr<br />
*tce - Tevinter Castle Exterior<br />
*tci - Tevinter Castle Interior<br />
*tfi - Tevinter Fade Interior<br />
*tools - models used by the toolset<br />
*trn<br />
*tti - Tevinter Tower Interior<br />
*tve - Tevinter Exterior<br />
*tvi - Tevinter Interior<br />
*tvm<br />
*ue<br />
*uem - Face Bits <br />
*uh - Face Bits <br />
*uhm - Face Bits <br />
*ul<br />
*ulm - eyelashes<br />
*v<br />
*vfx - Visual Effects<br />
*vis - Vista Objects<br />
*vst - Vista Objects<br />
*w - weapon models<br />
*water - waterfall pieces<br />
*zz - models used in debugging<br />
<br />
== Voice Over File Naming Convention ==<br />
<br />
<pre>[LineID]_m.WAV</pre><br />
<br />
*with [LineID] replaced by the ID number for the conversation line's string table entry.<br />
<br />
This accounts for being able to locate thousands of VO lines, when assigning them to their conversation line.<br />
<br />
See [[voice over]] for more information on how to manage voice over recording.<br />
<br />
== Animation File Naming Convention ==<br />
<br />
<pre>mh.dg_5p_tn_l_45.ANI</pre><br />
<br />
The various parts of the animation name gives you information about the type of animation. This for example means "male human dialogue 5 paces turn left 45 degrees."<br />
<br />
All humanoid animations prefix with mh. (male human). There is also a small list of fh (female human), These work across all races pretty much.<br />
<br />
After the prefix you have the following:<br />
*2p - a 2 person animation... usually lined up (i.e. give and receive, punch and punched, kiss and kissed)<br />
*am - ambient... full animations that so specific actions (i.e. blacksmith, cheering, clean floor)<br />
*cb - combat animations<br />
*cu - custom animation, usually for a specific cutscene or purpose<br />
*dg - dialog... animation fpr the purpose of use within dialogs (although we use all these animations)<br />
*po - pose based animations - these are specific poses and gestures for talking dialogs<br />
*wi - world interaction - similar to ambient but more about interacting with world objects (desks, leaning, sitting)<br />
<br />
After the above second prefix the rest is usually descriptive (or some what). Key thing to note:<br />
*en - enter animation... this is the animation that gets the actor doing the animation... usually from a standing neutral position<br />
*lp - looping animation - this is the animation that loops to keep the actor in a pose or position<br />
*ex - exit animation - this is the animation that gets the actor out of the lp animation... usually to a standing neutral position<br />
*tw - twitch, an animation that plays from the lp animation<br />
<br />
So, for example:<br />
*mh.wi_sit_en - animation goes from standing neutral to sitting<br />
*mh.wi_sit_lp - animation loops in the sitting pose<br />
*mh.wi_sit_ex - animation goes from sitting to standing neutral<br />
*mh.wi_sit_tw1 - an animation that plays from sit_lp, such as someone scratching their head<br />
<br />
== Vegetation (Speedtree) File Naming Convention ==<br />
<br />
<pre>tre c oakfixl.SPT</pre><br />
<br />
Vegetation is sorted in main categories via Prefix:<br />
<br />
*bsh - Bushes<br />
*gra - Grass<br />
*tre - Trees<br />
<br />
The last part is a short description of the vegetation type, ie Oak, which is a Oaktree.<br />
<br />
== See Also == <br />
<br />
*[[Art Resources]]<br />
*[[Designer Resources]]<br />
*[[Module tutorial#Organization]]<br />
<br />
<br />
[[Category:Art resources]]</div>Eshmehttp://datoolset.net/mw/index.php?title=APR_base.xls&diff=12050APR base.xls2010-02-24T18:06:59Z<p>Eshme: </p>
<hr />
<div>{{infobox creature}}<br />
<br />
This [[2DA]] defines base appearances, such as "Hurlock - Normal", used by the creature editor.<br />
<br />
This Excel document has only two worksheets; APR_base and _Creature_Types. Most of the detail is in the APR_base worksheet, _Creature_Types merely lists the basic creature types that are used in the "CREATURE_TYPE" column of APR_base.<br />
<br />
The columns of APR_base are: <br clear="all"/><br />
<br />
{{2da start|APR_base}}<br />
{{2da column| LABEL |string| the name of the appearance type, as seen in the toolset when selecting appearance type for a creature.}}<br />
{{2da column| STRING_REF |int| }}<br />
{{2da column| MODELTYPE |string| sets whether the model is set up to allow interchangeable parts for customization. There are four types of model:<br />
* Simple (S) - Model with only one mesh.<br />
* Welded/Baked (W) - the creature has its own weapon and cannot equip new ones.<br />
* Wield, Head (H) - The creature's head is a separate mesh that can be swapped with other meshes.<br />
* Parts (P) - a fully customizable model that accepts parts such as gloves, boots, and armor. The player races have examples of this kind of model.}}<br />
{{2da column| MODELRACE |string| not sure what this one does. E for elf, D for dwarf, H for human, K for children, N for certain NPCs, and C for a wide variety of other creatures. Appears to match the first letter of the model name. }}<br />
{{2da column| MODELNAME |string| The name of the model file used for this appearance. (See: [[Naming conventions#Model File Naming Convention|Model File Naming Convention]])}}<br />
{{2da column|PlayHumanoidAnimations |bool|}}<br />
{{2da column|MODELGENDEROVERRIDE |bool| Gender is important for loading the models ssociated with an apperance type. Gender will be used as the second letter in the resource. For example: HM_ARM_HVYa corresponds to the armor for a human male. CN_BDY_HLKa is the body for a neutral hurlock. Gender usually comes from the designer toolset. But in some cases only one gender is supported from a model perspective. The letter in this column will be used in those cases to override designer data when loading models (note that this is only used for loading models everywhere else the selection in the designer toolset applies). Valid values are M, F, or N. If you don't want to override the gender (allowing it to be defined in the toolset) use "****".}}<br />
{{2da column|MaxScaleLevel |int|}}<br />
{{2da column|AvoidAOEChance |int| Percentage chance to exit AOE per round }}<br />
{{2da column|RULESRACE|int| A default rules race for each appearance.}}<br />
{{2da column|SYNCHRONIZEDCOMBAT |int| 0 for no synchronized combat, 1 for synchronized combat.}}<br />
{{2da column|AI_ARMOR_TYPE|int| Used by the AI to figure out how tough a creature is.}}<br />
{{2da column|CRUST_EFFECT|int|- defines a visual effect to apply to the creature as a "crust".}}<br />
{{2da column|MODELTREE |string| The main [[blend tree]] name. "Blend tree name" correspond to the value of "Tree Name" field of the Blend tree nodes properties. The Blend trees can be downloaded from the project http://social.bioware.com/project/1331/#files and opened into Toolset for a better understanding.}}<br />
{{2da column|COMBATMODELTREE|string| The [[blend tree]] name used for the animations of the action in combat. This blend tree, groups animations to use when creature perform attacks, avoid attacks, take damage etc.}}<br />
{{2da column|MOVEMENTTREE|string| [[Blend tree]] name used for creature movement}}<br />
{{2da column|COMBATMOIVETREE|string| [[Blend tree]] name used for the animations of the movements in combat. This blend tree, groups animations to use when during combat, creature perform base movements such as walk/run forward, walk/run back, strafe etc.}}<br />
{{2da column|OVERLAYTREE|string|}}<br />
{{2da column|OVERRIDETREE|string|}}<br />
{{2da column|AMBIENTOVERRIDE|string|}}<br />
{{2da column|BLENDCURVES|string|}}<br />
{{2da column|BlendTrees|comment|}}<br />
{{2da column|WEAPONSCALE|float|}}<br />
{{2da column|WEAPONOFFSET|float|}}<br />
{{2da column|BLOODCOLR|string| R for red.}}<br />
{{2da column|ANIM_WALKSPEED|float|Walking speed of the source animation}}<br />
{{2da column|ANIM_RUNSPEED|float|Running speed of the source animation}}<br />
{{2da column|ANIM_CBTSTRFSPEED|float|Combat movement speed of the source animation = distance x 30/# frames}}<br />
{{2da column|ANIM_CBTSPEED|float|Combat movement speed of the source animation}}<br />
{{2da column|GAME_WALKSPEED|float|Desired in-game walking speed of the creature}}<br />
{{2da column|GAME_RUNSPEED|float|Desired in-game running speed of the creature}}<br />
{{2da column|GAME_CBTSTRFSPEED|float|In-game speed for combat walking/strafing}}<br />
{{2da column|GAME_CBTSPEED|float|Deired in-game combat movement speed of the creature}}<br />
{{2da column|AnimationSpeeds|comment|}}<br />
{{2da column|HEIGHT|float|}}<br />
{{2da column|HEIGHT_F|float|Height for females. Used to position the camera in conversations.}}<br />
{{2da column|MODELSCALEX|float|}}<br />
{{2da column|MODELSCALEY|float|}}<br />
{{2da column|MODELSCALEZ|float|}}<br />
{{2da column|ModelSizes|comment|}}<br />
{{2da column|TerrainFollowPitch|float|Max angle in degrees for pitch adjustment in slopes}}<br />
{{2da column|TerrainFollowRoll|float|Max angle in degrees for roll adjustment in slopes}}<br />
{{2da column|TerrainFollowData|comment|}}<br />
{{2da column|HEAD_WORKSHEET|int|number of the 2DA where the selectable heads for this appearance are listed (you can find the number in the M2DA_base file, with the core worksheets organized in the [[Heads.xls]] file.)}}<br />
{{2da column|HAIR_WORKSHEET|int|number of the 2DA where are listed the selectable hair styles for this appearance}}<br />
{{2da column|EYES_WORKSHEET|int|number of the 2DA where are listed the selectable eyes types for this appearance}}<br />
{{2da column|BEARD_WORKSHEET|int|number of the 2DA where are listed the selectable beard styles for this appearance}}<br />
{{2da column|NECK_MODEL|string|}}<br />
{{2da column|Parts|comment|}}<br />
{{2da column|TARGETABLE|bool|}}<br />
{{2da column|disabled_armor_sounds|bool|}}<br />
{{2da column|disabled_weapon_sounds|bool|}}<br />
{{2da column|default_SOUND_set|string|}}<br />
{{2da column|SOUND_Footstep_type|string| column name in sound_movement_footstep}}<br />
{{2da column|SOUND_unarmed |int| material, when creature has no weapon equipped, like: bare hands, claws}}<br />
{{2da column|SOUND_default_armor|int|}}<br />
{{2da column|SOUND_monster_size |string| used for bodyfalls. Values can be "small", "medium", "huge", or "unknown".}}<br />
{{2da column|Sound_X|comment|}}<br />
{{2da column|HasTurnAttacks|bool| 1 is true. Appearance can execute left and right attacks that reorient it 90 degrees.}}<br />
{{2da column|ValidDeathBlows|int|<br />
* -1 Unknown<br />
* 0x0 - standard humanoid<br />
* 0x1 - beast or large creatures<br />
* 0x2 - large creature positional<br />
}}<br />
{{2da column|CREATURE_TYPE| int | Bitfield, with each bit in the integer enabeling a deathblow type (max 32).<br />
* 0x1 - unused<br />
* 0x2 - standard humanoid<br />
* 0x4 - decap (only if neck node present)<br />
* (0x8) creature deathblow<br />
}}<br />
{{2da column|CREATURE_GROUP| int | associates appearances with creature treasure groups in TS_Group.xls. <0 = No Treasure, 0 = Generic Treasure Group, >0 = Specific Treasure Group}}<br />
{{2da column|OneShotKills |int| If set, creature scales to 1 hp only.}}<br />
{{2da column|CanDoDeathblows |int|}}<br />
{{2da column|DefaultEffectFlags|int|<br />
* 1 Disable Movement<br />
* 2 Disable Turning<br />
* 4 Disable combat<br />
* 8 Disable talents<br />
* 16 Disable spells<br />
* 32 Disable skills<br />
* 64 Disable items<br />
* 128 Disable input<br />
}}<br />
{{2da column|PERSPACE |float|}}<br />
{{2da column|MeleeRingUpdateAlways|bool|Force the melee ring to run updates all the time even while the creature is not being attacked. Useful for creatures that can't move or large creatures that have directional abilities.}}<br />
{{2da column|MeleeRingDisabledStart|float|The start angle at which the melee ring will be considered disabled}}<br />
{{2da column|MeleeRingDisabledEnd|float|The end angle at which the melee ring will be considered disabled}}<br />
{{2da column|MeleeRingOffset|float|Offset the main melee ring forward or backwards according to the creature orientation. Value is in meteres. Positive offsets move the ring forward. Range allowed: -0.5 to 0.5 meters}}<br />
{{2da column|MeleeRingsData |comment|}}<br />
{{2da column|bHasAppearAnim|int|0: Creature has no default appear animation<br />
1: Creature does have a default appear animation}}<br />
{{2da column|bHasDisappearAnim|int|0: Creature has no default disappear animation<br />
1: Creature does have a default disappear animation}}<br />
{{2da column|AppearVFX|int|}}<br />
{{2da column|AppearDisappear |comment|}}<br />
{{2da column|bCanBleed|int| determines whether a creature has a blood effect when hit.}}<br />
{{2da column|BloodPool|int| The size of the blood pool that forms under the creature's body when it's killed.<br />
*0-none<br />
*1-small<br />
*2-medium<br />
*3-large<br />
}}<br />
{{2da column|DefaultWeapon|resource|}}<br />
{{2da column|DefaultArmor|resource|}}<br />
{{2da column|CorpseModel|string| A dead creature decays into this model after some time. Note that model "plc_bagcoin03_0" will disappear completely after the user loots its content. So, spells that normally require dead bodies (e.g. to get life or mana) will not work then. For this reason, this model should be used with care. See [[Bodybag]].}}<br />
{{2da column|DecayBehaviour|int|<br />
* 0 = Decay completeley<br />
* 1 = Don't decay, but remove physics (i.e. won't block movement anymore)<br />
* 2 = Don't decay and don't remove physics either<br />
}}<br />
{{2da column|AttackFL|float|Attack angle front left - large creature only}}<br />
{{2da column|AttackFLWidth|float|Width of attack cone}}<br />
{{2da column|AttackFLRing|int|Melee ring ID (for very large creatures)}}<br />
{{2da column|AttackFR|float|}}<br />
{{2da column|AttackFRWidth|float|}}<br />
{{2da column|AttackFRRing|int|Melee ring ID (for very large creatures)}}<br />
{{2da column|AttackBR|float|}}<br />
{{2da column|AttackBRWidth|float|}}<br />
{{2da column|AttackBRRing|int|Melee ring ID (for very large creatures)}}<br />
{{2da column|AttackBL|float|}}<br />
{{2da column|AttackBLWidth|float|}}<br />
{{2da column|AttackBLRing|int|Melee ring ID (for very large creatures)}}<br />
{{2da column|AttackReach|float|Reach of the attacks}}<br />
{{2da column|LargeCreature| comment |}}<br />
{{2da column|CodexPlot|string| Which codex plot contains a page giving information about this creature.}}<br />
{{2da column|CodexFlag|int| Which flag within the given codex plot to set when the first creature of this type is killed by the player.}}<br />
{{2da column|AprRulesFlags|int|0x1 - Count as construct (for damage)}}<br />
{{2da column|bDisableGore|int|Disables all gore updates on the creature via sys_gore_h.nss}}<br />
{{2da column|BumpLevel|int|creature with higher value bumps lower valued creatures (player = 100)}}<br />
{{2da column|AppearanceRestrictionGroup|int| A bit flag indicating which appearance groups this creature belongs to. Abilities can set a condition to restrict use of an ability to a specific appearance group. Only creatures that sport appearances that belong to this group will be allowed to use those abilities.}}<br />
{{2da column|AppearanceRating|float|}}<br />
{{2da column|GroupType|int|}}<br />
{{2da end}}<br />
<br />
[[Category:XLS files]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Naming_conventions&diff=12047Naming conventions2010-02-24T18:02:26Z<p>Eshme: /* Creatures */</p>
<hr />
<div>BioWare's resources follow a naming convention which allows for easy management and easy location of resources needed. When creating new resources it is a good idea to follow the existing naming convention (or your own scheme if you have a preferred one), to differentiate your work from that of others and to help you keep your resources organized.<br />
<br />
For the most part the names you give your resources will matter only to you, there are very few situations where the toolset pays attention to the specific form that a resource name takes. So provided you're working on your own any naming convention that suits your particular style will suffice.<br />
<br />
Although only one campaign is loaded at a time in game, unintended conflict can arise between the campaign and any core resource mods the player may have installed. If two design resources have the same name, only one will load. This is determined by the [[Source directory priorities]]. So, it's good to choose names that are likely to be unique. <br />
<br />
Usually resources are separated by underscores into categories and have prefixes sorting them based on a certain main class, or suffixes giving them certain variations.<br />
<br />
__TOC__<br />
<br />
== Resource Naming Convention ==<br />
<br />
Design resource names are free-form. As a matter of convenience and courtesy to players, you might prefer to follow a convention that reduces the risk of conflict between add-ins and improves compatibility with future Bioware releases. Bear in mind that only one resource with a given name will load in game. <br />
<br />
For simple mods, it might be sufficient to use a unique resource name prefix which is unlikely to be used by anyone else.<br />
<br />
Larger mods and campaigns may prefer a more professional approach which makes scripting more legible by identifying the resource type etc.<br />
<br />
In either case, it would be wise to avoid a prefix that Bioware has already used, such as "gen". <br />
<br />
The convention used in the main Single Player campaign of Dragon Age is as follows:<br />
<br />
<pre>cir200cr_bloodmage</pre><br />
<br />
*Three-letter prefix indicating which large-scale area of the game the resource begins to (particular origin story, prelude, etc) or "gen" for global resources.<br />
*three-digit number unique to a particular area, generally starting with 100 and incrementing in hundreds for major areas. Accessory areas are given numbers within the block of one hundred that their 'parent' area belongs to. "global" resources are often given the number 000.<br />
*two-letter code indicating what general type of resource it is ("ar" for area, "al" for area list, "ip" for placeable, "cr" for creature, "im" for item, "tr" for trigger, "pt" for plot, "st" for stage, "cs" for cutscene, "wp" for waypoint). A major exception here is event scripts, which have exactly the same name as the resource they're the script for. Dialogue files are also generally named exactly the same as their owner resource. Merchants usually have the owner name, with the prefix "store_".<br />
*An underscore.<br />
*The remainder of the name is free-form and human-readable, a descriptive term to remind you at a glance what the resource is.<br />
<br />
== Model File Naming Convention ==<br />
<br />
=== Items ===<br />
<br />
<pre>[MainClass]_[MODELTYPE]_[MODELSUBTYPE][MODELVARIATION]_[LOD].MMH / PHY <br />
<br />
[ef]_[rob]_[enc][a]_[0].mmh (ef_rob_enca_0.mmh)</pre><br />
<br />
*Where [MainClass] is of General type of a Model. The Toolset will build the MainClass based on Race/Gender/Itemtype etc, so this must be correct. (see below)<br />
*[MODELTYPE] as defined with [[2DA|2DAs]]. Typically a short name describing the Model ie. Wolf. See: [[ItemVariations.xls]]<br />
*[MODELSUBTYPE] is optional as defined with [[2DA|2DAs]]. Typically a short name describing different Variations of a Model. See: [[ItemVariations.xls]]<br />
*[MODELVARIATION] is optional as defined with [[2DA|2DAs]]. Typically one letter a, b, c describing further Variations. See: [[ItemVariations.xls]]<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. Options are dependant on resourcetype, however 0 is always required if LOD is applicable.<br />
<br />
=== Creatures ===<br />
<br />
<pre>[MainClass]+[ModelName]_[LOD].MMH / PHY<br />
<br />
[c]_[deepstkra]_[0].mmh (c_deepstkra_0.mmh)</pre><br />
<br />
*[MainClass] is the general type of the model. When no override is set in [[APR base.xls]], the toolset will generate it based on race and gender. (see below)<br />
*[ModelName] is the Modelname described in [[APR base.xls]]. When no Modelname is given, and Modeltype is P, the toolset will generate it based on [[NakedVariations.xls]] (unsure)<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. Options are dependant on resourcetype, however 0 is always required if LOD is applicable. <br />
<br />
This accounts for the game being able to locate a [[MMH]] via 2DA definitions. [[MSH]] / [[MAO]] / [[DDS]] Files are referenced by the MMH and each other but follow similar schemes.<br />
<br />
=== Model Main Class Naming Convention ===<br />
<br />
*base<br />
*blk - black boxes of various sizes and proportions, used to obscure the portions of models that lie "outside" an interior level where the player shouldn't be able to see.<br />
*c - creature<br />
*cai - Cave Int. <br />
*cav - Caves<br />
*cdr - Cave Deep Road<br />
*che - Chantry Exterior<br />
*chi - Chantry Interior<br />
*cn - Commmon Body Meshes <br />
*cs<br />
*df - dwarf female accessories and components<br />
*dm - dwarf male accessories and components<br />
*dne - dwarf noble exterior level pieces<br />
*dni - dwarf noble interior level pieces<br />
*dse - Dwarf Slum Exterior<br />
*dsi - Dwarf Slum Interior<br />
*dwe - Dwarven Exterior (Orzammar City) <br />
*dwi - Dwarven Interior<br />
*ef - elf female accessories and components<br />
*el<br />
*em - elf male accessories and components<br />
*fca - Fereldan Castle<br />
*fce - Fereldan Castle/City Exterior <br />
*fci - Fereldan Castle Interior<br />
*fde<br />
*fdi - Fereldan Dungeon Interior<br />
*fhe - Fereldan Human Exterior<br />
*fhec<br />
*fhi - Ferelden Human Interior<br />
*fne - Ferelden noble exterior level pieces<br />
*frt<br />
*fti - Fereldan Town Interior<br />
*ftr<br />
*fve - Fereldan Village Exterior<br />
*fx - Effects<br />
*fxa<br />
*fxc<br />
*fxe<br />
*fxg<br />
*fxm<br />
*fxp<br />
*hf - human female accessories and components<br />
*hm - human male accessories and components<br />
*hro - Hero Sets<br />
*kn<br />
*lightrig<br />
*material<br />
*nm<br />
*pf - Female specific Gear<br />
*plc - placeables<br />
*pm - Male or Genderless specific Gear<br />
*pn - <br />
*prp - props<br />
*prv<br />
*qm<br />
*sb - Skybox<br />
*sca<br />
*sr<br />
*tce - Tevinter Castle Exterior<br />
*tci - Tevinter Castle Interior<br />
*tfi - Tevinter Fade Interior<br />
*tools - models used by the toolset<br />
*trn<br />
*tti - Tevinter Tower Interior<br />
*tve - Tevinter Exterior<br />
*tvi - Tevinter Interior<br />
*tvm<br />
*ue<br />
*uem - Face Bits <br />
*uh - Face Bits <br />
*uhm - Face Bits <br />
*ul<br />
*ulm - eyelashes<br />
*v<br />
*vfx - Visual Effects<br />
*vis - Vista Objects<br />
*vst - Vista Objects<br />
*w - weapon models<br />
*water - waterfall pieces<br />
*zz - models used in debugging<br />
<br />
== Voice Over File Naming Convention ==<br />
<br />
<pre>[LineID]_m.WAV</pre><br />
<br />
*with [LineID] replaced by the ID number for the conversation line's string table entry.<br />
<br />
This accounts for being able to locate thousands of VO lines, when assigning them to their conversation line.<br />
<br />
See [[voice over]] for more information on how to manage voice over recording.<br />
<br />
== Animation File Naming Convention ==<br />
<br />
<pre>mh.dg_5p_tn_l_45.ANI</pre><br />
<br />
The various parts of the animation name gives you information about the type of animation. This for example means "male human dialogue 5 paces turn left 45 degrees."<br />
<br />
All humanoid animations prefix with mh. (male human). There is also a small list of fh (female human), These work across all races pretty much.<br />
<br />
After the prefix you have the following:<br />
*2p - a 2 person animation... usually lined up (i.e. give and receive, punch and punched, kiss and kissed)<br />
*am - ambient... full animations that so specific actions (i.e. blacksmith, cheering, clean floor)<br />
*cb - combat animations<br />
*cu - custom animation, usually for a specific cutscene or purpose<br />
*dg - dialog... animation fpr the purpose of use within dialogs (although we use all these animations)<br />
*po - pose based animations - these are specific poses and gestures for talking dialogs<br />
*wi - world interaction - similar to ambient but more about interacting with world objects (desks, leaning, sitting)<br />
<br />
After the above second prefix the rest is usually descriptive (or some what). Key thing to note:<br />
*en - enter animation... this is the animation that gets the actor doing the animation... usually from a standing neutral position<br />
*lp - looping animation - this is the animation that loops to keep the actor in a pose or position<br />
*ex - exit animation - this is the animation that gets the actor out of the lp animation... usually to a standing neutral position<br />
*tw - twitch, an animation that plays from the lp animation<br />
<br />
So, for example:<br />
*mh.wi_sit_en - animation goes from standing neutral to sitting<br />
*mh.wi_sit_lp - animation loops in the sitting pose<br />
*mh.wi_sit_ex - animation goes from sitting to standing neutral<br />
*mh.wi_sit_tw1 - an animation that plays from sit_lp, such as someone scratching their head<br />
<br />
== Vegetation (Speedtree) File Naming Convention ==<br />
<br />
<pre>tre c oakfixl.SPT</pre><br />
<br />
Vegetation is sorted in main categories via Prefix:<br />
<br />
*bsh - Bushes<br />
*gra - Grass<br />
*tre - Trees<br />
<br />
The last part is a short description of the vegetation type, ie Oak, which is a Oaktree.<br />
<br />
== See Also == <br />
<br />
*[[Art Resources]]<br />
*[[Designer Resources]]<br />
*[[Module tutorial#Organization]]<br />
<br />
<br />
[[Category:Art resources]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Naming_conventions&diff=12046Naming conventions2010-02-24T17:55:37Z<p>Eshme: /* Items */</p>
<hr />
<div>BioWare's resources follow a naming convention which allows for easy management and easy location of resources needed. When creating new resources it is a good idea to follow the existing naming convention (or your own scheme if you have a preferred one), to differentiate your work from that of others and to help you keep your resources organized.<br />
<br />
For the most part the names you give your resources will matter only to you, there are very few situations where the toolset pays attention to the specific form that a resource name takes. So provided you're working on your own any naming convention that suits your particular style will suffice.<br />
<br />
Although only one campaign is loaded at a time in game, unintended conflict can arise between the campaign and any core resource mods the player may have installed. If two design resources have the same name, only one will load. This is determined by the [[Source directory priorities]]. So, it's good to choose names that are likely to be unique. <br />
<br />
Usually resources are separated by underscores into categories and have prefixes sorting them based on a certain main class, or suffixes giving them certain variations.<br />
<br />
__TOC__<br />
<br />
== Resource Naming Convention ==<br />
<br />
Design resource names are free-form. As a matter of convenience and courtesy to players, you might prefer to follow a convention that reduces the risk of conflict between add-ins and improves compatibility with future Bioware releases. Bear in mind that only one resource with a given name will load in game. <br />
<br />
For simple mods, it might be sufficient to use a unique resource name prefix which is unlikely to be used by anyone else.<br />
<br />
Larger mods and campaigns may prefer a more professional approach which makes scripting more legible by identifying the resource type etc.<br />
<br />
In either case, it would be wise to avoid a prefix that Bioware has already used, such as "gen". <br />
<br />
The convention used in the main Single Player campaign of Dragon Age is as follows:<br />
<br />
<pre>cir200cr_bloodmage</pre><br />
<br />
*Three-letter prefix indicating which large-scale area of the game the resource begins to (particular origin story, prelude, etc) or "gen" for global resources.<br />
*three-digit number unique to a particular area, generally starting with 100 and incrementing in hundreds for major areas. Accessory areas are given numbers within the block of one hundred that their 'parent' area belongs to. "global" resources are often given the number 000.<br />
*two-letter code indicating what general type of resource it is ("ar" for area, "al" for area list, "ip" for placeable, "cr" for creature, "im" for item, "tr" for trigger, "pt" for plot, "st" for stage, "cs" for cutscene, "wp" for waypoint). A major exception here is event scripts, which have exactly the same name as the resource they're the script for. Dialogue files are also generally named exactly the same as their owner resource. Merchants usually have the owner name, with the prefix "store_".<br />
*An underscore.<br />
*The remainder of the name is free-form and human-readable, a descriptive term to remind you at a glance what the resource is.<br />
<br />
== Model File Naming Convention ==<br />
<br />
=== Items ===<br />
<br />
<pre>[MainClass]_[MODELTYPE]_[MODELSUBTYPE][MODELVARIATION]_[LOD].MMH / PHY <br />
<br />
[ef]_[rob]_[enc][a]_[0].mmh (ef_rob_enca_0.mmh)</pre><br />
<br />
*Where [MainClass] is of General type of a Model. The Toolset will build the MainClass based on Race/Gender/Itemtype etc, so this must be correct. (see below)<br />
*[MODELTYPE] as defined with [[2DA|2DAs]]. Typically a short name describing the Model ie. Wolf. See: [[ItemVariations.xls]]<br />
*[MODELSUBTYPE] is optional as defined with [[2DA|2DAs]]. Typically a short name describing different Variations of a Model. See: [[ItemVariations.xls]]<br />
*[MODELVARIATION] is optional as defined with [[2DA|2DAs]]. Typically one letter a, b, c describing further Variations. See: [[ItemVariations.xls]]<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. Options are dependant on resourcetype, however 0 is always required if LOD is applicable.<br />
<br />
=== Creatures ===<br />
<br />
<pre>[MainClass]+[ModelName]_[LOD].MMH / PHY</pre><br />
<br />
*[MainClass] is the general type of the model. When no override is set in [[APR base.xls]], the toolset will generate it based on race and gender.<br />
*[ModelName] is the Modelname described in [[APR base.xls]]. When no Modelname is given, and Modeltype is P, the toolset will generate it based on [[NakedVariations.xls]] (unsure)<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. ''Seems to be a fixed requirement for some.''<br />
<br />
This accounts for the game being able to locate a [[MMH]] via 2DA definitions. [[MSH]] / [[MAO]] / [[DDS]] Files are referenced by the MMH and each other but follow similar schemes.<br />
<br />
=== Model Main Class Naming Convention ===<br />
<br />
*base<br />
*blk - black boxes of various sizes and proportions, used to obscure the portions of models that lie "outside" an interior level where the player shouldn't be able to see.<br />
*c - creature<br />
*cai - Cave Int. <br />
*cav - Caves<br />
*cdr - Cave Deep Road<br />
*che - Chantry Exterior<br />
*chi - Chantry Interior<br />
*cn - Commmon Body Meshes <br />
*cs<br />
*df - dwarf female accessories and components<br />
*dm - dwarf male accessories and components<br />
*dne - dwarf noble exterior level pieces<br />
*dni - dwarf noble interior level pieces<br />
*dse - Dwarf Slum Exterior<br />
*dsi - Dwarf Slum Interior<br />
*dwe - Dwarven Exterior (Orzammar City) <br />
*dwi - Dwarven Interior<br />
*ef - elf female accessories and components<br />
*el<br />
*em - elf male accessories and components<br />
*fca - Fereldan Castle<br />
*fce - Fereldan Castle/City Exterior <br />
*fci - Fereldan Castle Interior<br />
*fde<br />
*fdi - Fereldan Dungeon Interior<br />
*fhe - Fereldan Human Exterior<br />
*fhec<br />
*fhi - Ferelden Human Interior<br />
*fne - Ferelden noble exterior level pieces<br />
*frt<br />
*fti - Fereldan Town Interior<br />
*ftr<br />
*fve - Fereldan Village Exterior<br />
*fx - Effects<br />
*fxa<br />
*fxc<br />
*fxe<br />
*fxg<br />
*fxm<br />
*fxp<br />
*hf - human female accessories and components<br />
*hm - human male accessories and components<br />
*hro - Hero Sets<br />
*kn<br />
*lightrig<br />
*material<br />
*nm<br />
*pf - Female specific Gear<br />
*plc - placeables<br />
*pm - Male or Genderless specific Gear<br />
*pn - <br />
*prp - props<br />
*prv<br />
*qm<br />
*sb - Skybox<br />
*sca<br />
*sr<br />
*tce - Tevinter Castle Exterior<br />
*tci - Tevinter Castle Interior<br />
*tfi - Tevinter Fade Interior<br />
*tools - models used by the toolset<br />
*trn<br />
*tti - Tevinter Tower Interior<br />
*tve - Tevinter Exterior<br />
*tvi - Tevinter Interior<br />
*tvm<br />
*ue<br />
*uem - Face Bits <br />
*uh - Face Bits <br />
*uhm - Face Bits <br />
*ul<br />
*ulm - eyelashes<br />
*v<br />
*vfx - Visual Effects<br />
*vis - Vista Objects<br />
*vst - Vista Objects<br />
*w - weapon models<br />
*water - waterfall pieces<br />
*zz - models used in debugging<br />
<br />
== Voice Over File Naming Convention ==<br />
<br />
<pre>[LineID]_m.WAV</pre><br />
<br />
*with [LineID] replaced by the ID number for the conversation line's string table entry.<br />
<br />
This accounts for being able to locate thousands of VO lines, when assigning them to their conversation line.<br />
<br />
See [[voice over]] for more information on how to manage voice over recording.<br />
<br />
== Animation File Naming Convention ==<br />
<br />
<pre>mh.dg_5p_tn_l_45.ANI</pre><br />
<br />
The various parts of the animation name gives you information about the type of animation. This for example means "male human dialogue 5 paces turn left 45 degrees."<br />
<br />
All humanoid animations prefix with mh. (male human). There is also a small list of fh (female human), These work across all races pretty much.<br />
<br />
After the prefix you have the following:<br />
*2p - a 2 person animation... usually lined up (i.e. give and receive, punch and punched, kiss and kissed)<br />
*am - ambient... full animations that so specific actions (i.e. blacksmith, cheering, clean floor)<br />
*cb - combat animations<br />
*cu - custom animation, usually for a specific cutscene or purpose<br />
*dg - dialog... animation fpr the purpose of use within dialogs (although we use all these animations)<br />
*po - pose based animations - these are specific poses and gestures for talking dialogs<br />
*wi - world interaction - similar to ambient but more about interacting with world objects (desks, leaning, sitting)<br />
<br />
After the above second prefix the rest is usually descriptive (or some what). Key thing to note:<br />
*en - enter animation... this is the animation that gets the actor doing the animation... usually from a standing neutral position<br />
*lp - looping animation - this is the animation that loops to keep the actor in a pose or position<br />
*ex - exit animation - this is the animation that gets the actor out of the lp animation... usually to a standing neutral position<br />
*tw - twitch, an animation that plays from the lp animation<br />
<br />
So, for example:<br />
*mh.wi_sit_en - animation goes from standing neutral to sitting<br />
*mh.wi_sit_lp - animation loops in the sitting pose<br />
*mh.wi_sit_ex - animation goes from sitting to standing neutral<br />
*mh.wi_sit_tw1 - an animation that plays from sit_lp, such as someone scratching their head<br />
<br />
== Vegetation (Speedtree) File Naming Convention ==<br />
<br />
<pre>tre c oakfixl.SPT</pre><br />
<br />
Vegetation is sorted in main categories via Prefix:<br />
<br />
*bsh - Bushes<br />
*gra - Grass<br />
*tre - Trees<br />
<br />
The last part is a short description of the vegetation type, ie Oak, which is a Oaktree.<br />
<br />
== See Also == <br />
<br />
*[[Art Resources]]<br />
*[[Designer Resources]]<br />
*[[Module tutorial#Organization]]<br />
<br />
<br />
[[Category:Art resources]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Naming_conventions&diff=12045Naming conventions2010-02-24T17:47:52Z<p>Eshme: /* Items */</p>
<hr />
<div>BioWare's resources follow a naming convention which allows for easy management and easy location of resources needed. When creating new resources it is a good idea to follow the existing naming convention (or your own scheme if you have a preferred one), to differentiate your work from that of others and to help you keep your resources organized.<br />
<br />
For the most part the names you give your resources will matter only to you, there are very few situations where the toolset pays attention to the specific form that a resource name takes. So provided you're working on your own any naming convention that suits your particular style will suffice.<br />
<br />
Although only one campaign is loaded at a time in game, unintended conflict can arise between the campaign and any core resource mods the player may have installed. If two design resources have the same name, only one will load. This is determined by the [[Source directory priorities]]. So, it's good to choose names that are likely to be unique. <br />
<br />
Usually resources are separated by underscores into categories and have prefixes sorting them based on a certain main class, or suffixes giving them certain variations.<br />
<br />
__TOC__<br />
<br />
== Resource Naming Convention ==<br />
<br />
Design resource names are free-form. As a matter of convenience and courtesy to players, you might prefer to follow a convention that reduces the risk of conflict between add-ins and improves compatibility with future Bioware releases. Bear in mind that only one resource with a given name will load in game. <br />
<br />
For simple mods, it might be sufficient to use a unique resource name prefix which is unlikely to be used by anyone else.<br />
<br />
Larger mods and campaigns may prefer a more professional approach which makes scripting more legible by identifying the resource type etc.<br />
<br />
In either case, it would be wise to avoid a prefix that Bioware has already used, such as "gen". <br />
<br />
The convention used in the main Single Player campaign of Dragon Age is as follows:<br />
<br />
<pre>cir200cr_bloodmage</pre><br />
<br />
*Three-letter prefix indicating which large-scale area of the game the resource begins to (particular origin story, prelude, etc) or "gen" for global resources.<br />
*three-digit number unique to a particular area, generally starting with 100 and incrementing in hundreds for major areas. Accessory areas are given numbers within the block of one hundred that their 'parent' area belongs to. "global" resources are often given the number 000.<br />
*two-letter code indicating what general type of resource it is ("ar" for area, "al" for area list, "ip" for placeable, "cr" for creature, "im" for item, "tr" for trigger, "pt" for plot, "st" for stage, "cs" for cutscene, "wp" for waypoint). A major exception here is event scripts, which have exactly the same name as the resource they're the script for. Dialogue files are also generally named exactly the same as their owner resource. Merchants usually have the owner name, with the prefix "store_".<br />
*An underscore.<br />
*The remainder of the name is free-form and human-readable, a descriptive term to remind you at a glance what the resource is.<br />
<br />
== Model File Naming Convention ==<br />
<br />
=== Items ===<br />
<br />
<pre>[MainClass]_[MODELTYPE]_[MODELSUBTYPE][MODELVARIATION]_[LOD].MMH / PHY </pre><br />
<br />
*Where [MainClass] is of General type of a Model. The Toolset will build the MainClass based on Race/Gender/Itemtype etc, so this must be correct. (see below)<br />
*[MODELTYPE] as defined with [[2DA|2DAs]]. Typically a short name describing the Model ie. Wolf. See: [[ItemVariations.xls]]<br />
*[MODELSUBTYPE] is optional as defined with [[2DA|2DAs]]. Typically a short name describing different Variations of a Model. See: [[ItemVariations.xls]]<br />
*[MODELVARIATION] is optional as defined with [[2DA|2DAs]]. Typically one letter a, b, c describing further Variations. See: [[ItemVariations.xls]]<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. Options are dependant on resourcetype, however 0 is always required if LOD is applicable.<br />
<br />
=== Creatures ===<br />
<br />
<pre>[MainClass]+[ModelName]_[LOD].MMH / PHY</pre><br />
<br />
*[MainClass] is the general type of the model. When no override is set in [[APR base.xls]], the toolset will generate it based on race and gender.<br />
*[ModelName] is the Modelname described in [[APR base.xls]]. When no Modelname is given, and Modeltype is P, the toolset will generate it based on [[NakedVariations.xls]] (unsure)<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. ''Seems to be a fixed requirement for some.''<br />
<br />
This accounts for the game being able to locate a [[MMH]] via 2DA definitions. [[MSH]] / [[MAO]] / [[DDS]] Files are referenced by the MMH and each other but follow similar schemes.<br />
<br />
=== Model Main Class Naming Convention ===<br />
<br />
*base<br />
*blk - black boxes of various sizes and proportions, used to obscure the portions of models that lie "outside" an interior level where the player shouldn't be able to see.<br />
*c - creature<br />
*cai - Cave Int. <br />
*cav - Caves<br />
*cdr - Cave Deep Road<br />
*che - Chantry Exterior<br />
*chi - Chantry Interior<br />
*cn - Commmon Body Meshes <br />
*cs<br />
*df - dwarf female accessories and components<br />
*dm - dwarf male accessories and components<br />
*dne - dwarf noble exterior level pieces<br />
*dni - dwarf noble interior level pieces<br />
*dse - Dwarf Slum Exterior<br />
*dsi - Dwarf Slum Interior<br />
*dwe - Dwarven Exterior (Orzammar City) <br />
*dwi - Dwarven Interior<br />
*ef - elf female accessories and components<br />
*el<br />
*em - elf male accessories and components<br />
*fca - Fereldan Castle<br />
*fce - Fereldan Castle/City Exterior <br />
*fci - Fereldan Castle Interior<br />
*fde<br />
*fdi - Fereldan Dungeon Interior<br />
*fhe - Fereldan Human Exterior<br />
*fhec<br />
*fhi - Ferelden Human Interior<br />
*fne - Ferelden noble exterior level pieces<br />
*frt<br />
*fti - Fereldan Town Interior<br />
*ftr<br />
*fve - Fereldan Village Exterior<br />
*fx - Effects<br />
*fxa<br />
*fxc<br />
*fxe<br />
*fxg<br />
*fxm<br />
*fxp<br />
*hf - human female accessories and components<br />
*hm - human male accessories and components<br />
*hro - Hero Sets<br />
*kn<br />
*lightrig<br />
*material<br />
*nm<br />
*pf - Female specific Gear<br />
*plc - placeables<br />
*pm - Male or Genderless specific Gear<br />
*pn - <br />
*prp - props<br />
*prv<br />
*qm<br />
*sb - Skybox<br />
*sca<br />
*sr<br />
*tce - Tevinter Castle Exterior<br />
*tci - Tevinter Castle Interior<br />
*tfi - Tevinter Fade Interior<br />
*tools - models used by the toolset<br />
*trn<br />
*tti - Tevinter Tower Interior<br />
*tve - Tevinter Exterior<br />
*tvi - Tevinter Interior<br />
*tvm<br />
*ue<br />
*uem - Face Bits <br />
*uh - Face Bits <br />
*uhm - Face Bits <br />
*ul<br />
*ulm - eyelashes<br />
*v<br />
*vfx - Visual Effects<br />
*vis - Vista Objects<br />
*vst - Vista Objects<br />
*w - weapon models<br />
*water - waterfall pieces<br />
*zz - models used in debugging<br />
<br />
== Voice Over File Naming Convention ==<br />
<br />
<pre>[LineID]_m.WAV</pre><br />
<br />
*with [LineID] replaced by the ID number for the conversation line's string table entry.<br />
<br />
This accounts for being able to locate thousands of VO lines, when assigning them to their conversation line.<br />
<br />
See [[voice over]] for more information on how to manage voice over recording.<br />
<br />
== Animation File Naming Convention ==<br />
<br />
<pre>mh.dg_5p_tn_l_45.ANI</pre><br />
<br />
The various parts of the animation name gives you information about the type of animation. This for example means "male human dialogue 5 paces turn left 45 degrees."<br />
<br />
All humanoid animations prefix with mh. (male human). There is also a small list of fh (female human), These work across all races pretty much.<br />
<br />
After the prefix you have the following:<br />
*2p - a 2 person animation... usually lined up (i.e. give and receive, punch and punched, kiss and kissed)<br />
*am - ambient... full animations that so specific actions (i.e. blacksmith, cheering, clean floor)<br />
*cb - combat animations<br />
*cu - custom animation, usually for a specific cutscene or purpose<br />
*dg - dialog... animation fpr the purpose of use within dialogs (although we use all these animations)<br />
*po - pose based animations - these are specific poses and gestures for talking dialogs<br />
*wi - world interaction - similar to ambient but more about interacting with world objects (desks, leaning, sitting)<br />
<br />
After the above second prefix the rest is usually descriptive (or some what). Key thing to note:<br />
*en - enter animation... this is the animation that gets the actor doing the animation... usually from a standing neutral position<br />
*lp - looping animation - this is the animation that loops to keep the actor in a pose or position<br />
*ex - exit animation - this is the animation that gets the actor out of the lp animation... usually to a standing neutral position<br />
*tw - twitch, an animation that plays from the lp animation<br />
<br />
So, for example:<br />
*mh.wi_sit_en - animation goes from standing neutral to sitting<br />
*mh.wi_sit_lp - animation loops in the sitting pose<br />
*mh.wi_sit_ex - animation goes from sitting to standing neutral<br />
*mh.wi_sit_tw1 - an animation that plays from sit_lp, such as someone scratching their head<br />
<br />
== Vegetation (Speedtree) File Naming Convention ==<br />
<br />
<pre>tre c oakfixl.SPT</pre><br />
<br />
Vegetation is sorted in main categories via Prefix:<br />
<br />
*bsh - Bushes<br />
*gra - Grass<br />
*tre - Trees<br />
<br />
The last part is a short description of the vegetation type, ie Oak, which is a Oaktree.<br />
<br />
== See Also == <br />
<br />
*[[Art Resources]]<br />
*[[Designer Resources]]<br />
*[[Module tutorial#Organization]]<br />
<br />
<br />
[[Category:Art resources]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Naming_conventions&diff=12035Naming conventions2010-02-23T19:16:19Z<p>Eshme: /* Resource Naming Convention */</p>
<hr />
<div>BioWare's resources follow a naming convention which allows for easy management and easy location of resources needed. When creating new resources it is a good idea to follow the existing naming convention (or your own scheme if you have a preferred one), to differentiate your work from that of others and to help you keep your resources organized.<br />
<br />
For the most part the names you give your resources will matter only to you, there are very few situations where the toolset pays attention to the specific form that a resource name takes. So provided you're working on your own any naming convention that suits your particular style will suffice.<br />
<br />
Although only one campaign is loaded at a time in game, unintended conflict can arise between the campaign and any core resource mods the player may have installed. If two design resources have the same name, only one will load. This is determined by the [[Source directory priorities]]. So, it's good to choose names that are likely to be unique. <br />
<br />
Usually resources are separated by underscores into categories and have prefixes sorting them based on a certain main class, or suffixes giving them certain variations.<br />
<br />
__TOC__<br />
<br />
== Resource Naming Convention ==<br />
<br />
Resources in the Resource Palette. The naming done here is merely for convenience and freeform. One could for example use a fitting prefix for all of their resources, so it stands out from the rest.<br />
<br />
The convention used in the main Single Player campaign of Dragon Age is as follows:<br />
<br />
<pre>cir200cr_bloodmage</pre><br />
<br />
*Three-letter prefix indicating which large-scale area of the game the resource begins to (particular origin story, prelude, etc)<br />
*three-digit number unique to a particular area, generally starting with 100 and incrementing in hundreds for major areas. Accessory areas are given numbers within the block of one hundred that their 'parent' area belongs to. "global" resources are often given the number 000.<br />
*two-letter code indicating what general type of resource it is ("ar" for area, "al" for area list, "ip" for placeable, "cr" for creature, "im" for item, "tr" for trigger, "pt" for plot, "st" for stage, "cs" for cutscene, "wp" for waypoint). A major exception here is event scripts, which have exactly the same name as the resource they're the script for. Dialogue files are also generally named exactly the same as their owner resource. Merchants usually have the owner name, with the prefix "store_".<br />
*An underscore.<br />
*The remainder of the name is free-form and human-readable, a descriptive term to remind you at a glance what the resource is.<br />
<br />
== Model File Naming Convention ==<br />
<br />
=== Items ===<br />
<br />
<pre>[MainClass]_[MODELTYPE]_[MODELSUBTYPE][MODELVARIATION]_[LOD].MMH / PHY </pre><br />
<br />
*Where [MainClass] is of General type of a Model. The Toolset will build the MainClass based on Race/Gender/Itemtype etc, so this must be correct.<br />
*[MODELTYPE] as defined with [[2DA|2DAs]]. Typically a short name describing the Model ie. Wolf. See: [[ItemVariations.xls]]<br />
*[MODELSUBTYPE] is optional as defined with [[2DA|2DAs]]. Typically a short name describing different Variations of a Model. See: [[ItemVariations.xls]]<br />
*[MODELVARIATION] is optional as defined with [[2DA|2DAs]]. Typically one letter a, b, c describing further Variations. See: [[ItemVariations.xls]]<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. ''Seems to be a fixed requirement for some.''<br />
<br />
=== Creatures ===<br />
<br />
<pre>[MainClass]+[ModelName]_[LOD].MMH / PHY</pre><br />
<br />
*[MainClass] is the general type of the model. When no override is set in [[APR base.xls]], the toolset will generate it based on race and gender.<br />
*[ModelName] is the Modelname described in [[APR base.xls]]. When no Modelname is given, and Modeltype is P, the toolset will generate it based on [[NakedVariations.xls]] (unsure)<br />
*[LOD] is optional for LOD Versions of Models, where its 0, 2 or 3 from highest to lowest LOD. ''Seems to be a fixed requirement for some.''<br />
<br />
This accounts for the game being able to locate a [[MMH]] via 2DA definitions. [[MSH]] / [[MAO]] / [[DDS]] Files are referenced by the MMH and each other but follow similar schemes.<br />
<br />
=== Model Main Class Naming Convention ===<br />
<br />
*base<br />
*blk - black boxes of various sizes and proportions, used to obscure the portions of models that lie "outside" an interior level where the player shouldn't be able to see.<br />
*c - creature<br />
*cai - Cave Int. <br />
*cav - Caves<br />
*cdr - Cave Deep Road<br />
*che - Chantry Exterior<br />
*chi - Chantry Interior<br />
*cn - Commmon Body Meshes <br />
*cs<br />
*df - dwarf female accessories and components<br />
*dm - dwarf male accessories and components<br />
*dne - dwarf noble exterior level pieces<br />
*dni - dwarf noble interior level pieces<br />
*dse - Dwarf Slum Exterior<br />
*dsi - Dwarf Slum Interior<br />
*dwe - Dwarven Exterior (Orzammar City) <br />
*dwi - Dwarven Interior<br />
*ef - elf female accessories and components<br />
*el<br />
*em - elf male accessories and components<br />
*fca - Fereldan Castle<br />
*fce - Fereldan Castle/City Exterior <br />
*fci - Fereldan Castle Interior<br />
*fde<br />
*fdi - Fereldan Dungeon Interior<br />
*fhe - Fereldan Human Exterior<br />
*fhec<br />
*fhi - Ferelden Human Interior<br />
*fne - Ferelden noble exterior level pieces<br />
*frt<br />
*fti - Fereldan Town Interior<br />
*ftr<br />
*fve - Fereldan Village Exterior<br />
*fx - Effects<br />
*fxa<br />
*fxc<br />
*fxe<br />
*fxg<br />
*fxm<br />
*fxp<br />
*hf - human female accessories and components<br />
*hm - human male accessories and components<br />
*hro - Hero Sets<br />
*kn<br />
*lightrig<br />
*material<br />
*nm<br />
*pf - Female specific Gear<br />
*plc - placeables<br />
*pm - Male or Genderless specific Gear<br />
*pn - <br />
*prp - props<br />
*prv<br />
*qm<br />
*sb - Skybox<br />
*sca<br />
*sr<br />
*tce - Tevinter Castle Exterior<br />
*tci - Tevinter Castle Interior<br />
*tfi - Tevinter Fade Interior<br />
*tools - models used by the toolset<br />
*trn<br />
*tti - Tevinter Tower Interior<br />
*tve - Tevinter Exterior<br />
*tvi - Tevinter Interior<br />
*tvm<br />
*ue<br />
*uem - Face Bits <br />
*uh - Face Bits <br />
*uhm - Face Bits <br />
*ul<br />
*ulm - eyelashes<br />
*v<br />
*vfx - Visual Effects<br />
*vis - Vista Objects<br />
*vst - Vista Objects<br />
*w - weapon models<br />
*water - waterfall pieces<br />
*zz - models used in debugging<br />
<br />
== Voice Over File Naming Convention ==<br />
<br />
<pre>[LineID]_m.WAV</pre><br />
<br />
*with [LineID] replaced by the ID number for the conversation line's string table entry.<br />
<br />
This accounts for being able to locate thousands of VO lines, when assigning them to their conversation line.<br />
<br />
See [[voice over]] for more information on how to manage voice over recording.<br />
<br />
== Animation File Naming Convention ==<br />
<br />
<pre>mh.dg_5p_tn_l_45.ANI</pre><br />
<br />
The various parts of the animation name gives you information about the type of animation. This for example means "male human dialogue 5 paces turn left 45 degrees."<br />
<br />
All humanoid animations prefix with mh. (male human). There is also a small list of fh (female human), These work across all races pretty much.<br />
<br />
After the prefix you have the following:<br />
*2p - a 2 person animation... usually lined up (i.e. give and receive, punch and punched, kiss and kissed)<br />
*am - ambient... full animations that so specific actions (i.e. blacksmith, cheering, clean floor)<br />
*cb - combat animations<br />
*cu - custom animation, usually for a specific cutscene or purpose<br />
*dg - dialog... animation fpr the purpose of use within dialogs (although we use all these animations)<br />
*po - pose based animations - these are specific poses and gestures for talking dialogs<br />
*wi - world interaction - similar to ambient but more about interacting with world objects (desks, leaning, sitting)<br />
<br />
After the above second prefix the rest is usually descriptive (or some what). Key thing to note:<br />
*en - enter animation... this is the animation that gets the actor doing the animation... usually from a standing neutral position<br />
*lp - looping animation - this is the animation that loops to keep the actor in a pose or position<br />
*ex - exit animation - this is the animation that gets the actor out of the lp animation... usually to a standing neutral position<br />
*tw - twitch, an animation that plays from the lp animation<br />
<br />
So, for example:<br />
*mh.wi_sit_en - animation goes from standing neutral to sitting<br />
*mh.wi_sit_lp - animation loops in the sitting pose<br />
*mh.wi_sit_ex - animation goes from sitting to standing neutral<br />
*mh.wi_sit_tw1 - an animation that plays from sit_lp, such as someone scratching their head<br />
<br />
== Vegetation (Speedtree) File Naming Convention ==<br />
<br />
<pre>tre c oakfixl.SPT</pre><br />
<br />
Vegetation is sorted in main categories via Prefix:<br />
<br />
*bsh - Bushes<br />
*gra - Grass<br />
*tre - Trees<br />
<br />
The last part is a short description of the vegetation type, ie Oak, which is a Oaktree.<br />
<br />
== See Also == <br />
<br />
*[[Art Resources]]<br />
*[[Designer Resources]]<br />
*[[Module tutorial#Organization]]<br />
<br />
<br />
[[Category:Art resources]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Designer_Resources&diff=12034Designer Resources2010-02-23T19:09:23Z<p>Eshme: /* Overview */</p>
<hr />
<div>{| style="float:right;"<br />
|-<br />
| {{Resource palette}}<br />
|}<br />
<br />
__TOC__<br />
== Overview ==<br />
This page links to explain Designer Resources.<br />
<br />
Any Designer Resource is stored in the Toolset's Database.<br />
<br />
=== Structure ===<br />
<br />
On the right side of the Toolset is the Resource Palette, which has types categorized by icons. Click on each to browse. These are by default all Resources used in the Singleplayer Campaign, and are best left untouched. A better idea is to copy existing Resources into your own module. Each Resourcetype opens up a somewhat different layout of the Toolset, as requirements for editting are different. Thus the structure of each is explained at the particular Resourcetype.<br />
<br />
Any Resource has special (Global) Properties besides its "normal" ones, which tell what Module it belongs to. This is particulary important for internal references, and before doing anything a Custom Module should always be created. ''See [[Creating a module]]''<br />
<br />
Resources are named after a [[Naming conventions#Resource Naming Convention|Resource Naming Convention]], and the Folderstructure of the Resource palette is simply there for convienience. However this mustnt be followed and is up to the Designer.<br />
<br />
=== Modding ===<br />
<br />
Which tool to use ,to create or edit an Resource, depends on which type it is. For Reference ,see "Resourcetypes" below.<br />
<br />
== Resourcetypes ==<br />
<br />
:''See Main Article: [[Resource palette]]''<br />
<br />
== Creating new resources ==<br />
<br />
[[Image:New resource.png|thumb|Create new resource menu]]<br />
<br />
You can create a new resource either from the "File" menu, or by right-clicking on the resource palette, and selecting "New". You'll be presented with a list of the sorts of resources that you can create.<br />
<br />
Once you select a resource type to create, you'll be presented with a window where you can enter some of the basic resource properties described above. The only thing that must be filled out is ResRef Name, the name by which this resource will be known by the game engine.<br />
<br />
<gallery widths="300px" heights="175px"><br />
Image:Create new resource.png|Windows XP dialogue<br />
Image:cnr.png|Windows Vista dialogue<br />
</gallery><br />
<br />
* '''Name''' - This is the '''Resource''' ([[ResRef]]) Name. It must be unique across the entire database (not just the current module) and lower case. When the resource is created this name is also set as its [[tag]]. Oddly, the tag must be in lower case also. To edit the resource name, or any of the resource properties you must first save the resource, [[check in|check it in]], then right click on the name and select ''Properties''. Once done be sure to right click on the resource name once more and select ''Refresh'', this will update all the instances in the module with the new changes.<br />
<br />
* '''Folder''' - This setting will move the new Resource into a specific Folder of the Resource palette. This is only for navigational aid.<br />
<br />
* '''Module''' - Sets the environment of the Module, as either "Game Core Resource" or ''*Module*'', where ''*Module*'' should equal the Owner Module. Exported Resources will be put into either the Core or Module directory of the Owner Module. The Game will treat Game Core Resources as available to other Modules, while setting ''*Module*'' makes a Resource only available within that Module. Other settings are irrelevant and treated as if setting the Owner Module.<br />
<br />
* '''Owner Module''' - Sets the Module which shall inherit the Resource. The exported Resource is put into that Modules directory, and the Game will treat that Resource as only available when the Module is activated. Default should always be the custom Module you are working on. Other settings can cause potential problems.<br />
<br />
* '''State''' - {{undocumented}}<br />
<br />
* '''Attributes''' - {{undocumented}}<br />
<br />
== Modifying resources ==<br />
After a resource, such as a placeable, has been created and placed in your areas, you might want to customize some of those instances. For example, you can change some of the properties of the placed instances. But if you change the properties of the resource itself (using the palette menus), the placed instances will not be updated to reflect your changes. To push your changes in the palette resource down to the placed instances, use the "Refresh" menu item on the palette menu. Refresh will update all instances in all areas, even if the areas are not open in the toolset.<br />
<br />
== Deleting resources ==<br />
<br />
A resource can't be deleted while it's [[checked out]]. To delete a resource, either check the resource back in or undo the checkout first. You can then delete it by selecting it in the resource palette and right-clicking on it to get a menu with the "delete" command.<br />
<br />
To recover a deleted resource, select the "Deleted Resources" command from the "Tools" menu. This will bring up a deleted resource browser that allows you to examine and restore deleted resources.<br />
<br />
=== Dependencies ===<br />
<br />
The toolset has some built-in safety mechanisms to ensure that resources don't wind up referencing nonexistent resources as dependencies. For example, it will refuse to delete a resource that another resource has as a dependency. If you had an area layout with a creature in it, you wouldn't be able to delete the creature's template from your database until you'd removed it from the area layout first.<br />
<br />
This can interact with checked out resources in a potentially non-obvious way. If you check out the area layout and remove the creature, the toolset still won't let you delete the creature's template until you actually check in the layout. That's because if you were to delete the creature and then undo your area checkout you'd wind up with an area layout referencing a deleted creature template.<br />
<br />
If you wish to delete resources, make sure that all of the other resources that may have depended on it are checked in beforehand.<br />
<br />
=== Circular dependencies ===<br />
<br />
It can sometimes occur that resource A references resource B, which references resource A. One set of resource where this is commonly possible are [[area]]s and [[stage]]s; an area references a stage that's placed in it, and the stage can itself reference the area. Another common pairing is a plot and its associated plot script.<br />
<br />
The only way to delete resources involved in a circular dependency chain is to edit one or more of the resource to break the chain. For example, you could edit the area to remove the stage before deleting the stage, and then delete the area afterward. The toolset doesn't recognize a group of deletions as a single transaction.<br />
<br />
== Exporting resources ==<br />
<br />
:''See Article: [[Exporting a module]]''<br />
<br />
== Global Resource properties ==<br />
<br />
Every such resource has the same set of generic properties that can be viewed by right-clicking on it in the palette window and selecting "properties". The general tab of the resulting popup window shows the following properties that can be modified:<br />
<br />
* Resource name - This is the Resource Name. It must be unique across the entire database (not just the current module) and lower case. When the resource is created this name is also set as its tag. Oddly, the tag must be in lower case also. To edit the resource name, or any of the resource properties you must first save the resource, check it in, then right click on the name and select Properties. Once done be sure to right click on the resource name once more and select Refresh, this will update all the instances in the module with the new changes. <br />
* Folder - This setting will move the new Resource into a specific Folder of the Resource palette. This is only for navigational aid. <br />
* Module - Sets the environment of the Module, as either "Game Core Resource" or *Module*, where *Module* should equal the Owner Module. Exported Resources will be put into either the Core or Module directory of the Owner Module. The Game will treat Game Core Resources as available to other Modules, while setting *Module* makes a Resource only available within that Module. Other settings are irrelevant and treated as if setting the Owner Module. <br />
* Owner module - Sets the Module which shall inherit the Resource. The exported Resource is put into that Modules directory, and the Game will treat that Resource as only available when the Module is activated. Default should always be the custom Module you are working on. Other settings can cause potential problems. <br />
* State - A flag that can be set to NONE, Written, Edited, Pre-localization, Localization, Voice over, Voice over ready. {{undocumented}}<br />
<br />
The "references" tab lists all of the other resources that this resource contains references to, and the "referenced by" tab lists all of the other resources that contain references to this one.<br />
<br />
[[Image:Resource properties.png|center|330px]]<br />
<br />
== Various ==<br />
<!-- please help i dont know what that stuff is! --><br />
<br />
*[[String editor]] - A tool that allows quick and easy access to all text that might be presented to the player in the game.<br />
<br />
*[[Area layouts used in the single player module]]<br />
<br />
See [[resource list]] for a comprehensive list of all of the resource types. ''value questionable''</div>Eshmehttp://datoolset.net/mw/index.php?title=ItemVariations.xls&diff=12033ItemVariations.xls2010-02-23T18:54:07Z<p>Eshme: </p>
<hr />
<div>__NOTOC__<br />
{| style="float:right;"<br />
|-<br />
| {{Infobox items}}<br />
|-<br />
|<br />
{| align="right" border="2" cellpadding="5" cellspacing="0" align"left"<br />
|+'''Integration'''<br />
|- style="background-color:white;"<br />
| align="center" width="300pt" style="background-color:#E0E0E0" |'''[[Item|Item (*.uti) Properties]]'''<br />
|-<br />
| align="center" |''(Enable Variation)''<br />
|-<br />
| align="center" style="background-color:#C0C0E0" |'''&uarr;&darr; ItemVariations.XLS &uarr;&darr;'''<br />
|-<br />
| align="center" |''(Find Model File)''<br />
|-<br />
| align="center" width="300pt" style="background-color:#E0E0E0" |'''[[Model|Model Files in the Filesystem]]'''<br />
|}<br />
|}<br />
<br />
This [[2DA]] lists variant [[Model|models]] for [[Item|items]].<br />
<br />
The different worksheet's are associated with the "Base Item Type" when defining an [[Item]]. The contents of each enable the particular "Item Variation" of said [[Item]], while they also refer to the [[Model|Model's]] filename via 3 strings which are joined with a prefix and suffix to find the actual file. ''(see: [[Naming conventions#Model File Naming Convention|Model File Naming Convention]])''<br />
<br />
Some Item Types are defined with other [[2DA|2DA's]], and are not listed here. This is only for [[Item|Items]] that can have variant models.<br />
<br />
== The different worksheets ==<br />
<br />
*mace_variation<br />
*greatsword_Variation<br />
*gloves_heavy_variation<br />
*gloves_medium_variation<br />
*gloves_light_variation<br />
*gloves_massive_variation<br />
*boots_massive_variation<br />
*boots_heavy_variation<br />
*boots_light_variation<br />
*boots_medium_variation<br />
*helmet_mage_variation<br />
*helmet_massive_variation<br />
*helmet_heavy_variation<br />
*helmet_medium_variation<br />
*helmet_light_variation<br />
*armor_massive_variation<br />
*armor_medium_variation<br />
*armor_light_variation<br />
*armor_heavy_variation<br />
*longsword_variation<br />
*staff_variation<br />
*wand_variation<br />
*dagger_variation<br />
*waraxe_variation<br />
*battleaxe_variation<br />
*maul_variation<br />
*lround_shield_variation<br />
*sround_shield_variation<br />
*kite_shield_variation<br />
*tower_shield_variation<br />
*crossbow_variation<br />
*shortbow_variation<br />
*longbow_variation<br />
*bolt_variation<br />
*arrow_variation<br />
*clothing_variation<br />
*dog_collar_variation<br />
*dog_warpaint_variation<br />
<br />
== Bug when using M2DA ==<br />
<br />
When extending (most certainly) all of these 2DA's via M2DAs, and giving ID Ranges above 255, a bug occurs when trying to use an Item based on a Variation in game. It may also crash the Toolset when equiping that Item to an NPC. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].<br />
<br />
== Layout ==<br />
<br />
Each of these worksheets has the same set of columns:<br />
<br />
{{2da start|<itemtype>_variation}}<br />
{{2da column|LABEL|string|Name as displayed in the Toolset}}<br />
{{2da column|MODELTYPE|string|First of 3 Strings of assigned Model [[MMH]] File. ''[MainClass]_<b>[MODELTYPE]</b>_[MODELSUBTYPE][MODELVARIATION]_[LOD].MMH''}}<br />
{{2da column|MODELSUBTYPE|string|Second of 3 Strings of assigned Model [[MMH]] File. ''[MainClass]_[MODELTYPE]_<b>[MODELSUBTYPE]</b>[MODELVARIATION]_[LOD].MMH''}}<br />
{{2da column|MODELVARIATION|string|Third of 3 Strings of assigned Model [[MMH]] File. ''[MainClass]_[MODELTYPE]_[MODELSUBTYPE]<b>[MODELVARIATION]</b>_[LOD].MMH''}}<br />
{{2da column|ICONNAME|string| This is the name for the ingame icon that appears on the quickbar, inventory, et cetera}}<br />
{{2da column|DEFAULTMATERIAL|int|Material set by the Toolset for this variation by default. As set in "materialtypes.gda"}}<br />
{{2da end}}<br />
<br />
[[Category:Items]]<br />
[[Category:XLS files]]</div>Eshmehttp://datoolset.net/mw/index.php?title=ItemVariations.xls&diff=12032ItemVariations.xls2010-02-23T18:48:27Z<p>Eshme: /* Layout */</p>
<hr />
<div>__NOTOC__<br />
{| style="float:right;"<br />
|-<br />
| {{Infobox items}}<br />
|-<br />
|<br />
{| align="right" border="2" cellpadding="5" cellspacing="0" align"left"<br />
|+'''Integration'''<br />
|- style="background-color:white;"<br />
| align="center" width="300pt" style="background-color:#E0E0E0" |'''[[Item|Item (*.uti) Properties]]'''<br />
|-<br />
| align="center" |''(Enable Variation)''<br />
|-<br />
| align="center" style="background-color:#C0C0E0" |'''&uarr;&darr; ItemVariations.XLS &uarr;&darr;'''<br />
|-<br />
| align="center" |''(Find Model File)''<br />
|-<br />
| align="center" width="300pt" style="background-color:#E0E0E0" |'''[[Model|Model Files in the Filesystem]]'''<br />
|}<br />
|}<br />
<br />
This [[2DA]] lists variant [[Model|models]] for [[Item|items]].<br />
<br />
The different worksheet's are associated with the "Base Item Type" when defining an [[Item]]. The contents of each enable the particular "Item Variation" of said [[Item]], while they also refer to the [[Model|Model's]] filename via 3 strings which are joined with a [[Naming conventions|prefix]] to find the actual file.<br />
<br />
Some Item Types are defined with other [[2DA|2DA's]], and are not listed here. This is only for [[Item|Items]] that can have variant models.<br />
<br />
== The different worksheets ==<br />
<br />
*mace_variation<br />
*greatsword_Variation<br />
*gloves_heavy_variation<br />
*gloves_medium_variation<br />
*gloves_light_variation<br />
*gloves_massive_variation<br />
*boots_massive_variation<br />
*boots_heavy_variation<br />
*boots_light_variation<br />
*boots_medium_variation<br />
*helmet_mage_variation<br />
*helmet_massive_variation<br />
*helmet_heavy_variation<br />
*helmet_medium_variation<br />
*helmet_light_variation<br />
*armor_massive_variation<br />
*armor_medium_variation<br />
*armor_light_variation<br />
*armor_heavy_variation<br />
*longsword_variation<br />
*staff_variation<br />
*wand_variation<br />
*dagger_variation<br />
*waraxe_variation<br />
*battleaxe_variation<br />
*maul_variation<br />
*lround_shield_variation<br />
*sround_shield_variation<br />
*kite_shield_variation<br />
*tower_shield_variation<br />
*crossbow_variation<br />
*shortbow_variation<br />
*longbow_variation<br />
*bolt_variation<br />
*arrow_variation<br />
*clothing_variation<br />
*dog_collar_variation<br />
*dog_warpaint_variation<br />
<br />
== Bug when using M2DA ==<br />
<br />
When extending (most certainly) all of these 2DA's via M2DAs, and giving ID Ranges above 255, a bug occurs when trying to use an Item based on a Variation in game. It may also crash the Toolset when equiping that Item to an NPC. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].<br />
<br />
== Layout ==<br />
<br />
Each of these worksheets has the same set of columns:<br />
<br />
{{2da start|<itemtype>_variation}}<br />
{{2da column|LABEL|string|Name as displayed in the Toolset}}<br />
{{2da column|MODELTYPE|string|First of 3 Strings of assigned Model [[MMH]] File. ''[MainClass]_<b>[MODELTYPE]</b>_[MODELSUBTYPE][MODELVARIATION]_[LOD].MMH''}}<br />
{{2da column|MODELSUBTYPE|string|Second of 3 Strings of assigned Model [[MMH]] File. ''[MainClass]_[MODELTYPE]_<b>[MODELSUBTYPE]</b>[MODELVARIATION]_[LOD].MMH''}}<br />
{{2da column|MODELVARIATION|string|Third of 3 Strings of assigned Model [[MMH]] File. ''[MainClass]_[MODELTYPE]_[MODELSUBTYPE]<b>[MODELVARIATION]</b>_[LOD].MMH''}}<br />
{{2da column|ICONNAME|string| This is the name for the ingame icon that appears on the quickbar, inventory, et cetera}}<br />
{{2da column|DEFAULTMATERIAL|int|Material set by the Toolset for this variation by default. As set in "materialtypes.gda"}}<br />
{{2da end}}<br />
<br />
[[Category:Items]]<br />
[[Category:XLS files]]</div>Eshmehttp://datoolset.net/mw/index.php?title=PRCSCR&diff=11992PRCSCR2010-02-21T01:05:01Z<p>Eshme: /* Scripts */</p>
<hr />
<div>PRCSCR enables a Modder to add any content into the existing Campaign with a custom Addin Module.<br />
<br />
== Overview ==<br />
<br />
PRCSCR (Post Release Content Script) actually is the name of a M2DA. However its sole purpose is to give an entry point into the main campaign and run a single associated script, which in turn starts to "inject" content into the campaign. This whole process is used by Bioware in all of their DLC content and is of high value to any modder.<br />
<br />
This process naturally involves Scripts as the name already reveals, however for small mods this can be a one time situation. This section contains some templates for scripts, for anyone not too familar.<br />
<br />
== PRCSCR in detail ==<br />
<br />
One may ask, why this process is so important, while it was not needed for them. The task here is to "inject" content, without touching a single Resource from the Main campaign. This option still remains ,but is not needed. If it worked before, it was due altered Resources which in most situation is easier but can interact badly with other Modules and causes serious trouble once custom resources are removed, unless it is treated with absolute care. <small>(be warned)</small><br />
<br />
Ironically, this method while being a high hurdle to take for starters, is the most easy to grasp once taken. <br />
<br />
The Idea is, that you provide a custom PRCSCR M2DA, with Information on which custom Script to run once the player enters a specific Area. The Game will read the M2DA all by itself. The Script creates new waypoints, quests, NPC's etc. Basically what Bioware does with its DLC's ,that as soon the player enters any Area ,instantly the "Lucky Ring" for instance spawns into the players inventory. The new Resources can then spawn further things on their own ,and the purpose of PRCSCR ends here.<br />
<br />
== PRCSCR M2DA ==<br />
<br />
This [[2DA|M2DA]] is the file you create for your module, which tell what script to run, at which point in the game. It is made from normal Excel files.<br />
<br />
:''See Article: [[PRCSCR.xls]]''<br />
<br />
== Scripts ==<br />
<br />
This is, by any means, not an easy task for many people. This should not be the main portal of everything evolving around [[Scripts]]. However a collection of ready to use Scripts to use for various cases one may need.<br />
<br />
:''See Article: [[PRCSCR Script Templates]]''<br />
<br />
'''Note''': The script will be run every time the player enters the specified area, so you'll want to have an associated plot flag (or other checks within the script) to ensure that the changes are only made once.<br />
<br />
== Usage Scenarios ==<br />
<br />
'''Where it applies:'''<br />
<br />
*You have made a new Area, an interior of a House in Denerim. But no Entrance Door exists ,unless you edit the stock Denerim Area. With PRCSCR you can spawn an Entrance.<br />
<br />
*You have made a Item. But there is no shop selling your item, unless you edit one. With PRCSCR you can spawn the Item in a Shop or your Inventory, or anywhere else. You can even spawn your own Shopkeeper into a existing Area ,which holds your Item without editting it.<br />
<br />
*You have made a new Map Pin on the map leading to your Area. However that Pin can only be active all the time. With PRCSCR, you can "spawn" this Map Pin after certain triggers which exist in the Main campaign without editting those. For example you may want that Pin only active once you have been greeted by the Dalish.<br />
<br />
'''Where it <u>doesnt need</u> to apply:'''<br />
<br />
*You have made a new House interior for Denerim but no entrance exists. However you already used PRCSCR to activate a Map Pin leading into a custom Area. In the custom Area you added a quest for instance, which upon activation can spawn that entrance on its own. <br />
<br />
*You have made an Item, but nobody can receive it. However you already used PRCSCR to spawn a door into your custom House, in which a custom NPC resides who has that Item for instance.<br />
<br />
*You have made a new Map Pin on the map, but you would need PRCSCR to activate it. However you already used PRCSCR to add an Item into the World, which can lead to activate the Map Pin on its own. For example the Item is a Map, which upon finding spawns the Map Pin.<br />
<br />
'''Where it <u>doesnt</u> apply:'''<br />
<br />
*Stages and Merchants cannot be inserted via Scripts. One alternative for stages is a dynamic stage, while setting "at current position". <br />
*Level Art cannot be changed, as it is "baked" into an Area.<br />
*Anything a Script cannot do.<br />
<br />
<br />
As you can see, you only need to use PRCSCR in at least one case. Anything further can be based on it.</div>Eshmehttp://datoolset.net/mw/index.php?title=2DA_ranges_in_use&diff=118952DA ranges in use2010-02-17T21:28:28Z<p>Eshme: /* placeable_types */</p>
<hr />
<div>This page is meant to enumerate row ID ranges that are used by the main game and by various popular addins, to avoid accidental overlap. Note that there's no need for 2DA row IDs to be sequential, so you can use very large row ID numbers to reduce the chances of collision.<br />
<br />
Version 1.0 of the toolset had a bug in ExcelProcessor that caused problems with high row ID numbers, but this has been fixed in subsequent releases. See [[Bug: ExcelProcessor doesn't handle row IDs above 8.3 million correctly|the bug report]].<br />
<br />
As of now there is a bug that prevents ID's above 255 to be used for some M2DA's. Most certainly it is ''"only"'' [[ItemVariations.xls]] related. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].<br />
<br />
<br />
== ABI_base ==<br />
<br />
According to the [[ABI_base]] page under the ''tooltipstrref'' column, anything over 500000 is considered a debuff. This would limit the range a fair amount.<br />
<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 200262'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680050<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== ANIM_base ==<br />
<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| 65000 - 65002<br />
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== APR_base ==<br />
<br />
Note that there is a bug involving this 2DA: [[Bug: APR base maximum M2DA row ID is 65535 in the toolset]]<br />
<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 90'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 65000 - 65001<br />
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== BITM_base and ItemStats_ ==<br />
<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| 30000 - 30500<br />
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== crafting_recipe_types ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 7'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680010<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== crafting_recipes ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 91'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680999<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== guitypes ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 5680000 - 5680010<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== itemprps ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 10022'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680050<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 536873321 - 536873322<br />
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== itemsets ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 30'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680500<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== M2DA_base ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1016, 2000 - 2010, 10011 - 10142, ...? '''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680050<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 6000000 - 6000050<br />
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]<br />
|-<br />
| 7000000 - 7000050<br />
| FtG - [http://social.bioware.com/project/1688/ UI Mod] <br />
|-<br />
| 7777770 - 7777799<br />
| Magic - [http://social.bioware.com/project/1429/ Void Walker] (M2DA prefix: VWK)<br />
|-<br />
| 9000000 - 9000050<br />
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor] <br />
|-<br />
| 1140150041 - 1140150091<br />
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC] <br />
|}<br />
<br />
<br />
----<br />
<br />
== materialrules ==<br />
{| class="wikitable" border="1"<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 536873321 - 536873323<br />
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]<br />
|}<br />
<br />
<br />
----<br />
<br />
== materialtypes ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 88'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680199<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 536873321 - 536873340<br />
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]<br />
|}<br />
<br />
<br />
----<br />
<br />
== PRCSCR ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 10100000<br />
| Camp [http://social.bioware.com/project/463/ storage chest]<br />
|-<br />
| 10100100-10100110<br />
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]<br />
|-<br />
| 5680000 - 5680010<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 6000000 - 6000050<br />
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]<br />
|-<br />
| 1140150041 - 1140150091<br />
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC] <br />
|}<br />
<br />
<br />
----<br />
<br />
== placeable_types ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 43050-43061<br />
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent] (Greater 65535 is showing bugs so this is until it is fixed)<br />
|-<br />
| 43062-43065<br />
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]<br />
|-<br />
| 2696549 - 2696700<br />
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden] (NOTE: I'm using the 6000-6200 range until Bioware fixes the bug which prevents m2da ID ranges above 900000 from showing up in game.)<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|}<br />
<br />
<br />
----<br />
<br />
== tint_override ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| 500 - 520<br />
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|}<br />
<br />
----<br />
<br />
<br />
== vfx_base ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 5680000 - 5680010<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 5680011 - 5680019<br />
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]<br />
|}<br />
<br />
<br />
<br />
[[Category:2DAs]]</div>Eshmehttp://datoolset.net/mw/index.php?title=2DA_ranges_in_use&diff=118942DA ranges in use2010-02-17T21:15:53Z<p>Eshme: /* PRCSCR */</p>
<hr />
<div>This page is meant to enumerate row ID ranges that are used by the main game and by various popular addins, to avoid accidental overlap. Note that there's no need for 2DA row IDs to be sequential, so you can use very large row ID numbers to reduce the chances of collision.<br />
<br />
Version 1.0 of the toolset had a bug in ExcelProcessor that caused problems with high row ID numbers, but this has been fixed in subsequent releases. See [[Bug: ExcelProcessor doesn't handle row IDs above 8.3 million correctly|the bug report]].<br />
<br />
As of now there is a bug that prevents ID's above 255 to be used for some M2DA's. Most certainly it is ''"only"'' [[ItemVariations.xls]] related. See [[Bug: High M2DA ID ranges might work in the toolset, but not in game|Bug report]].<br />
<br />
<br />
== ABI_base ==<br />
<br />
According to the [[ABI_base]] page under the ''tooltipstrref'' column, anything over 500000 is considered a debuff. This would limit the range a fair amount.<br />
<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 200262'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680050<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== ANIM_base ==<br />
<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| 65000 - 65002<br />
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== APR_base ==<br />
<br />
Note that there is a bug involving this 2DA: [[Bug: APR base maximum M2DA row ID is 65535 in the toolset]]<br />
<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 90'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 65000 - 65001<br />
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== BITM_base and ItemStats_ ==<br />
<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| 30000 - 30500<br />
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor]<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== crafting_recipe_types ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 7'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680010<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== crafting_recipes ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 91'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680999<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== guitypes ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 5680000 - 5680010<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== itemprps ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 10022'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680050<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 536873321 - 536873322<br />
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== itemsets ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 30'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680500<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|}<br />
<br />
<br />
----<br />
<br />
<br />
== M2DA_base ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1016, 2000 - 2010, 10011 - 10142, ...? '''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680050<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 6000000 - 6000050<br />
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]<br />
|-<br />
| 7000000 - 7000050<br />
| FtG - [http://social.bioware.com/project/1688/ UI Mod] <br />
|-<br />
| 7777770 - 7777799<br />
| Magic - [http://social.bioware.com/project/1429/ Void Walker] (M2DA prefix: VWK)<br />
|-<br />
| 9000000 - 9000050<br />
| Ambaryerno - [http://social.bioware.com/project/415/ Arms and Armor] <br />
|-<br />
| 1140150041 - 1140150091<br />
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC] <br />
|}<br />
<br />
<br />
----<br />
<br />
== materialrules ==<br />
{| class="wikitable" border="1"<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 536873321 - 536873323<br />
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]<br />
|}<br />
<br />
<br />
----<br />
<br />
== materialtypes ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 88'''<br />
| '''Bioware - Main campaign'''<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 5680000 - 5680199<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 536873321 - 536873340<br />
| Elys' [http://social.bioware.com/project/522/ Mysterious Gifts]<br />
|}<br />
<br />
<br />
----<br />
<br />
== PRCSCR ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|-<br />
| 10100000<br />
| Camp [http://social.bioware.com/project/463/ storage chest]<br />
|-<br />
| 10100100-10100110<br />
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent]<br />
|-<br />
| 5680000 - 5680010<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 6000000 - 6000050<br />
| TreDawn - [http://social.bioware.com/project/1750/ Nesiara Companion]<br />
|-<br />
| 1140150041 - 1140150091<br />
| DLAN_Immortality - [http://social.bioware.com/project/789/ Ser Gilmore NPC] <br />
|}<br />
<br />
<br />
----<br />
<br />
== placeable_types ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 43060-43061<br />
| Eshme's [http://social.bioware.com/project/1929/ Sleeping Tent] (Greater 65535 is showing bugs so this is until it is fixed)<br />
|-<br />
| 43062-43065<br />
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]<br />
|-<br />
| 2696549 - 2696700<br />
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden] (NOTE: I'm using the 6000-6200 range until Bioware fixes the bug which prevents m2da ID ranges above 900000 from showing up in game.)<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|}<br />
<br />
<br />
----<br />
<br />
== tint_override ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| 500 - 520<br />
| PavelNovotny - [http://social.bioware.com/project/517/ Gay Bars of Ferelden]<br />
|-<br />
| 30000000-40000000<br />
| MCC's Senderfall: The Last Bastion (To author: unreasonable range, please correct)<br />
|}<br />
<br />
----<br />
<br />
<br />
== vfx_base ==<br />
{| class="wikitable" border="1"<br />
|-<br />
! Range<br />
! Used by<br />
|-<br />
| '''0 - 1000000'''<br />
| '''Bioware - reserved'''<br />
|-<br />
| 5680000 - 5680010<br />
| Phaenan's [http://social.bioware.com/project/672/ The Winter Forge]<br />
|-<br />
| 5680011 - 5680019<br />
| BioSpirit's [http://social.bioware.com/project/1647/ Hilltop Under Siege]<br />
|}<br />
<br />
<br />
<br />
[[Category:2DAs]]</div>Eshmehttp://datoolset.net/mw/index.php?title=Placeables.xls&diff=11806Placeables.xls2010-02-16T16:28:45Z<p>Eshme: /* placeable_types worksheet */</p>
<hr />
<div>Defines base placeable appearances and properties, used by the placeable editor.<br />
<br />
The placeable_types worksheet is where most of the details are listed; other worksheets define tables of data for various generic types of placeable. The "Label" column is the name used by the toolset to refer to this placeable's appearance type, individual instances can be named something else in the game itself. The ModelName column associates a physical model with the placeable type and BlendTree associates an animation.<br />
<br />
== placeable_basetypes worksheet ==<br />
<br />
{{2da start|placeable_basetypes}}<br />
{{2da column|Label|string|}}<br />
{{2da end}}<br />
<br />
== placeable_types worksheet ==<br />
<br />
{{2da start|placeable_types}}<br />
{{2da column| Label | string| }}<br />
{{2da column| StrRef | int|}}<br />
{{2da column| ModelName | string| The full model filename (without extension) including and only the highest LOD variation if applicable}}<br />
{{2da column| BlendTree| string|}}<br />
{{2da column| DestroyVFX|int|}}<br />
{{2da column| CrustVFX|int|}}<br />
{{2da column| OcclusionFactor|float| Value between 0.0 (no occlusion) and 1.0 (full occlusion)}}<br />
{{2da column| StateController|string| {{undocumented}} <small>(Seems to influence how the placeable is handled, ie difference between opening a Chest and lifting a Lever)</small>}}<br />
{{2da column| RemoveWhenDead| int| }}<br />
{{2da column| BaseType | int | ross: This is to replace the body bags flag, and so that we can determine what a placeable is, a door, a chest, bodybag, etc.. These correspond to values on the placeable_basetypes workbook. yaron: We don't use this value - not in scripting and not in engine - we can get rid of it}}<br />
{{2da column| TurnRate| float|}}<br />
{{2da column| EnableCollisionEvent|int| When non-zero, this placeable will generate an [[EVENT_TYPE_PLACEABLE_COLLISION]] [[event]].}}<br />
{{2da column| GeneratePathInfo|int|}}<br />
{{2da column| Height| float| Specify the height of the placeable. If no height is specified the height will be infered from the objects geometry. NOTE: If the object is rotated in space the height value provided here will not change, however if the height is computed it will be the height of the object after it has been rotated.}}<br />
{{2da column| Health | int | }}<br />
{{2da column| PickLockSuccess| string| }}<br />
{{2da column| PickLockFailure| string| }}<br />
{{2da column| PpenContainerSound|string|}}<br />
{{2da column| ClosedToOpened |string| sound on action}}<br />
{{2da column| OpenedToClosed |string| }}<br />
{{2da column| Destroyed |string| }}<br />
{{2da column| Used |string| }}<br />
{{2da column| Locked |string| }}<br />
{{2da column| Hit |string| }}<br />
{{2da column| Unknown |string| Label from "[[Sound_Item_materials.xls]]". NOT USED - info for designers ONLY}}<br />
{{2da column| Sword |string| }}<br />
{{2da column| Axe |string| }}<br />
{{2da column| Blunt |string| }}<br />
{{2da column| Dagger |string| }}<br />
{{2da column| Staff |string| }}<br />
{{2da column| Barehands |string| }}<br />
{{2da column| Claws |string| }}<br />
{{2da column| Arrow |string| }}<br />
{{2da column| Rock |string| }}<br />
{{2da column| Shield-wood |string| }}<br />
{{2da column| Shield-steel |string| }}<br />
{{2da end}}<br />
<br />
== placeable_interactions worksheet ==<br />
<br />
This worksheet determines what interactions the player is able to have with each placeable type.<br />
<br />
{{2da start|placeable_interactions}}<br />
{{2da column| Label|string|}}<br />
{{2da column| StrRef|int|}}<br />
{{2da column| CursorID|string|}}<br />
{{2da column| DisabledLabel|string|}}<br />
{{2da column| DisabledStrRef|int|}}<br />
{{2da column| DisabledCursorId|string|}}<br />
{{2da end}}<br />
<br />
== StateCnt_* worksheets ==<br />
<br />
There's a large number of state controller worksheets, one for each type of placeable that can be in multiple states (for example a container can be open, closed and unlocked, closed and locked, and destroyed).<br />
<br />
All of the StateCnt worksheets have the following columns in common:<br />
<br />
{{2da start|StateCnt_<type>}}<br />
{{2da column| Label |string| The entries on this page pertain to entries in the [[animations.xls]] file.}}<br />
{{2da column| Action0| int | }}<br />
{{2da column| Success0| int| }}<br />
{{2da column| Success0A| int| }}<br />
{{2da column| Action1|int|}}<br />
{{2da column| Success1|int|}}<br />
{{2da column| Success1A|int|}}<br />
{{2da column| BlockVis|int| Set this to non-zero if you want this state to block visibility.}}<br />
{{2da column| STRREF|int|}}<br />
{{2da end}}<br />
<br />
In addition, each state will have its own row and its own column. So for example a container would have both rows and columns for its possible states, like so:<br />
<br />
{| border="1"<br />
|-<br />
| || Closed_Unlocked || Closed_Locked || Open || Dead <br />
|-<br />
| Closed_Unlocked || 1025 || 1025 || 1027 || 1029 <br />
|-<br />
| Closed_Locked|| 1025 || 1025 || 1027 || 1029 <br />
|-<br />
| Open || 1028 || 1028 || 1024 || 1029 <br />
|-<br />
| Dead || <nowiki>****</nowiki> || <nowiki>****</nowiki> || <nowiki>****</nowiki> || 1026 <br />
|}<br />
!! Need to find out what the significance of the numbers populating this grid are!!<br />
<br />
The following placeable types each have their own worksheet, each with the following state lists:<br />
<br />
{| border="1"<br />
|-<br />
| Placeable type || States || Notes <br />
|-<br />
| Bridge || Active, Inactive, Destroyed <br />
|-<br />
| AreaTransition || Unlocked, Locked <br />
|-<br />
| Furniture || Idle, Dead <br />
|-<br />
| Informational || Active <br />
|-<br />
| AOE || Idle, Triggered, Dead <br />
|-<br />
| FlipCover || Idle, Cover, Dead || Flip cover has been cut from the game, this is a leftover from when it was implemented <br />
|-<br />
| Trap_Trigger || Inactive_Enabled, Inactive_Disabled, Active <br />
|-<br />
| NonSelectable_Trap || Idle1, Idle2 <br />
|-<br />
| Selectable_Trap || Idle, Active, Dead <br />
|-<br />
| Puzzle || Active, Dead <br />
|-<br />
| Destroy || Active, Dead <br />
|-<br />
| Cage || Closed_Unlocked, Closed_Locked, Open, Dead <br />
|-<br />
| Bodybag || Unlocked <br />
|-<br />
| Container_Static || Unlocked, Locked, Dead <br />
|-<br />
| Container || Closed_Unlocked, Closed_Locked, Open, Dead <br />
|-<br />
| BBase || Idle, IdleLeft, IdleRight, Dead <br />
|-<br />
| Trigger || Active, Inactive, Dead <br />
|-<br />
| Door || Closed_Unlocked, Closed_Locked, Open, Dead, Open_1, Dead_2 <br />
|}<br />
<br />
== sound_plc_column_names worksheet ==<br />
<br />
{{2da start}}<br />
{{2da column|Label|string|}}<br />
{{2da end}}<br />
<br />
[[Category:XLS files]]<br />
[[Category:Placeables]]</div>Eshmehttp://datoolset.net/mw/index.php?title=PRCSCR_Script_Templates&diff=11638PRCSCR Script Templates2010-02-12T10:04:43Z<p>Eshme: </p>
<hr />
<div>This page serves as a repository for ready to use M2DA's and Scripts to use in conjunction with [[PRCSCR]] M2DA's when adding custom content to the game. <br />
<br />
References:<br />
*See Main Article: ''[[PRCSCR]]''<br />
*See ''[[PRCSCR.xls]]'' for details about that M2DA, or ''[[2DA]]'' for an explanation of 2DA's as a whole<br />
*To create a Script, right click in the Resourcepalette and select "New/Script" , or see ''[[Designer Resources]]'' for such Resources as a whole.<br />
<br />
<!-- No Table of contents... but a neat custom one --><br />
__NOTOC__<br />
'''Contents:'''<br />
{| style="background-color:#eeeeee; border:2px #999999 solid; padding:4px; margin:4px" border="3"<br />
| width=300 |[[PRCSCR Script Templates#Adding a placeable into an existing Area|1. Adding a placeable into an existing Area]]<br />
| width=800 |This Script serves to add a placeable of your choice into an Area of choice. ''(non removable)''<br />
|-<br />
| [[PRCSCR Script Templates#Adding a NPC into an existing Area|2. Adding a NPC into an existing Area]]<br />
| This Script serves to any custom NPC or Creature to a Area of choice. ''(removable)''<br />
|-<br />
| [[PRCSCR Script Templates#Activating a Waypoint on the Worldmap|3. Activating a Waypoint on the Worldmap]]<br />
| This Script serves to activate a custom Waypoint (Map Pin) of choice ,when leaving Lothering or at any other time into the Game.<br />
|-<br />
|-<br />
| 4. Adding an Item into the Players Inventory<br />
| This Script serves to instantly add an Item into the Players Inventory.<br />
|-<br />
| 5. Adding an Item to an existing Vendor<br />
| This Script serves to add any Item into a existing Vendors Inventory, as long the Vendor exists.<br />
|-<br />
| 6. Adding a Working Door into an existing Area<br />
| This Script serves to add a custom Door into a existing Area, that the Player can enter into a custom Area.<br />
|-<br />
| 7. Adding a Quest to an existing Chanters Board<br />
| This Script serves to add a new Quest to a existing Chanters Board, at any chosen time into the Game.<br />
|-<br />
| 8. ...<br />
| ...<br />
|}<br />
<br />
<br />
== Adding a placeable into an existing Area ==<br />
<br />
'''M2DA Setup:'''<br />
<br />
#AreaListName must not be "any". Chose a specific one.<br />
#Copy the GDA into your modules override folder.<br />
<br />
'''Script:''' (As taken from the Storage Chest mod a kind Bioware employee made :o)<br />
<br />
<dascript><br />
//const string TAL_STORAGE_CHEST_SPAWNED = "TAL_STORAGE_CHEST_SPAWNED";<br />
const string TAL_IP_STORAGE_CHEST = "tal_ip_storage_chest";<br />
const resource TAL_RESOURCE_IP_STORAGE_CHEST = R"tal_ip_storage_chest.utp";<br />
<br />
void main()<br />
{<br />
object oMainControlled = GetMainControlled();<br />
object oChest = UT_GetNearestObjectByTag(oMainControlled, TAL_IP_STORAGE_CHEST);<br />
<br />
<br />
//DisplayFloatyMessage(oMainControlled, "storage script working", FLOATY_MESSAGE, 16777215, 30.0);<br />
<br />
if (!IsObjectValid(oChest))<br />
{<br />
location lSpawn = Location(GetArea(oMainControlled), Vector(148.77, 117.68, -0.94), 0.0);<br />
CreateObject(OBJECT_TYPE_PLACEABLE, TAL_RESOURCE_IP_STORAGE_CHEST, lSpawn); <br />
<br />
//DisplayFloatyMessage(oMainControlled, "storage chest created", FLOATY_MESSAGE, 16777215, 30.0);<br />
}<br />
}<br />
</dascript><br />
<br />
#Replace "tal_ip_storage_chest" in the 2nd line with the "Tag" of your own placeable. (only small letters allowed)<br />
#Replace "tal_ip_storage_chest.utp" in 3rd line with the Resources Filename of your placable.<br />
#Exchange the (4) numbers after it sais "Vector" ,which should be the location of your placable. How to determine?<br />
#Create a temporary duplicate of the specific Area, and add the placeable until you see fit. (delete this Area afterwards, do not export)<br />
#Note down the numbers in the Object Inspector, and get the first 3 numbers of Position, and the 4rth Number from Rotation. (only 1 number, the first)<br />
#Rotation needs to be recalculated before entering it into the script. For positive angles do (180-angle). For negative angles do (-180-(-angle)).<br />
<br />
Export the script, the placeable ,and start the game. When you arrive at the specific Area in game, the Placeable will be there.<br />
<br />
'''Note:''' This method prevents removal of the placable. Check out a Plot driven method.<br />
<br />
== Adding a NPC into an existing Area ==<br />
<br />
'''M2DA Setup:'''<br />
<br />
#AreaListName must be "any". This Script is Plot driven.<br />
#Copy the GDA into your modules override folder.<br />
<br />
'''Script:'''<br />
<br />
<dascript><br />
// this is the name of a precreated plot file "joblos_quest" prefixed with the special "plt_"<br />
// "plt_" + quest name allows you to reference the flag names as constants.<br />
#include "plt_joblos_quest" <br />
#include "wrappers_h"<br />
<br />
void main()<br />
{<br />
//Check whether we've added Joblo already.<br />
if (WR_GetPlotFlag(PLT_JOBLOS_QUEST, JOBLO_ADDED_TO_TOWN) == FALSE)<br />
{<br />
object oTown = GetObjectByTag("lot100ar_lothering"); //An area's tag is the same as its resource name<br />
vector vJobloLocation = Vector(126.745f, 120.724f, 0.460568f); // See below for how to get these coordinates<br />
<br />
CreateObject(<br />
OBJECT_TYPE_CREATURE,<br />
R"joblo.utc",<br />
Location(oTown, vJobloLocation, 180.0f) //See below for how to get the value for orientation<br />
)<br />
<br />
WR_SetPlotFlag("joblos_quest", JOBLO_ADDED_TO_TOWN, TRUE);<br />
}<br />
}<br />
</dascript><br />
<br />
#Replace "joblos_quest" (3x) with the name of your Plot.<br />
#Replace "JOBLO_ADDED_TO_TOWN" (2x) with a custom Flag you create in your Plot.<br />
#Replace "lot100ar_lothering" with the Tag of an Area ,the NPC should spawn in.<br />
#Replace "joblo.utc" with the filename of your [[Creature]].<br />
#Exchange the (4) numbers ,which should be the location of your placable. How to determine?<br />
#Create a temporary duplicate of the specific Area, and add the NPC until you see fit. (delete this Area afterwards, do not export)<br />
#Note down the numbers in the Object Inspector, and get the first 3 numbers of Position, and the 4rth Number from Rotation. (only 1 number, the first)<br />
#Rotation needs to be recalculated before entering it into the script. For positive angles do (180-angle). For negative angles do (-180-(-angle)).<br />
<br />
Export the script, the creature ,and start the game. When you arrive at the specific Area in game, the [[Creature]] (Monsters or NPCs alike) will be there.<br />
<br />
== Activating a Waypoint on the Worldmap ==<br />
<br />
'''Requirements:''' Your module must extend Single Player. <br />
<br />
'''M2DA Setup:'''<br />
<br />
#AreaListName must be "any". Because Waypoint activation should be universal and it is Plot driven.<br />
#Copy the GDA into your modules override folder.<br />
<br />
'''Script:'''<br />
<dascript><br />
const string WML_WOW_Custom = "eshmeswp";<br />
#include "plt_mnp000pt_main_events"<br />
#include "wrappers_h"<br />
void main()<br />
{<br />
if(WR_GetPlotFlag( PLT_MNP000PT_MAIN_EVENTS, ARCHDEMON_EVENT_ONE) == TRUE )<br />
{<br />
WR_SetWorldMapLocationStatus(GetObjectByTag(WML_WOW_Custom), WM_LOCATION_ACTIVE);<br />
}<br />
}<br />
</dascript><br />
<br />
#Replace "eshmeswp" in the 1st line with the "Tag" of your Waypoint (Map Pin) which u created. That Map Pin can be greyed out or inactive or so. Map Pin information can be found at: [[Map]].<br />
<br />
Export the script, the Map ,and start the game. The Waypoint will now be activated once you leave Lothering, just like the other main Waypoints. This is to get in line with the Story. However to change the time of it happening..<br />
<br />
#Choose which [[Plot]] should activate the Waypoint. The above example uses the Archdemon quest, when your nightmare triggers for example.<br />
#Exchange "mnp000pt_main_events" in the 2nd and 6th line with the name of that other [[Plot]]. Leaving the "plt_" there.<br />
#Exchange "ARCHDEMON_EVENT_ONE" with a "Flag" of your choice from that Plot.<br />
<br />
This "should" work for any plot. Actually, waypoints dont need all this PRCSCR stuff and can be set "Active" in the first place. But the above example is to get in line with the Main Campaign, and potential gamebreaking Plot conflicts if able to leave Lothering too early.<br />
<br />
== Adding an Item into the Players Inventory ==<br />
<br />
'''Requirements:'''<br />
<br />
'''M2DA Setup:'''<br />
<br />
'''Script:''' {{undocumented}}<br />
<br />
== Adding an Item to an existing Vendor ==<br />
<br />
'''Requirements:'''<br />
<br />
'''M2DA Setup:'''<br />
<br />
'''Script:''' {{undocumented}}<br />
<br />
== Adding a Working Door into an existing Area ==<br />
<br />
'''Requirements:'''<br />
<br />
'''M2DA Setup:'''<br />
<br />
'''Script:''' {{undocumented}}<br />
<br />
== Adding a Quest to an existing Chanters Board ==<br />
<br />
'''Requirements:'''<br />
<br />
'''M2DA Setup:'''<br />
<br />
'''Script:''' {{undocumented}}<br />
<br />
[[category:tutorials]]<br />
[[Category:Scripts]]<br />
[[Category:Pages with example scripts]]</div>Eshmehttp://datoolset.net/mw/index.php?title=PRCSCR_Script_Templates&diff=11274PRCSCR Script Templates2010-02-10T10:36:46Z<p>Eshme: /* Adding a NPC into an existing Area */</p>
<hr />
<div>This page serves as a repository for ready to use M2DA's and Scripts to use in conjunction with [[PRCSCR]] M2DA's when adding custom content to the game. <br />
<br />
References:<br />
*See Main Article: ''[[PRCSCR]]''<br />
*See ''[[PRCSCR.xls]]'' for details about that M2DA, or ''[[2DA]]'' for an explanation of 2DA's as a whole<br />
*To create a Script, right click in the Resourcepalette and select "New/Script" , or see ''[[Designer Resources]]'' for such Resources as a whole.<br />
<br />
<!-- No Table of contents... but a neat custom one --><br />
__NOTOC__<br />
'''Contents:'''<br />
{| style="background-color:#eeeeee; border:2px #999999 solid; padding:4px; margin:4px" border="3"<br />
| width=300 |[[PRCSCR Script Templates#Adding a placeable into an existing Area|1. Adding a placeable into an existing Area]]<br />
| width=800 |This Script serves to add a placeable of your choice into an Area of choice. ''(non removable)''<br />
|-<br />
| [[PRCSCR Script Templates#Adding a NPC into an existing Area|2. Adding a NPC into an existing Area]]<br />
| This Script serves to any custom NPC or Creature to a Area of choice. ''(removable)''<br />
|-<br />
| [[PRCSCR Script Templates#Activating a Waypoint on the Worldmap|3. Activating a Waypoint on the Worldmap]]<br />
| This Script serves to activate a custom Waypoint (Map Pin) of choice ,when leaving Lothering or at any other time into the Game.<br />
|-<br />
|-<br />
| 4. Adding an Item into the Players Inventory<br />
| This Script serves to instantly add an Item into the Players Inventory.<br />
|-<br />
| 5. Adding an Item to an existing Vendor<br />
| This Script serves to add any Item into a existing Vendors Inventory, as long the Vendor exists.<br />
|-<br />
| 6. Adding a Working Door into an existing Area<br />
| This Script serves to add a custom Door into a existing Area, that the Player can enter into a custom Area.<br />
|-<br />
| 7. Adding a Quest to an existing Chanters Board<br />
| This Script serves to add a new Quest to a existing Chanters Board, at any chosen time into the Game.<br />
|-<br />
| 8. ...<br />
| ...<br />
|}<br />
<br />
<br />
== Adding a placeable into an existing Area ==<br />
<br />
'''M2DA Setup:'''<br />
<br />
#AreaListName must not be "any". Chose a specific one.<br />
#Copy the GDA into your modules override folder.<br />
<br />
'''Script:''' (As taken from the Storage Chest mod a kind Bioware employee made :o)<br />
<br />
<dascript><br />
//const string TAL_STORAGE_CHEST_SPAWNED = "TAL_STORAGE_CHEST_SPAWNED";<br />
const string TAL_IP_STORAGE_CHEST = "tal_ip_storage_chest";<br />
const resource TAL_RESOURCE_IP_STORAGE_CHEST = R"tal_ip_storage_chest.utp";<br />
<br />
void main()<br />
{<br />
object oMainControlled = GetMainControlled();<br />
object oChest = UT_GetNearestObjectByTag(oMainControlled, TAL_IP_STORAGE_CHEST);<br />
<br />
<br />
//DisplayFloatyMessage(oMainControlled, "storage script working", FLOATY_MESSAGE, 16777215, 30.0);<br />
<br />
if (!IsObjectValid(oChest))<br />
{<br />
location lSpawn = Location(GetArea(oMainControlled), Vector(148.77, 117.68, -0.94), 0.0);<br />
CreateObject(OBJECT_TYPE_PLACEABLE, TAL_RESOURCE_IP_STORAGE_CHEST, lSpawn); <br />
<br />
//DisplayFloatyMessage(oMainControlled, "storage chest created", FLOATY_MESSAGE, 16777215, 30.0);<br />
}<br />
}<br />
</dascript><br />
<br />
#Replace "tal_ip_storage_chest" in the 2nd line with the "Tag" of your own placeable. (only small letters allowed)<br />
#Replace "tal_ip_storage_chest.utp" in 3rd line with the Resources Filename of your placable.<br />
#Exchange the (4) numbers after it sais "Vector" ,which should be the location of your placable. How to determine?<br />
#Create a temporary duplicate of the specific Area, and add the placeable until you see fit. (delete this Area afterwards, do not export)<br />
#Note down the numbers in the Object Inspector, and get the first 3 numbers of Position, and the 4rth Number from Rotation. (only 1 number, the first)<br />
#Rotation needs to be recalculated before entering it into the script. For positive angles do (180-angle). For negative angles do (-180-(-angle)).<br />
<br />
Export the script, the placeable ,and start the game. When you arrive at the specific Area in game, the Placeable will be there.<br />
<br />
'''Note:''' This method prevents removal of the placable. Check out a Plot driven method.<br />
<br />
== Adding a NPC into an existing Area ==<br />
<br />
'''M2DA Setup:'''<br />
<br />
#AreaListName must be "any". This Script is Plot driven.<br />
#Copy the GDA into your modules override folder.<br />
<br />
'''Script:'''<br />
<br />
<dascript><br />
// this is the name of a precreated plot file "joblos_quest" prefixed with the special "plt_"<br />
// "plt_" + quest name allows you to reference the flag names as constants.<br />
#include "plt_joblos_quest" <br />
#include "wrappers_h"<br />
<br />
void main()<br />
{<br />
//Check whether we've added Joblo already.<br />
if (WR_GetPlotFlag(PLT_JOBLOS_QUEST, JOBLO_ADDED_TO_TOWN) == FALSE)<br />
{<br />
object oTown = GetObjectByTag("lot100ar_lothering"); //An area's tag is the same as its resource name<br />
vector vJobloLocation = Vector(126.745f, 120.724f, 0.460568f); // See below for how to get these coordinates<br />
<br />
CreateObject(<br />
OBJECT_TYPE_CREATURE,<br />
R"joblo.utc",<br />
Location(oTown, vJobloLocation, 180.0f) //See below for how to get the value for orientation<br />
)<br />
<br />
WR_SetPlotFlag("joblos_quest", JOBLO_ADDED_TO_TOWN, TRUE);<br />
}<br />
}<br />
</dascript><br />
<br />
#Replace "joblos_quest" (3x) with the name of your Plot.<br />
#Replace "JOBLO_ADDED_TO_TOWN" (2x) with a custom Flag you create in your Plot.<br />
#Replace "lot100ar_lothering" with the Tag of an Area ,the NPC should spawn in.<br />
#Replace "joblo.utc" with the filename of your [[Creature]].<br />
#Exchange the (4) numbers ,which should be the location of your placable. How to determine?<br />
#Create a temporary duplicate of the specific Area, and add the NPC until you see fit. (delete this Area afterwards, do not export)<br />
#Note down the numbers in the Object Inspector, and get the first 3 numbers of Position, and the 4rth Number from Rotation. (only 1 number, the first)<br />
#Rotation needs to be recalculated before entering it into the script. For positive angles do (180-angle). For negative angles do (-180-(-angle)).<br />
<br />
Export the script, the creature ,and start the game. When you arrive at the specific Area in game, the [[Creature]] (Monsters or NPCs alike) will be there.<br />
<br />
== Activating a Waypoint on the Worldmap ==<br />
<br />
'''Requirements:''' Your module must extend Single Player. <br />
<br />
'''M2DA Setup:'''<br />
<br />
#AreaListName must be "any". Because Waypoint activation should be universal and it is Plot driven.<br />
#Copy the GDA into your modules override folder.<br />
<br />
'''Script:'''<br />
<dascript><br />
const string WML_WOW_Custom = "eshmeswp";<br />
#include "plt_mnp000pt_main_events"<br />
#include "wrappers_h"<br />
void main()<br />
{<br />
if(WR_GetPlotFlag( PLT_MNP000PT_MAIN_EVENTS, ARCHDEMON_EVENT_ONE) == TRUE )<br />
{<br />
WR_SetWorldMapLocationStatus(GetObjectByTag(WML_WOW_Custom), WM_LOCATION_ACTIVE);<br />
}<br />
}<br />
</dascript><br />
<br />
#Replace "eshmeswp" in the 1st line with the "Tag" of your Waypoint (Map Pin) which u created. That Map Pin can be greyed out or inactive or so. Map Pin information can be found at: [[Map]].<br />
<br />
Export the script, the Map ,and start the game. The Waypoint will now be activated once you leave Lothering, just like the other main Waypoints. This is to get in line with the Story. However to change the time of it happening..<br />
<br />
#Choose which [[Plot]] should activate the Waypoint. The above example uses the Archdemon quest, when your nightmare triggers for example.<br />
#Exchange "mnp000pt_main_events" in the 2nd and 6th line with the name of that other [[Plot]]. Leaving the "plt_" there.<br />
#Exchange "ARCHDEMON_EVENT_ONE" with a "Flag" of your choice from that Plot.<br />
<br />
This "should" work for any plot. Actually, waypoints dont need all this PRCSCR stuff and can be set "Active" in the first place. But the above example is to get in line with the Main Campaign, and potential gamebreaking Plot conflicts if able to leave Lothering too early.<br />
<br />
== Adding an Item into the Players Inventory ==<br />
<br />
'''Requirements:'''<br />
<br />
'''M2DA Setup:'''<br />
<br />
'''Script:''' {{undocumented}}<br />
<br />
== Adding an Item to an existing Vendor ==<br />
<br />
'''Requirements:'''<br />
<br />
'''M2DA Setup:'''<br />
<br />
'''Script:''' {{undocumented}}<br />
<br />
== Adding a Working Door into an existing Area ==<br />
<br />
'''Requirements:'''<br />
<br />
'''M2DA Setup:'''<br />
<br />
'''Script:''' {{undocumented}}<br />
<br />
== Adding a Quest to an existing Chanters Board ==<br />
<br />
'''Requirements:'''<br />
<br />
'''M2DA Setup:'''<br />
<br />
'''Script:''' {{undocumented}}<br />
<br />
[[category:tutorials]]<br />
[[Category:Scripts]]</div>Eshme