<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ffrtt.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sebanisu</id>
	<title>Final Fantasy Inside - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ffrtt.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sebanisu"/>
	<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php/Special:Contributions/Sebanisu"/>
	<updated>2026-08-04T02:21:39Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.32.1</generator>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8&amp;diff=5931</id>
		<title>FF8</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8&amp;diff=5931"/>
		<updated>2023-03-29T13:00:50Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Battle files */ Link to list.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=  Contents =&lt;br /&gt;
=== History ===&lt;br /&gt;
Final Fantasy VIII came after the mega hit [[FF7|Final Fantasy VII]], it in itself was a very successful game release for Square. For more on the [[FF8/HistoryOf|history of Final Fantasy VIII read here]].  The Game Engine &lt;br /&gt;
* [[FF8/Engine|Final Fantasy VIII's Engine]] &lt;br /&gt;
=== Engine constants ===&lt;br /&gt;
* [[FF8/Engine_const/BattleFiles|Array of Battle files]] &lt;br /&gt;
=== Details of the Game ===&lt;br /&gt;
* [[FF8/Kernel|Final Fantasy VIII's Kernel]] &lt;br /&gt;
* [[FF8/Variables|Game variables used in scripting]] &lt;br /&gt;
* [[FF8/Engine/WorldMapCamera|World map camera]]&lt;br /&gt;
* [[FF8/Encounter_Codes|Battle encounters list]]&lt;br /&gt;
* [[FF8/String_Encoding|String Encoding]]&lt;br /&gt;
&lt;br /&gt;
=== Media Formats ===&lt;br /&gt;
*  [[FF8/PlaystationMedia|Final Fantasy VIII PS1]] media information. &lt;br /&gt;
*  [[FF8/PC_Media|Final Fantasy VIII PC]] media information. &lt;br /&gt;
*  [[FF8/GameSaveFormat|Final Fantasy VIII Save data]] &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
= File Formats =&lt;br /&gt;
=== Movie Files ===&lt;br /&gt;
*  [[FF8/FileFormat_PAK|[PAK]]] Movie Archives&lt;br /&gt;
=== Sound Files ===&lt;br /&gt;
*  [[FF8/FileFormat_FMT|[FMT]]] Sound Archives &lt;br /&gt;
=== Battle files ===&lt;br /&gt;
*  [[FF8/FileFormat_X|[X]]] Battle Fields &lt;br /&gt;
*  [[FF8/BS_list|[X]]] Battle Field List.&lt;br /&gt;
*  [[FF8/FileFormat_DAT|[DAT]]] Battle Models &lt;br /&gt;
*  [[FF8/BattleStructure|Scene.out]] Battle encounter data &lt;br /&gt;
*  [[FF8/FileFormat_r0win|r0win.dat]] Winning sequence &lt;br /&gt;
*  [[FF8/FileFormat_b0wave|b0wave.dat]] Core battle data (Textures+Music+Font) &lt;br /&gt;
*  [[FF8/FileFormat_TDW|a9btlfnt.bft]] Battle Font (Redirect to TDW) &lt;br /&gt;
*  [[FF8/FileFormat_magfiles|.mag files]] - MAG files&lt;br /&gt;
&lt;br /&gt;
=== Field files ===&lt;br /&gt;
*  [[FF8/Field/Script/Opcodes|Opcodes]] Field script opcodes&lt;br /&gt;
*  [[FF8/FileFormat_MCH|[MCH]]] Field Character Models &lt;br /&gt;
*  [[FF8/FileFormat_ONE|[ONE]]] Field Character Models Container &lt;br /&gt;
*  [[FF8/FileFormat_MIM|[MIM]]] Field Background Image Data &lt;br /&gt;
*  [[FF8/FileFormat_MAP|[MAP]]] Field Background Tile Data &lt;br /&gt;
*  [[FF8/FileFormat_JSM|[JSM]]] Field Scripts &lt;br /&gt;
*  [[FF8/FileFormat_SYM|[SYM]]] Field Script names (unused) &lt;br /&gt;
*  [[FF8/FileFormat_MSD|[MSD]]] Field Dialogs &lt;br /&gt;
*  [[FF8/FileFormat_INF|[INF]]] Field Gateways &lt;br /&gt;
*  [[FF7/Field/Walkmesh|[ID]]] Field Walkmesh (same format as FF7) &lt;br /&gt;
*  [[FF8/FileFormat_CA|[CA]]] Field Camera &lt;br /&gt;
*  [[FF8/FileFormat_TDW|[TDW]]] Extra font &lt;br /&gt;
*  [[FF8/FileFormat_MSK|[MSK]]] Movie cam (?) &lt;br /&gt;
*  [[FF8/FileFormat_RAT_MRT|[RAT]] &amp;amp; [MRT]] Battle related &lt;br /&gt;
*  [[FF8/FileFormat_PMD|[PMD]]] Particle Info &lt;br /&gt;
*  [[FF8/FileFormat_PMP|[PMP]]] Particle Image Data &lt;br /&gt;
*  [[FF8/FileFormat_PVP|[PVP]]] Unknown (often 0x0c000000, sometimes 0x0a000000 or 0x0b000000) &lt;br /&gt;
*  [[FF8/FileFormat_SFX|[SFX]]] Indexes to Sound Effects (?)&lt;br /&gt;
&lt;br /&gt;
=== World map files ===&lt;br /&gt;
*  [[FF8/WorldMap_music|music0.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music1.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music2.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music3.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music4.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music5.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_rail|rail.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_texl|texl.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_wmset|wmset.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_wmsetxx|wmsetXX.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_wmx|wmx.obj]]&lt;br /&gt;
*  [[FF8/WorldMap_charaone|chara.one]]&lt;br /&gt;
&lt;br /&gt;
=== Main ===&lt;br /&gt;
*  [[FF8/Main_wm2|wm2field.tbl]] &lt;br /&gt;
*  [[FF8/Main_kernel|kernel.bin]] &lt;br /&gt;
*  [[FF8/Main_harata|harata.cnf]] &lt;br /&gt;
*  [[FF8/Main_init|init.out]] &lt;br /&gt;
*  [[FF8/Main_namedic|namedic.bin]]&lt;br /&gt;
=== Menu ===&lt;br /&gt;
*  [[FF8/Menu_sp2|*.sp1/*.sp2]]&lt;br /&gt;
* [[FF8/Menu_mngrphd_bin|mngrphd.bin]]&lt;br /&gt;
* [[FF8/Menu_mngrp_bin|mngrp.bin]]&lt;br /&gt;
* [[FF8/Menu_tkmnmes|tkmnmes*.bin]]&lt;br /&gt;
* [[Ff8/Menu_mag_textures|mag*.tex]]&lt;br /&gt;
* [[FF8/Menu_mngrp_strings_locations|mngrp strings]]&lt;br /&gt;
* [[FF8/Menu_mngrp_complex_strings|mngrp complex strings]]&lt;br /&gt;
* [[FF8/Menu_m000_m004|m00*.bin and m00*.msg]]&lt;br /&gt;
* [[FF8/Menu_areames_dc1|areames.dc1]]&lt;br /&gt;
* [[FF8/Menu_price_bin|price.bin]]&lt;br /&gt;
&lt;br /&gt;
= Tools and Patches =&lt;br /&gt;
*  [[FF8/Tools|Tools and Patches]]&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5869</id>
		<title>FF8/FileFormat PAK</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5869"/>
		<updated>2020-12-31T17:38:42Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* CAM files */ adding the bit about 3 unknown bytes in cam header.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Final Fantasy VIII's movie files are stored within pak files. This is for the CD 2000 version only. Steam 2013 version uses avi files.  '''publish.pak''' contains the message &amp;quot;Published by Square Electronic Arts L.L.C.&amp;quot;. '''disc1.pak''', '''disc2.pak''', '''disc3.pak''', and '''disc4.pak''' hold the rest of the FMV movies.&lt;br /&gt;
&lt;br /&gt;
=PAK File Structure=&lt;br /&gt;
The PAK file has no header. Each movie usually contains a CAM file and two BINK videos. A PAK file can contain multiple movies. One BINK file is the low res the other is the high res.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Section !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CAM - optional || Camera data &lt;br /&gt;
|-&lt;br /&gt;
| BINK - high res || FMV video&lt;br /&gt;
|-&lt;br /&gt;
| BINK - low res || FMV video&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Existing projects you can use to extract the PAK files.===&lt;br /&gt;
* https://github.com/MaKiPL/OpenVIII-monogame/tree/master/PAK%20Extractor&lt;br /&gt;
* https://github.com/MaKiPL/FF8-Rinoa-s-Toolset/blob/master/SerahToolkit_SharpGL/FF8_Core/PlayMovie.cs&lt;br /&gt;
* https://github.com/Sebanisu/OpenVIII_CPP_WIP/tree/master/src/open_viii/pak&lt;br /&gt;
&lt;br /&gt;
==BINK files==&lt;br /&gt;
* Start with 0x42494B &amp;quot;BIK&amp;quot;&lt;br /&gt;
* More info: https://wiki.multimedia.cx/index.php/Bink_Container&lt;br /&gt;
&lt;br /&gt;
==CAM files==&lt;br /&gt;
* Each frame is 44 bytes long.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 bytes || 0x463850 &amp;quot;F8P&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 3 bytes  || Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 bytes (uint16) || Approx number of frames. There can be extra data.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 44 bytes * number of frames || Frame data. Each frame ends with &amp;quot;END&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Extra info by Kaspar:&lt;br /&gt;
The number of frames is always equal to the &amp;quot;approx number&amp;quot; above + 1 (therefore we can consider that approx number as the last frame index if we start counting from 0 ).&lt;br /&gt;
The only exception to this is disc03_04 wich contains 3 extra frame data (wich is probably pointless since the whole file contains blank camera animation anyway.&lt;br /&gt;
&lt;br /&gt;
Each Frame data sector is structured this way:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 6 bytes&lt;br /&gt;
| Camera Vector X axis&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 6 bytes&lt;br /&gt;
| Camera Vector Y axis&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 6 bytes&lt;br /&gt;
| Camera Vector Z axis&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Camera Vector Z.z (copy)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Camera Space X position&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Camera Space Y position&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Camera Space Z position&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Camera Pan X &lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Camera Pan Y&lt;br /&gt;
|-&lt;br /&gt;
| 36&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Zoom &lt;br /&gt;
|-&lt;br /&gt;
| 38&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Zoom (Repeated)&lt;br /&gt;
|-&lt;br /&gt;
| 40&lt;br /&gt;
| 1 byte&lt;br /&gt;
| Render Mode ('08','10','11' or '50')&lt;br /&gt;
|-&lt;br /&gt;
| 41&lt;br /&gt;
| 3 bytes&lt;br /&gt;
| &amp;quot;END&amp;quot; marker&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The 4 Render mode seems to be these :&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    -8 ('08') = render characters over FMV and masks meshes over characters (hiding/masking them)&lt;br /&gt;
&lt;br /&gt;
    -16('10') = render characters over FMV (not masked)&lt;br /&gt;
&lt;br /&gt;
    -17('11') = don't render characters over FMV&lt;br /&gt;
&lt;br /&gt;
    -80('50) = End Transition? (not sure what's this exactly but for sure the character are not rendered with this on)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
the 80 mode (when used) is active for the last 4 frame only and seems like it's not used when the fmv transition to the field at the end (eg. attack on Dollet landing or Galbadia Garden intro)&lt;br /&gt;
&lt;br /&gt;
The camera data is really similar to the Field one contained in the .CA files.&lt;br /&gt;
&lt;br /&gt;
Thanks to TrueOdin that bringed them to my attention it looks like beta PC version for FF7 had some cam files too but they were slightly different:&lt;br /&gt;
&lt;br /&gt;
-each frame sector is 40byte size with no 'END' marker&lt;br /&gt;
&lt;br /&gt;
-there is no header so if you want to know the frame count you have to divide the filesize by 40&lt;br /&gt;
&lt;br /&gt;
-Zoom is not repeated &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The structure for FF7 .cam sector is something like this :&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Offset&lt;br /&gt;
! Size&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 6 bytes&lt;br /&gt;
| Camera Vector X axis&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 6 bytes&lt;br /&gt;
| Camera Vector Y axis&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 6 bytes&lt;br /&gt;
| Camera Vector Z axis&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Camera Vector Z.z (copy)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Camera Space X position&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Camera Space Y position&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Camera Space Z position&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Camera Pan X &lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Camera Pan Y&lt;br /&gt;
|-&lt;br /&gt;
| 36&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Zoom &lt;br /&gt;
|-&lt;br /&gt;
| 38&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Unknown (Xx Repeated? not sure, need check)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
If someone is willing to create a ff7 wiki page for this feel free to move this last part there.&lt;br /&gt;
&lt;br /&gt;
== Pak File Details ==&lt;br /&gt;
The filenames are based on the 2013 name scheme. I am using '''h''' suffix for high res and '''l''' suffix for low res. Disc numbers go from 0-3. And 4 being for extra videos not fmv related.&lt;br /&gt;
===== disc1.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00.cam||326||0||14352||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00h.bik||326||3810||5759124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00l.bik||326||5818a4||2498748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01.cam||199||7e3960||8764||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01h.bik||205||7e5b9c||3572420||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01l.bik||205||b4de60||1522312||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02.cam||161||cc18e8||7092||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02h.bik||161||cc349c||2805776||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02l.bik||161||f704ac||1410720||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03.cam||1100||10c8b4c||48408||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03h.bik||1100||10d4864||19654004||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03l.bik||1100||2392dd8||8597316||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04.cam||215||2bc5d1c||9468||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04h.bik||215||2bc8218||3778948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04l.bik||215||2f62b9c||1628944||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05.cam||1114||30f06ac||49024||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05h.bik||1114||30fc62c||20063552||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05l.bik||1114||441eb6c||8923620||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06.cam||41||4ca1550||1812||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06h.bik||41||4ca1c64||757108||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06l.bik||41||4d5a9d8||347236||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07.cam||1084||4daf63c||47704||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07h.bik||1084||4dbb094||19696056||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07l.bik||1084||6083a4c||8855428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08.cam||324||68f59d0||14264||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08h.bik||324||68f9188||4736972||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08l.bik||324||6d7d954||2073440||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09.cam||1391||6f77cb4||61212||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09h.bik||1391||6f86bd0||24180228||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09l.bik||1391||86961d4||10270268||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10.cam||393||9061810||17300||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10h.bik||393||9065ba4||7195820||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10l.bik||393||9742850||3265804||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11.cam||465||9a5fd5c||20468||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11h.bik||465||9a64d50||8496456||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11l.bik||465||a27f298||3846440||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12.cam||45||a62a3c0||1988||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12h.bik||45||a62ab84||752040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12l.bik||45||a6e252c||300964||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13.cam||15||a72bcd0||668||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13h.bik||15||a72bf6c||249788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13l.bik||15||a768f28||99988||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14.cam||360||a7815bc||15848||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14h.bik||360||a7853a4||6369460||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14l.bik||360||ad98458||2769344||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15.cam||300||b03c618||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15h.bik||300||b03f9b0||5236916||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15l.bik||300||b53e264||2236992||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16.cam||150||b7604a4||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16h.bik||150||b761e74||2776716||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16l.bik||150||ba07d00||1276724||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17.cam||890||bb3f834||39168||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17h.bik||890||bb49134||15823644||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17l.bik||890||ca60450||8111120||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18.cam||191||d21c860||8412||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18h.bik||192||d21e93c||3436444||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18l.bik||192||d5658d8||1772548||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19.cam||121||d7164dc||5332||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19h.bik||121||d7179b0||2155424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19l.bik||121||d925d50||944536||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20.cam||401||da0c6e8||17652||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20h.bik||401||da10bdc||7142436||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20l.bik||401||e0e0800||3132744||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21.cam||829||e3dd548||36484||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21h.bik||829||e3e63cc||14983636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21l.bik||829||f2305a0||6743692||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22.cam||141||f89ec2c||6212||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22h.bik||141||f8a0470||2585084||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22l.bik||141||fb1766c||1175040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23.cam||550||fc3646c||24208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23h.bik||550||fc3c2fc||9986472||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23l.bik||550||105c24a4||4486592||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24.cam||575||10a09a64||25308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24h.bik||575||10a0fd40||10441380||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24l.bik||575||11404fe4||4692084||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25.cam||130||1187e858||5728||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25h.bik||130||1187feb8||2438880||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25l.bik||130||11ad3598||1140268||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26.cam||101||11be9bc4||4452||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26h.bik||101||11bead28||1792576||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26l.bik||101||11da0768||783064||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27.cam||306||11e5fa40||13472||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27h.bik||306||11e62ee0||5574568||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27l.bik||306||123b3e88||2513668||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28.cam||432||1261998c||19016||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28h.bik||432||1261e3d4||7643824||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28l.bik||432||12d68684||3323692||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29.cam||750||13093db0||33008||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29h.bik||750||1309bea0||13517424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29l.bik||750||13d80110||6015936||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30.cam||2897||1433ccd0||127476||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30h.bik||2925||1435bec4||49898052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30l.bik||2925||172f2108||22289504||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc2.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00.cam||453||0||19940||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00h.bik||453||4de4||8128812||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00l.bik||453||7c5710||3597828||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01.cam||278||b33d14||12240||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01h.bik||278||b36ce4||4869600||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01l.bik||278||fdbac4||2060252||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02.cam||330||11d2aa0||14528||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02h.bik||330||11d6360||5962524||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02l.bik||330||1785e7c||2662428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03.cam||450||1a0fe98||19808||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03h.bik||450||1a14bf8||8227052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03l.bik||450||21ed4e4||3724748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04.cam||168||257aab0||7400||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04h.bik||168||257c798||3036032||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04l.bik||168||2861b18||1356172||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05.cam||219||29acca4||9644||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05h.bik||219||29af250||4033920||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05l.bik||219||2d87fd0||1843800||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06.cam||104||2f4a228||4584||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06h.bik||104||2f4b410||1894044||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06l.bik||104||3119aac||853980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07.cam||160||31ea288||7048||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07h.bik||160||31ebe10||2909428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07l.bik||160||34b2304||1309396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08.cam||381||35f1dd8||16772||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08h.bik||381||35f5f5c||6936652||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08l.bik||381||3c937a8||3126604||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09.cam||226||3f8ecf4||9952||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09h.bik||226||3f913d4||4177224||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09l.bik||226||438d11c||1917924||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10.cam||416||4561500||18312||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10h.bik||416||4565c88||7604492||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10l.bik||416||4ca6594||3444452||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11.cam||603||4fef478||26540||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11h.bik||603||4ff5c24||10981628||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11l.bik||603||5a6ed20||4951152||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12.cam||335||5f27990||14748||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12h.bik||335||5f2b32c||6173264||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12l.bik||335||650e57c||2823184||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13.cam||381||67bf98c||16772||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13h.bik||381||67c3b10||6843600||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13l.bik||381||6e4a7e0||3034044||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14.cam||531||712f39c||23372||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14h.bik||531||7134ee8||9498260||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14l.bik||531||7a43d7c||4188788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15.cam||120||7e427f0||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15h.bik||120||7e43c98||2224344||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15l.bik||120||8062d70||1024412||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16.cam||149||815cf0c||6564||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16h.bik||149||815e8b0||2754272||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16l.bik||149||83fef90||1264204||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17.cam||150||85339dc||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17h.bik||150||85353ac||2722300||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17l.bik||150||87cdda8||1221752||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18.cam||255||88f8220||11228||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18h.bik||255||88fadfc||4656768||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18l.bik||255||8d6bc7c||2106780||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19.cam||428||8f6e218||18840||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19h.bik||428||8f72bb0||7841392||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19l.bik||428||96ed220||3561280||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20.cam||150||9a52960||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20h.bik||150||9a54330||2667756||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20l.bik||150||9cdf81c||1168116||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21.cam||75||9dfcb10||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21h.bik||75||9dfd7fc||1396348||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21l.bik||75||9f52678||646296||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22.cam||120||9ff0310||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22h.bik||120||9ff17b8||2132696||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22l.bik||120||a1fa290||932544||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23.cam||285||a2ddd50||12548||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23h.bik||285||a2e0e54||5164156||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23l.bik||285||a7cdad0||2314168||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24.cam||330||aa02a88||14528||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24h.bik||330||aa06348||6084528||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24l.bik||330||afd3af8||2784636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25.cam||300||b27b874||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25h.bik||300||b27ec0c||5413124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25l.bik||300||b7a8510||2413380||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26.cam||120||b9f5854||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26h.bik||120||b9f6cfc||2180104||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26l.bik||120||bc0b104||980208||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27.cam||75||bcfa5f4||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27h.bik||75||bcfb2e0||1345552||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27l.bik||75||be43af0||595492||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28.cam||120||bed5114||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28h.bik||120||bed65bc||2180512||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28l.bik||120||c0eab5c||980596||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29.cam||692||c1da1d0||30456||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29h.bik||692||c1e18c8||12448828||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29l.bik||692||cdc0d04||5528956||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30.cam||120||d306a80||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30h.bik||120||d307f28||2194876||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30l.bik||120||d51fce4||994700||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31.cam||135||d612a70||5948||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31h.bik||135||d6141ac||2480668||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31l.bik||135||d871bc8||1130648||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32.cam||327||d985c60||14396||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32h.bik||327||d98949c||5902052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32l.bik||327||df2a380||2628608||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33.cam||1186||e1abf80||52192||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33h.bik||1186||e1b8b60||21305376||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33l.bik||1186||f60a380||9445316||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc3.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00.cam||197||0||8676||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00h.bik||197||21e4||3641072||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00l.bik||197||37b0d4||1670856||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01.cam||472||512f9c||20776||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01h.bik||472||5180c4||8222124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01l.bik||472||cef670||3725124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02.cam||105||107cdb4||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02h.bik||105||107dfc8||1970280||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02l.bik||105||125f030||919644||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03.cam||105||133f88c||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03h.bik||105||1340aa0||1958900||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03l.bik||105||151ee94||909292||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04.cam||106||15fce80||4672||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04h.bik||106||15fe0c0||1887824||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04l.bik||106||17caf10||827636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05.cam||106||1895004||4672||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05h.bik||106||1896244||1887052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05l.bik||106||1a62d90||827048||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06.cam||110||1b2cc38||4848||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06h.bik||110||1b2df28||2008528||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06l.bik||110||1d184f8||908540||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07.cam||300||1df61f4||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07h.bik||300||1df958c||5197180||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07l.bik||300||22ee308||2299856||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08.cam||75||251fad8||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08h.bik||75||25207c4||1331060||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08l.bik||75||2665738||580980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09.cam||728||26f34ac||32040||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09h.bik||728||26fb1d4||13015424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09l.bik||728||3364b54||5734772||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10.cam||120||38dccc8||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10h.bik||120||38de170||2201640||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10l.bik||120||3af7998||1001672||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11.cam||315||3bec260||13868||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11h.bik||315||3bef88c||5698360||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11l.bik||315||415ebc4||2548364||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12.cam||226||43cce50||9952||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12h.bik||226||43cf530||4078040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12l.bik||226||47b2f08||1818104||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13.cam||611||496ed00||26892||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13h.bik||611||497560c||10918000||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13l.bik||611||53dee7c||4793772||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14.cam||105||5871428||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14h.bik||105||587263c||1924220||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14l.bik||105||5a482b8||874880||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15.cam||255||5b1dc38||11228||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15h.bik||255||5b20814||4525952||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15l.bik||255||5f71794||2026736||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16.cam||233||6160484||10260||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16h.bik||233||6162c98||4248316||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16l.bik||233||656ff94||1918400||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17.cam||90||6744554||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17h.bik||90||67454d4||1628548||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17l.bik||90||68d2e58||728508||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18.cam||90||6984c14||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18h.bik||90||6985b94||1614036||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18l.bik||90||6b0fc68||714012||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19.cam||162||6bbe184||7136||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19h.bik||162||6bbfd64||2733948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19l.bik||162||6e5b4e0||1195420||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20.cam||275||6f7f27c||12108||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20h.bik||275||6f821c8||4904472||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20l.bik||275||742f7e0||2154376||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21.cam||280||763d768||12328||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21h.bik||280||7640790||4514208||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21l.bik||280||7a8e930||1987908||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22.cam||90||7c73e74||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22h.bik||90||7c74df4||1650640||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22l.bik||90||7e07dc4||750740||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23.cam||200||7ebf258||8808||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23h.bik||200||7ec14c0||3558312||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23l.bik||200||8226068||1558340||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24.cam||600||83a27ac||26408||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24h.bik||600||83a8ed4||10585392||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24l.bik||600||8dc1404||4585408||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25.cam||30||9220bc4||1328||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25h.bik||30||92210f4||559944||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25l.bik||30||92a9c3c||256904||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26.cam||410||92e87c4||18048||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26h.bik||410||92ece44||7479808||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26l.bik||410||9a0f044||3401948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27.cam||130||9d4d920||5728||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27h.bik||130||9d4ef80||2423808||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27l.bik||130||9f9eb80||1123796||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28.cam||376||a0b1154||16552||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28h.bik||376||a0b51fc||6874028||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28l.bik||376||a7435a8||3114128||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29.cam||395||aa3ba38||17388||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29h.bik||395||aa3fe24||7284036||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29l.bik||395||b132368||3334088||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30.cam||625||b460330||27508||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30h.bik||625||b466ea4||11211932||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30l.bik||625||bf18340||4961628||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31.cam||995||c3d389c||43788||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31h.bik||995||c3de3a8||17959496||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31l.bik||995||d4fedf0||8009592||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc4.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00.cam||390||0||17168||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00h.bik||390||4310||7076980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00l.bik||390||6c3f84||3177212||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01.cam||1260||9cba80||55448||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01h.bik||1260||9d9318||22713736||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01l.bik||1260||1f828a0||10113788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02.cam||285||2927b9c||12548||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02h.bik||285||292aca0||5103348||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02l.bik||285||2e08b94||2252028||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03.cam||225||302e890||9908||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03h.bik||225||3030f44||4064732||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03l.bik||225||3411520||1814904||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04.cam||4348||35cc698||191320||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04h.bik||4345||35fb1f0||75274524||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04l.bik||4345||7dc4b0c||32520396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05.cam||3065||9cc83d8||134868||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05h.bik||3065||9ce92ac||28030204||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05l.bik||3065||b7a47a8||15064748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06.cam||7091||c602654||312012||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06h.bik||7091||c64e920||124325396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06l.bik||7091||13cdf734||55224860||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== publish.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc04_00h.bik||117||0||196276||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc04_00l.bik||117||2feb4||86240||BIK&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5860</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5860"/>
		<updated>2020-12-23T18:55:57Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* 0 Default */ fix size of animation frame&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 10 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture, 8 BPP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Pointers count. Fixed (02 00) '''[Unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting. Should be (08 00)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection. Should be (20 00)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) '''[unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
Seems to be 8 pointers in each set.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Camera Animation (WIP) ==&lt;br /&gt;
 All this is based on best effort knowledge from reversing by Maki. I'm just trying to understand it.&lt;br /&gt;
=== Control Word ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller. If 0xFFFFU END&lt;br /&gt;
|}&lt;br /&gt;
==== FOV ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0000'1100'0000U&lt;br /&gt;
===== 1 Default =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| Start = 0x200&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = 0x200&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Same =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = Start&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Different =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| End&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROLL ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0011'0000'0000U&lt;br /&gt;
===== 0 Unknown =====&lt;br /&gt;
 TODO&lt;br /&gt;
===== 1 Default =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| Start = 0x000&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = 0x000&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Same =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = Start&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Different =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| End&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LAYOUT ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0000'0000'0001U&lt;br /&gt;
===== 0 Default =====&lt;br /&gt;
 You'll loop through the data till the first value is less than 0. pushing back to a variable length container.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| int16_t&lt;br /&gt;
| if &amp;lt; 0 break; could be related to time of frame.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 16 bytes&lt;br /&gt;
| Animation Frame&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== 1 Other =====&lt;br /&gt;
 TODO&lt;br /&gt;
===Time===&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
=== Animation Frame ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| is frame durations shot&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Vertice&amp;lt;uint16_t&amp;gt; (x,y,z)&lt;br /&gt;
| World&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| is frame ending shot&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Vertice&amp;lt;uint16_t&amp;gt; (x,y,z)&lt;br /&gt;
| Look At&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F;&lt;br /&gt;
Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64;&lt;br /&gt;
For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5859</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5859"/>
		<updated>2020-12-23T18:54:24Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Animation Frame */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 10 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture, 8 BPP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Pointers count. Fixed (02 00) '''[Unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting. Should be (08 00)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection. Should be (20 00)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) '''[unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
Seems to be 8 pointers in each set.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Camera Animation (WIP) ==&lt;br /&gt;
 All this is based on best effort knowledge from reversing by Maki. I'm just trying to understand it.&lt;br /&gt;
=== Control Word ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller. If 0xFFFFU END&lt;br /&gt;
|}&lt;br /&gt;
==== FOV ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0000'1100'0000U&lt;br /&gt;
===== 1 Default =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| Start = 0x200&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = 0x200&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Same =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = Start&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Different =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| End&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROLL ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0011'0000'0000U&lt;br /&gt;
===== 0 Unknown =====&lt;br /&gt;
 TODO&lt;br /&gt;
===== 1 Default =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| Start = 0x000&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = 0x000&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Same =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = Start&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Different =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| End&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LAYOUT ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0000'0000'0001U&lt;br /&gt;
===== 0 Default =====&lt;br /&gt;
 You'll loop through the data till the first value is less than 0. pushing back to a variable length container.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| int16_t&lt;br /&gt;
| if &amp;lt; 0 break; could be related to time of frame.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 28 bytes&lt;br /&gt;
| Animation Frame&lt;br /&gt;
|}&lt;br /&gt;
===== 1 Other =====&lt;br /&gt;
 TODO&lt;br /&gt;
===Time===&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
=== Animation Frame ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| is frame durations shot&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Vertice&amp;lt;uint16_t&amp;gt; (x,y,z)&lt;br /&gt;
| World&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| is frame ending shot&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Vertice&amp;lt;uint16_t&amp;gt; (x,y,z)&lt;br /&gt;
| Look At&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F;&lt;br /&gt;
Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64;&lt;br /&gt;
For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5858</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5858"/>
		<updated>2020-12-23T18:40:42Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Camera Animation (WIP) */ I'm trying to fix this.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 10 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture, 8 BPP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Pointers count. Fixed (02 00) '''[Unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting. Should be (08 00)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection. Should be (20 00)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) '''[unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
Seems to be 8 pointers in each set.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Camera Animation (WIP) ==&lt;br /&gt;
 All this is based on best effort knowledge from reversing by Maki. I'm just trying to understand it.&lt;br /&gt;
=== Control Word ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller. If 0xFFFFU END&lt;br /&gt;
|}&lt;br /&gt;
==== FOV ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0000'1100'0000U&lt;br /&gt;
===== 1 Default =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| Start = 0x200&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = 0x200&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Same =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = Start&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Different =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| End&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== ROLL ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0011'0000'0000U&lt;br /&gt;
===== 0 Unknown =====&lt;br /&gt;
 TODO&lt;br /&gt;
===== 1 Default =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| Start = 0x000&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = 0x000&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Same =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| None&lt;br /&gt;
| None&lt;br /&gt;
| End = Start&lt;br /&gt;
|}&lt;br /&gt;
===== 2 Different =====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Start&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t&lt;br /&gt;
| End&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== LAYOUT ====&lt;br /&gt;
 Control Word &amp;amp; 0b0000'0000'0000'0001U&lt;br /&gt;
===== 0 Default =====&lt;br /&gt;
 You'll loop through the data till the first value is less than 0. pushing back to a variable length container.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| int16_t&lt;br /&gt;
| if &amp;lt; 0 break; could be related to time of frame.&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 28 bytes&lt;br /&gt;
| Animation Frame&lt;br /&gt;
|}&lt;br /&gt;
===== 1 Other =====&lt;br /&gt;
 TODO&lt;br /&gt;
===Time===&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
=== Animation Frame ===&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| int16_t&lt;br /&gt;
| is frame durations shot&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Vertice&amp;lt;uint16_t&amp;gt; (x,y,z)&lt;br /&gt;
| World&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| int16_t&lt;br /&gt;
| is frame ending shot&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| Vertice&amp;lt;uint16_t&amp;gt; (x,y,z)&lt;br /&gt;
| Look At&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F;&lt;br /&gt;
Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64;&lt;br /&gt;
For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5856</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5856"/>
		<updated>2020-12-16T17:16:02Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* CameraAnimationSet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 10 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture, 8 BPP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Pointers count. Fixed (02 00) '''[Unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting. Should be (08 00)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection. Should be (20 00)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) '''[unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
Seems to be 8 pointers in each set.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F;&lt;br /&gt;
Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64;&lt;br /&gt;
For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5855</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5855"/>
		<updated>2020-12-16T17:15:10Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* CameraAnimationSet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 10 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture, 8 BPP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Pointers count. Fixed (02 00) '''[Unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting. Should be (08 00)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection. Should be (20 00)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) '''[unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Seems to be 8 pointers in each set.&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F;&lt;br /&gt;
Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64;&lt;br /&gt;
For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/Variables&amp;diff=5852</id>
		<title>FF8/Variables</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/Variables&amp;diff=5852"/>
		<updated>2020-12-05T20:03:09Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: Fixed the link to the cheat engine table and adjusted formatting of  Notes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By [[User:Shard|Shard]].&lt;br /&gt;
&lt;br /&gt;
Game variables can be accessed using the PSHM family of script functions, and can be written to by using the POPM family of functions. Which one you use depends on the size of the variable.&lt;br /&gt;
The variables are all stored in save files, with the save block starting at address 0xD10 on uncompressed PC saves. The parameter to access a variable in the game scripts is basically the offset from this point in the variable block. For example, getting main story progress (word 256, which is word 0x100 in hex) just gets the two bytes starting at address 0xD10 + 0x100 = 0xE10. The varmap is continuous in memory while the game is running as well. In the en-US version of the original and SE releases (and likely most other versions), the varblock begins at 0x18fe9b8. You can use this [https://www.mediafire.com/?ucolf65ewq1yoty Cheat Engine Table] to track them as you play.&lt;br /&gt;
&lt;br /&gt;
Items in grey are unused by field scripts (some of them may be used in battle scripts).&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Var type&lt;br /&gt;
! Var Number&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 0-3&lt;br /&gt;
| unused in fields (always &amp;quot;FF-8&amp;quot;)&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 4&lt;br /&gt;
| Steps (used to generate random encounters)&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 8&lt;br /&gt;
| Payslip&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 12-15&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Signed Word&lt;br /&gt;
| 16&lt;br /&gt;
| SeeD rank points?&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 18-19&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 20&lt;br /&gt;
| Battles won. (Fun fact: this affects the basketball shot in Trabia.)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 24-25&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 26&lt;br /&gt;
| Battles escaped.&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 28&lt;br /&gt;
| Enemies killed by Squall&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 30&lt;br /&gt;
| Enemies killed by Zell&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 32&lt;br /&gt;
| Enemies killed by Irvine&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 34&lt;br /&gt;
| Enemies killed by Quistis&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 36&lt;br /&gt;
| Enemies killed by Rinoa&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 38&lt;br /&gt;
| Enemies killed by Selphie&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 40&lt;br /&gt;
| Enemies killed by Seifer&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 42&lt;br /&gt;
| Enemies killed by Edea&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 44&lt;br /&gt;
| Squall death count&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 46&lt;br /&gt;
| Zell death count&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 48&lt;br /&gt;
| Irvine death count&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 50&lt;br /&gt;
| Quistis death count&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 52&lt;br /&gt;
| Rinoa death count&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 54&lt;br /&gt;
| Selphie death count&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 56&lt;br /&gt;
| Seifer death count&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 58&lt;br /&gt;
| Edea death count&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 60-67&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 68&lt;br /&gt;
| Enemies killed&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 72&lt;br /&gt;
| Amount of Gil the party currently has&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 76&lt;br /&gt;
| Amount of Gil Laguna's party has&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 80&lt;br /&gt;
| Counts the number of frames since the current movie started playing.&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 84&lt;br /&gt;
| Last area visited.&lt;br /&gt;
|-&lt;br /&gt;
! Signed Byte&lt;br /&gt;
| 86&lt;br /&gt;
| Current car rent.&lt;br /&gt;
|-&lt;br /&gt;
! Signed Byte&lt;br /&gt;
| 87&lt;br /&gt;
| Built-in engine variable. No idea what it does. Scripts always check if it's equal to 0 or 10. Related to music.&lt;br /&gt;
|-&lt;br /&gt;
! Signed Byte&lt;br /&gt;
| 88&lt;br /&gt;
| Built-in engine variable. Used exclusively on save points. Never written to with field scripts. Related to Siren's Move-Find ability.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 89-103&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 104&lt;br /&gt;
| Seems related to SARALYDISPON/SARALYON/MUSICLOAD/PHSPOWER opcodes&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 108&lt;br /&gt;
| Music related&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 112&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 116-147&lt;br /&gt;
| Draw points in field&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 148-179&lt;br /&gt;
| Draw points in worldmap&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 180-255&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 256&lt;br /&gt;
| Main Story quest progress.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 258&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 259-260&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 261&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 262-263&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 264&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 265&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 266&lt;br /&gt;
| World map version? (3=Esthar locations unlocked)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 267&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 268&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 269&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 270&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 271&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 272-299&lt;br /&gt;
| SO MANY F***ING CARD GAME VARIABLES&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 300&lt;br /&gt;
| Card Queen re-cards.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 301-303&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 304-305&lt;br /&gt;
| Timber Maniacs issues found.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 306-319&lt;br /&gt;
| Reserved for Hacktuar / FF8Voice&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 320-332&lt;br /&gt;
| Ultimecia Gallery related (pictures viewed?)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 333&lt;br /&gt;
| Ultimecia Armory chest flags&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 334&lt;br /&gt;
| Ultimecia Castle seals. See [[FF8/Field/Script/Opcodes/159_SEALEDOFF|SEALEDOFF]] for details.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 335&lt;br /&gt;
| Card related&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 336&lt;br /&gt;
| Deling City bus related&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 338-340&lt;br /&gt;
| Deling Sewer gates opened&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 341&lt;br /&gt;
| Does lots of things.&amp;lt;sub&amp;gt;5&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 342&lt;br /&gt;
| Deling City bus system&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 343&lt;br /&gt;
| G-Garden door/event flags.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 344&lt;br /&gt;
| B-Garden / G-Garden event flags (during GvG)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 345&lt;br /&gt;
| G-Garden door/event flags.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 346-349&lt;br /&gt;
| FH Instrument (346 Zell, 347 Irvine, 348 Selphie, 349 Quistis)&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 350-356&lt;br /&gt;
| Health Bars (Garden mech fight)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 358&lt;br /&gt;
| Space station talk flags, Centra ruins related (beat odin?).&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 359&lt;br /&gt;
| Centra ruins related (beat odin?).&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 360&lt;br /&gt;
| Choice of FH music.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 364-368&lt;br /&gt;
| Randomly generated code for Centra Ruins.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 369-370&lt;br /&gt;
| Ultimecia Castle flags&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 371&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 372-376&lt;br /&gt;
| Ultimecia boss/timer/item flags&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 377&lt;br /&gt;
| Ultimecia organ note controller&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 378&lt;br /&gt;
| Centra Ruins timer (controls blackout messages from Odin)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 379&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 380&lt;br /&gt;
| Squall health during mech fight.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 382-383&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 384&lt;br /&gt;
| Something about Laguna's time periods and GFs.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 385&lt;br /&gt;
| Laguna dialogue in pub. Only the +2 bit is ever set. Don't change the +1 bit.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 387&lt;br /&gt;
| Winhill progress?&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 388&lt;br /&gt;
| Timber Maniacs HQ talk flags (main lobby)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 389&lt;br /&gt;
| Timber Maniacs HQ talk flags (office room)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 390&lt;br /&gt;
| Edea talk flags at her house&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 391&lt;br /&gt;
| Laguna talk flags (in his office, disc 3)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 392&lt;br /&gt;
| unknown (used in Edea's house and in the Balamb Garden computer system)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 393-399&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Long&lt;br /&gt;
| 400 and 404&lt;br /&gt;
| Related to monsters killed in Winhill, but I don't think it actually does anything. Will investigate.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 408&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 409&lt;br /&gt;
| Balamb Garden computer system&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 410-431&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 432&lt;br /&gt;
| BG Main hall flags&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 433&lt;br /&gt;
| Flags. Switches are assigned all over BG. No idea what any of them control.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 434&lt;br /&gt;
| Flags. Switches are assigned all over BG. No idea what any of them control.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 435&lt;br /&gt;
| Flags. Switches are assigned all over BG. No idea what any of them control.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 436&lt;br /&gt;
| Moomba friendship level in the prison? Some actions cause these flags to be set.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 437&lt;br /&gt;
| In BG on Disc 2, keeps track of who's in your party. In the prison, it's the current floor you're on.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 438&lt;br /&gt;
| Cid vs Norg event flags&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 439&lt;br /&gt;
| Cid vs Norg event flags&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 440&lt;br /&gt;
| Event flags. (+1 Quad ambush, +2 quad item giver, +4/+8 Infirmary helped, +16 Nida, +64 Kadowaki Elixir, +128 Training center)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 441&lt;br /&gt;
| Cid vs Norg event flags&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 442&lt;br /&gt;
| Rinoa Garden tour flags&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 443&lt;br /&gt;
| Zell Health in Prison (Hacktuar)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 445-447&lt;br /&gt;
| Propagator defeated flags&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 448&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 450-451&lt;br /&gt;
| Various magazine/talk flags&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 452&lt;br /&gt;
| Lunatic Pandora areas visited?&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 453-455&lt;br /&gt;
| Moomba teleport variables&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 456-457&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 458-459&lt;br /&gt;
| Used with MUSICSKIP in some Balamb Garden areas&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 460&lt;br /&gt;
| Random flags (some used for Card Club)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 461-473&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 474&lt;br /&gt;
| Random flags (some used for Card Club)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 475-478&lt;br /&gt;
| CC Group variables&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 479&lt;br /&gt;
| If set to 0, disables all random battles during area loading.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 480&lt;br /&gt;
| State of students in classroom (what they're doing).&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 481&lt;br /&gt;
| Controls a conversation in the cafeteria.&lt;br /&gt;
|-&lt;br /&gt;
! Signed Word&lt;br /&gt;
| 482&lt;br /&gt;
| Error ratio of missiles&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 484&lt;br /&gt;
| Missile Base progression?&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 485&lt;br /&gt;
| ToUK Progression (initially 0b111010101, +2 on finish quest. No other pops)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 486&lt;br /&gt;
| ToUK room? (used to control map jumps in the maze)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 487&lt;br /&gt;
| Missile base progression (also does something in BG2F classroom)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 488&lt;br /&gt;
| Alternate Party Flags. Irvine +1/+16, Quistis +2/+32, Rinoa +4/+64, Zell +8/+128.&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 489&lt;br /&gt;
| Random talk flags?&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 490&lt;br /&gt;
| Cafeteria cutscene&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 491&lt;br /&gt;
| ToUK stuff&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 492&lt;br /&gt;
| I think this is a door opener for the missile base if you choose a short time limit.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 493&lt;br /&gt;
| Missile base timer related?&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 494-527&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Signed Word&lt;br /&gt;
| 528&lt;br /&gt;
| Sub-story progression (it's a progression variable for individual segments of the game)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 530&lt;br /&gt;
| X-ATM related (defeated it in battle?)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 531&lt;br /&gt;
| Functionally unused. Read from at dollet, only manipulated in debug rooms.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 532&lt;br /&gt;
| Controls footstep sounds at dollet (sand to concrete)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 533&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 534&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 535&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 536&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 537&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 538&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 539&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 540-591&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 592-593&lt;br /&gt;
| Seems to control angles and character facing.&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 594&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 595&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 596&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 597&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 598&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 599&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 600&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 601&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 602&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 603&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 604&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 605&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 606&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 607&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 608&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 609&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 610&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 611&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 612&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 613&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 614&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 615&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 616&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 617&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 618&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 619&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 620&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 621&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 622&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 623&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 624&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 625&lt;br /&gt;
| Balamb visited flags (+8 Zell's room)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 626&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 627&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 628&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 629&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 630&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 631&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 632&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 633&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 634&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 636&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 637&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 638&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 639&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 640&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 641&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 642&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 643&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 644&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 645&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 646&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 647&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 648&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 649&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 650-655&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 656&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 658&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 659&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 660&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 661&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 662&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 663&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 664&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 665&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 666&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 668&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 669-671&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 672&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 674&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 675&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 676&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 677&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 678&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 679&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 680&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 681&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 682&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 683&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 684&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 685&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 686&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 687&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 688&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 689&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 690&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 691&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 692-719&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 720&lt;br /&gt;
| Squall's costume (0=normal, 1=student, 2=SeeD, 3=Bandage on forehead)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 721&lt;br /&gt;
| Zell's Costume (0=normal, 1=student, 2=SeeD)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 722&lt;br /&gt;
| Selphie's costume (0=normal, 1=student, 2=SeeD)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 723&lt;br /&gt;
| Quistis' Costume (0=normal, 1=SeeD)&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 724&lt;br /&gt;
| Dollet mission time&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 726&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 728&lt;br /&gt;
| Does lots of things.&amp;lt;sub&amp;gt;3&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 729&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 730&lt;br /&gt;
| Flags (+1 Joined Garden Festival Committee, +4 Gave Selphie tour of BG, +16 Kadowaki asks for Cid, +32 and +64 Tomb of Unknown Kind hints?, +128 Beat all card people?)&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 731&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Word&lt;br /&gt;
| 732&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 734&lt;br /&gt;
| Split Party Flags (+1 Zell, +2 Irvine, +4 Rinoa, +8 Quistis, +16 Selphie).&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 735&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 736-751&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 752&lt;br /&gt;
| not investigated&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| 753-1023&lt;br /&gt;
| unused in fields&lt;br /&gt;
|-&lt;br /&gt;
! Byte&lt;br /&gt;
| Above 1023&lt;br /&gt;
| Temporary variables used pretty much everywhere.&lt;br /&gt;
|}&lt;br /&gt;
= Notes =&lt;br /&gt;
# When the party splits in disc 2, each party member in the inactive party except Selphie has one of the eight bits changed for this variable. One member has a flag in the 4 most significant bits, and the other has a flag in the 4 least significant bits. It's done this way so that when the characters appear, they animate towards different locations in the field, rather than stacking on top of each other.&lt;br /&gt;
# This byte contains flags for which characters are in Squall's party when the party splits in disc 2.&lt;br /&gt;
# List of everything that 728 holds throughout the game:&lt;br /&gt;
## SeeD field exam &amp;quot;Conduct&amp;quot; score (lose points when you do something wrong at Dollet).&lt;br /&gt;
## Train job attempts (Timber)&lt;br /&gt;
## Tomb of the Unknown King student ID.&lt;br /&gt;
## Who you took to space in disc 3.&lt;br /&gt;
# The field controlling restriction unlocking in Ultimecia's Castle uses this to figure out where to jump the party after they've broken a seal. It's unknown how SETPLACE actually sets this, it's not always related to the field ID or the SETPLACE parameter. This variable is also set at Balamb Garden's front gate manually.:5. List of everything that 341 holds throughout the game:&lt;br /&gt;
## First flashback team&lt;br /&gt;
## Selphie's current action when escaping from Deling's mansion (changes the dialogue)&lt;br /&gt;
## FH Concert Crappiness&lt;br /&gt;
## Something in B-Garden classroom during the paratrooper attack.&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5850</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5850"/>
		<updated>2020-12-01T14:59:26Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Camera data */  added expected values for CameraSetting and CameraAnimationCollection. Also reformatted some things.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 10 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture, 8 BPP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Pointers count. Fixed (02 00) '''[Unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting. Should be (08 00)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection. Should be (20 00)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) '''[unused in code]'''&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F;&lt;br /&gt;
Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64;&lt;br /&gt;
For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5849</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5849"/>
		<updated>2020-11-30T08:08:48Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Info */  i was looking in the .x file and realized the first byte was flipped should be 10 not 01. added note about 8 bpp.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 10 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture, 8 BPP&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F;&lt;br /&gt;
Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64;&lt;br /&gt;
For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5845</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5845"/>
		<updated>2020-11-18T17:15:02Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Texture page calculation */ Moved comments out of blocks so code examples are easier to read.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F;&lt;br /&gt;
Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64;&lt;br /&gt;
For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5844</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5844"/>
		<updated>2020-11-18T17:13:04Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Example */ Moved the comment out of the block. And adjusted the wording.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F; //Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64; //For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96&lt;br /&gt;
Unsure about this one. It could be 42.667 instead of 48. It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24-bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5843</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5843"/>
		<updated>2020-11-18T17:10:45Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Texture page calculation */ Added examples per bit width. Corrected size of texture page at 16 bit. Adjusted formating.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
 Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F; //Bitwise TPage byte AND 0F, to delete first 4 bits                &lt;br /&gt;
 int TPageINT = TPage * 64; //For 16 bit TIM's, the texture page is 64 pixels wide&lt;br /&gt;
&lt;br /&gt;
====Example====&lt;br /&gt;
For 24-bit TIM: &lt;br /&gt;
 0xB2 byte is: 2*48 = 96 // Unsure about this one. It could be 42.667... It takes 1.5x the space of 16 bit. I haven't seen a file that uses 24 bit yet.&lt;br /&gt;
&lt;br /&gt;
For 16-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*64= 128&lt;br /&gt;
&lt;br /&gt;
For 8-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*128 = 256&lt;br /&gt;
&lt;br /&gt;
For 4-bit TIM:&lt;br /&gt;
 0xB2 byte is: 2*256 = 512&lt;br /&gt;
&lt;br /&gt;
Each time you half the number of bits you double the amount of data you can store in the same space. So the calculated Texture Page is different.&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5842</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5842"/>
		<updated>2020-11-18T15:56:55Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Dependency */ Changed this example to use wiki numbering and the headers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Example=====&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&amp;lt;br&amp;gt;&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00 &lt;br /&gt;
# Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
# Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
# Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c&lt;br /&gt;
# Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
# Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
## 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
&lt;br /&gt;
                Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F; //Bitwise TPage byte AND 0F, to delete first 4 bits&lt;br /&gt;
                int TPageINT = TPage * 128; //For 16 bit TIM's, the texture page is 128 sized&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
0xB2 byte is:&lt;br /&gt;
2*128 = 256&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5841</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5841"/>
		<updated>2020-11-18T15:46:12Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Camera Animation (WIP) */ fixed spelling error and added comment.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Current Time // I'm questioning if this is part of the struct.&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&lt;br /&gt;
&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00&lt;br /&gt;
&lt;br /&gt;
1. Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
&lt;br /&gt;
2. Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
&lt;br /&gt;
3. Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c &lt;br /&gt;
&lt;br /&gt;
4. Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
&lt;br /&gt;
5. Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
&lt;br /&gt;
5a. 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
&lt;br /&gt;
                Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F; //Bitwise TPage byte AND 0F, to delete first 4 bits&lt;br /&gt;
                int TPageINT = TPage * 128; //For 16 bit TIM's, the texture page is 128 sized&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
0xB2 byte is:&lt;br /&gt;
2*128 = 256&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5840</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5840"/>
		<updated>2020-11-18T15:36:56Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Camera Animation (WIP) */ OpenVIII had some more up to date Camera Animation data. I tried to update the Table to Match. I copied the Time info from comments.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Animation ID&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| uint8_t&lt;br /&gt;
| Key Frame Count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uint16_t (bit varies)&lt;br /&gt;
| Main controller, if '''0xFFFF''' then return&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting FOV usually ~280&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Ending FOV ~006&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Starting Camera Roll usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Stating Time usually 0&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint16_t&lt;br /&gt;
| Time&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| array&amp;lt;uint8_t,20&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 34&lt;br /&gt;
| array&amp;lt;uint16_t,32&amp;gt;&lt;br /&gt;
| Start Frame Offsets&lt;br /&gt;
|-&lt;br /&gt;
| 98&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Z&lt;br /&gt;
|-&lt;br /&gt;
| 162&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World X&lt;br /&gt;
|-&lt;br /&gt;
| 226&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera World Y&lt;br /&gt;
|-&lt;br /&gt;
| 290&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Durations Shot ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 322&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Z&lt;br /&gt;
|-&lt;br /&gt;
| 386&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At X&lt;br /&gt;
|-&lt;br /&gt;
| 450&lt;br /&gt;
| array&amp;lt;int16_t,32&amp;gt;&lt;br /&gt;
| Camera Look At Y&lt;br /&gt;
|-&lt;br /&gt;
| 514&lt;br /&gt;
| array&amp;lt;uint8_t,32&amp;gt;&lt;br /&gt;
| Is Frame Ending Shots ~ bool?&lt;br /&gt;
|-&lt;br /&gt;
| 546&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 674&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 802&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 930&lt;br /&gt;
| array&amp;lt;uint8_t,128&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|-&lt;br /&gt;
| 1058&lt;br /&gt;
| array&amp;lt;uint8_t,34&amp;gt;&lt;br /&gt;
| unknown bytes&lt;br /&gt;
|}&lt;br /&gt;
Total bytes of struct is '''1092'''. Still much is unknown about this struct. I adjusted things from OpenVIII source code. Though some numbers weren't adding up. I know the total size. So I adjusted one of the unknown bytes arrays to fit in the span.&lt;br /&gt;
======Time======&lt;br /&gt;
 Time is calculated from number of frames. You basically set starting position World+lookat and ending position, then mark number of frames to interpolate between them. Every frame is one draw call and it costs 16. Starting time needs to be equal or higher for next animation frame to be read; If next frame==0xFFFF then it's all done.&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&lt;br /&gt;
&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00&lt;br /&gt;
&lt;br /&gt;
1. Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
&lt;br /&gt;
2. Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
&lt;br /&gt;
3. Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c &lt;br /&gt;
&lt;br /&gt;
4. Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
&lt;br /&gt;
5. Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
&lt;br /&gt;
5a. 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
&lt;br /&gt;
                Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F; //Bitwise TPage byte AND 0F, to delete first 4 bits&lt;br /&gt;
                int TPageINT = TPage * 128; //For 16 bit TIM's, the texture page is 128 sized&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
0xB2 byte is:&lt;br /&gt;
2*128 = 256&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5839</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5839"/>
		<updated>2020-11-18T14:25:54Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Face order / Translation/ triangulation */ Changed bold section titles to headings so they show in the table of contents.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| WORD (bit varies)&lt;br /&gt;
| Main controller, if 0xFFFF then return, stored into camera struct+2&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct+4 (2nd controller?)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct+6 (3rd controller?)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct, varies by 4&amp;gt;&amp;gt;8&amp;amp;3 case switch&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| WORD&lt;br /&gt;
| Animation speed (confirmed)&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| WORD&lt;br /&gt;
| Word field related to camera index? crashed when 0x0070&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&lt;br /&gt;
&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00&lt;br /&gt;
&lt;br /&gt;
1. Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
&lt;br /&gt;
2. Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
&lt;br /&gt;
3. Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c &lt;br /&gt;
&lt;br /&gt;
4. Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
&lt;br /&gt;
5. Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
&lt;br /&gt;
5a. 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
&lt;br /&gt;
                Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F; //Bitwise TPage byte AND 0F, to delete first 4 bits&lt;br /&gt;
                int TPageINT = TPage * 128; //For 16 bit TIM's, the texture page is 128 sized&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
0xB2 byte is:&lt;br /&gt;
2*128 = 256&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
====Quad wing order====&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
====Quad triangulation face order====&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
====Triangles VT order====&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
====Example====&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5838</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5838"/>
		<updated>2020-11-18T14:21:54Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* How is this file handled by the engine? */ Changed the sections titles from bold to headings so they show in the table of contents&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Objects Group====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Objects List=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Settings 1=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| WORD (bit varies)&lt;br /&gt;
| Main controller, if 0xFFFF then return, stored into camera struct+2&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct+4 (2nd controller?)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct+6 (3rd controller?)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct, varies by 4&amp;gt;&amp;gt;8&amp;amp;3 case switch&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| WORD&lt;br /&gt;
| Animation speed (confirmed)&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| WORD&lt;br /&gt;
| Word field related to camera index? crashed when 0x0070&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&lt;br /&gt;
&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00&lt;br /&gt;
&lt;br /&gt;
1. Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
&lt;br /&gt;
2. Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
&lt;br /&gt;
3. Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c &lt;br /&gt;
&lt;br /&gt;
4. Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
&lt;br /&gt;
5. Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
&lt;br /&gt;
5a. 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
&lt;br /&gt;
                Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F; //Bitwise TPage byte AND 0F, to delete first 4 bits&lt;br /&gt;
                int TPageINT = TPage * 128; //For 16 bit TIM's, the texture page is 128 sized&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
0xB2 byte is:&lt;br /&gt;
2*128 = 256&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
'''1.Quad wing order:'''&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
'''2.Quad triangulation face order'''&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
'''&lt;br /&gt;
3.Triangles VT order:'''&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
  Example:&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5837</id>
		<title>FF8/FileFormat X</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_X&amp;diff=5837"/>
		<updated>2020-11-18T14:15:43Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Camera data */ Changed the sections to Headings so they would show in the table of contents.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By MaKiPL. Thanks for help in research for: shakotay2 (XeNTaX), Halfer, Yagami Light.  &lt;br /&gt;
Complete list of original battle stages by Kaspar01: [[FF8/BS_list|List of battle stages]]&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
&lt;br /&gt;
.X file is uncompressed 3D stage model with texture embedeed. The file contains unused info (not used by FF8 engine), camera data, movement, translations and geometry data. &lt;br /&gt;
&lt;br /&gt;
Battle stages '''DOES NOT''' contain pointers to next sections. All pointers are '''HARDCODED''' in FF8.EXE. [[FF8/BattleStage/Pointers|Click me for battle stage pointer list]]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Usually starting with:&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| PlayStation MIPS assembly&lt;br /&gt;
| E8 FF BD 27 01 00 02&lt;br /&gt;
| Used only in PS version; skipped in PC&lt;br /&gt;
|-&lt;br /&gt;
| Camera data + movement&lt;br /&gt;
| 02 00 08 00 20 00&lt;br /&gt;
| Camera animations, movement (pre-keyed)&lt;br /&gt;
|-&lt;br /&gt;
| Model section&lt;br /&gt;
| 06 00 00 00 (See geometry section info)&lt;br /&gt;
| Divides to object (group) and it's sub-objects + vert/triangle grouping&lt;br /&gt;
|-&lt;br /&gt;
| Texture&lt;br /&gt;
| 01 00 00 00 09 (Always)&lt;br /&gt;
| Contains one .TIM texture &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== How is this file handled by the engine? ==&lt;br /&gt;
&lt;br /&gt;
FF8 loads specific file and reads it from hardcoded (written in FF8 code) position (or reads MIPS PlayStation assembly that contains battle stage load code). This hardcoded position points to camera data (in PC). Camera data has size uint16, which is calculated and relative jump is made. Just after camera, a typical section based file handling is made. &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #2&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #3&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Objects group #4&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| uint32&lt;br /&gt;
| Texture&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Objects group:'''&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of sections&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #1&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to ObjectsList&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| uint32&lt;br /&gt;
| Pointer to Settings #2&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative to end_of_group&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Objects list:'''&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint32&lt;br /&gt;
| Number of objects&lt;br /&gt;
|-&lt;br /&gt;
| Num_of_obj*4&lt;br /&gt;
| uint32&lt;br /&gt;
| Relative pointer to segment (one .obj file) [01 00 01 00]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Settings 1:'''&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| Unknown, fixed 2?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| sint16 (probably, or uint16)&lt;br /&gt;
| Scale (01 is the smallest)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| PADDING&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| sint16&lt;br /&gt;
| X or Z Axis rot origin (Translation)&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 44 bytes&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|-&lt;br /&gt;
| 64&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| if not FF FF or 00 00, then model vanishes&lt;br /&gt;
|-&lt;br /&gt;
| 66&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Nothing?&lt;br /&gt;
|-&lt;br /&gt;
| 68&lt;br /&gt;
| ...up to end&lt;br /&gt;
| Left null for storing some engine data AFTER loaded in-game&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This might look difficult, but it's like multi-pointer file that starts at different location given by executable. See list at the beginning of this wiki to see which stages camera starts at which position (where FF8.exe really starts to read file as BattleStage) [FF8 stores whole file, even with useless data before camera]&lt;br /&gt;
If this still makes trouble, see this video: TODO&lt;br /&gt;
&lt;br /&gt;
== Camera data ==&lt;br /&gt;
&lt;br /&gt;
Starts at ~0x5d4 (see How the engine handles this file?). &lt;br /&gt;
[.text:00509820]&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uInt16&lt;br /&gt;
| Fixed 02 00 (Unused in code)/ pointers count&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraSetting&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| uInt16&lt;br /&gt;
| Relative jump to CameraAnimationCollection&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| uInt16&lt;br /&gt;
| Camera data size (starting from 0) [unused in code]&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 24 bytes&lt;br /&gt;
| Camera Settings&lt;br /&gt;
|-&lt;br /&gt;
| 32&lt;br /&gt;
| ?? bytes&lt;br /&gt;
| Camera Animation Collection&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Setting====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| char (based on disassembly)&lt;br /&gt;
| CameraAnimMode?&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| byte?&lt;br /&gt;
| StopEnemyBeforeAnim?&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Bitfield? (1B)&lt;br /&gt;
| UHM?&lt;br /&gt;
|-&lt;br /&gt;
| 3&lt;br /&gt;
| ???&lt;br /&gt;
| DefaultEndofCameraPosition_Zoom?&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Camera Animations Collection====&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| uint16&lt;br /&gt;
| NumOfSets&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)&lt;br /&gt;
| uint16&lt;br /&gt;
| Relative pointer to camera Animation Set&lt;br /&gt;
|-&lt;br /&gt;
| 2 *(Set index)+ 2&lt;br /&gt;
| uint16&lt;br /&gt;
| Camera EOF&lt;br /&gt;
|-&lt;br /&gt;
| CameraAnimationSetPointer&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
| CameraAnimationSet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====CameraAnimationSet=====&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|ushort&lt;br /&gt;
|AnimPointer*2 &lt;br /&gt;
|-&lt;br /&gt;
|AnimPointer&lt;br /&gt;
|Varies 144-146-148 bytes usually&lt;br /&gt;
|CameraAnimation&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=====Camera Animation (WIP)===== &lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| WORD (bit varies)&lt;br /&gt;
| Main controller, if 0xFFFF then return, stored into camera struct+2&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct+4 (2nd controller?)&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct+6 (3rd controller?)&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown, stored into camera struct, varies by 4&amp;gt;&amp;gt;8&amp;amp;3 case switch&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| WORD&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| WORD&lt;br /&gt;
| Animation speed (confirmed)&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| WORD&lt;br /&gt;
| Word field related to camera index? crashed when 0x0070&lt;br /&gt;
|-&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
| ???&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=====Dependency=====&lt;br /&gt;
&lt;br /&gt;
   CAMERA:&lt;br /&gt;
   -Camera Settings&lt;br /&gt;
   -Camera Animation Collection (even three collections in a0stg006.x and up to 7 in a0stg101.x!)&lt;br /&gt;
      |&lt;br /&gt;
      |&lt;br /&gt;
       -Camera animation Set (Always 8 camera animations, may be empty (0xFFFF); look for example to a0stg127.x collectionId==1; there are 8 animations, but 7 of them are 0xFFFF (pointers increase by 2))&lt;br /&gt;
          |&lt;br /&gt;
          |&lt;br /&gt;
           - Camera animation&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
a0stg006.x:&lt;br /&gt;
&lt;br /&gt;
0x5d8 -&amp;gt; 02 00 08 00 20 00&lt;br /&gt;
&lt;br /&gt;
1. Get EOF-&amp;gt; *(0x5d8 + 8) -&amp;gt; 32&lt;br /&gt;
&lt;br /&gt;
2. Jump to EOF -&amp;gt; 0x5d8 + 32 = 0x5F8 (This is now Camera Animation Collection)&lt;br /&gt;
&lt;br /&gt;
3. Get pointer to correct anim collection. In this case we will use AnimCollectionID == 0, so:  *(0x5F8 + 0*2 + 2) -&amp;gt; 0x0c &lt;br /&gt;
&lt;br /&gt;
4. Jump to Anim collection data: 0x5F8 + 0x0c = 0x604 (This is now Camera Animation Set)&lt;br /&gt;
&lt;br /&gt;
5. Jump to Camera animation by cameraAnimSetID, let's take for example cameraAnimSetID == 7, so: *(0x604 + 7*2) -&amp;gt; 0x25E. Now carefully, jump by multiplying it by 2! &lt;br /&gt;
&lt;br /&gt;
5a. 0x604 + (0x25E * 2) = 0xAC0&lt;br /&gt;
&lt;br /&gt;
Therefore: a0stg006.x Camera animation 7 in camera collection 0 is at 0xAC0&lt;br /&gt;
&lt;br /&gt;
== Geometry ==&lt;br /&gt;
Geometry contains groups, that contains Triangles and/or quads poligons. Models always stars at 01 00 01 00, and needs to be after camera data, either it's not model itself, but some other data. &lt;br /&gt;
&lt;br /&gt;
==== Group ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Offset&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Length&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| Always 01 00 01 00 / Header of object&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| Uint16 / number of vertices. &lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| Number of vertices * 6&lt;br /&gt;
| Vertex data, short X; short Y; short Z;&lt;br /&gt;
|-&lt;br /&gt;
| 6 + (Number of vertices *6)&lt;br /&gt;
| (AbsolutePosition MOD 4) + 4&lt;br /&gt;
| Padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of triangles&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 2 bytes&lt;br /&gt;
| uint16 / number of quads&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| 4 bytes&lt;br /&gt;
| padding&lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of triangles * 20&lt;br /&gt;
| Triangle data. If NumOfTriangles = 0, then instead of any triangle data, there's quad data. &lt;br /&gt;
|-&lt;br /&gt;
| varies (just after above)&lt;br /&gt;
| number of quads * 24&lt;br /&gt;
| Triangle data. If NumOfQuads = 0, then instead of any quad data, there's either next header 01 00 01 00, or end of group. &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Triangle =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below / After QUAD table)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after QUAD table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Quad =====&lt;br /&gt;
&lt;br /&gt;
 {| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Name&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Type&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| F1 (A)&lt;br /&gt;
| uint16&lt;br /&gt;
| A of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F2 (B)&lt;br /&gt;
| uint16&lt;br /&gt;
| B of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F3 (C)&lt;br /&gt;
| uint16&lt;br /&gt;
| C of face indice&lt;br /&gt;
|-&lt;br /&gt;
| F4 (D)&lt;br /&gt;
| uint16&lt;br /&gt;
| D of face indice&lt;br /&gt;
|-&lt;br /&gt;
| U1&lt;br /&gt;
| Byte&lt;br /&gt;
| U of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V1&lt;br /&gt;
| Byte&lt;br /&gt;
| V of first texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| CLUT_ID&lt;br /&gt;
| UInt16 (BIT operated)*&lt;br /&gt;
| Index to CLUT_ID operated by BIT (see below)&lt;br /&gt;
|-&lt;br /&gt;
| U2&lt;br /&gt;
| Byte&lt;br /&gt;
| U of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V2&lt;br /&gt;
| Byte&lt;br /&gt;
| V of second texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Special (see below)&lt;br /&gt;
| 8 Byte&lt;br /&gt;
| See below (after table)&lt;br /&gt;
|-&lt;br /&gt;
| Hide&lt;br /&gt;
| Byte/Bool&lt;br /&gt;
| Bool. Hides or shows texture&lt;br /&gt;
|-&lt;br /&gt;
| U3&lt;br /&gt;
| Byte&lt;br /&gt;
| U of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V3&lt;br /&gt;
| Byte&lt;br /&gt;
| V of third texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| U4&lt;br /&gt;
| Byte&lt;br /&gt;
| U of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| V4&lt;br /&gt;
| Byte&lt;br /&gt;
| V of fourth texture coordinate&lt;br /&gt;
|-&lt;br /&gt;
| Red&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Red)&lt;br /&gt;
|-&lt;br /&gt;
| Green&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Green)&lt;br /&gt;
|-&lt;br /&gt;
| Blue&lt;br /&gt;
| Byte&lt;br /&gt;
| Texture colourization (Blue)&lt;br /&gt;
|-&lt;br /&gt;
| PSone GPU related&lt;br /&gt;
| Byte&lt;br /&gt;
| PSOne instruction&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Special Byte:&lt;br /&gt;
This byte, needs to be divided to two bytes. So, for example, a 0xE5 needs to be treated like two bytes:&lt;br /&gt;
0x0E&lt;br /&gt;
0x05&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Singular of char&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Example&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | Description&lt;br /&gt;
|-&lt;br /&gt;
| First char/ 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 0B&lt;br /&gt;
| Unknown&lt;br /&gt;
|-&lt;br /&gt;
| Second char / 4 BIT&lt;br /&gt;
| B2 --&amp;gt; 02&lt;br /&gt;
| Texture page number&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== CLUT ID ====&lt;br /&gt;
&lt;br /&gt;
The most important bit's are the first two on one byte, and last two on last byte. Example:&lt;br /&gt;
00000000 00111100 (00 3C)&lt;br /&gt;
should be read like this:&lt;br /&gt;
00111100 00000000 (3C 00) &lt;br /&gt;
And the CLUT ID is revealed by watching this four bits:&lt;br /&gt;
001111[00 00]000000&lt;br /&gt;
&lt;br /&gt;
Same applies to reading CLUT colors (16bits) where they are: 1b-T, 5b-B, 5b-G, 5b-R (Or RGBT if reordered as shown above)&lt;br /&gt;
&lt;br /&gt;
Complete list (without replacing bit order - as is in HEX editor/memory):&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; cellpadding=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border: 1px solid black; border-collapse: collapse;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | CLUT ID&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | BIT&lt;br /&gt;
! style=&amp;quot;background:rgb(204,204,204)&amp;quot; | HEX&lt;br /&gt;
|-&lt;br /&gt;
| #1&lt;br /&gt;
| 00000000 00111100&lt;br /&gt;
| 00 3C&lt;br /&gt;
|-&lt;br /&gt;
| #2&lt;br /&gt;
| 01000000 00111100&lt;br /&gt;
| 40 3C&lt;br /&gt;
|-&lt;br /&gt;
| #3&lt;br /&gt;
| 10000000 00111100&lt;br /&gt;
| 80 3C&lt;br /&gt;
|-&lt;br /&gt;
| #4&lt;br /&gt;
| 11000000 00111100&lt;br /&gt;
| C0 3C&lt;br /&gt;
|-&lt;br /&gt;
| #5&lt;br /&gt;
| 00000000 00111101&lt;br /&gt;
| 00 3D&lt;br /&gt;
|-&lt;br /&gt;
| #6&lt;br /&gt;
| 01000000 00111101&lt;br /&gt;
| 40 3D&lt;br /&gt;
|-&lt;br /&gt;
| #7&lt;br /&gt;
| 10000000 00111101&lt;br /&gt;
| 80 3D&lt;br /&gt;
|-&lt;br /&gt;
| #8&lt;br /&gt;
| 11000000 00111101&lt;br /&gt;
| C0 3D&lt;br /&gt;
|-&lt;br /&gt;
| #9&lt;br /&gt;
| 00000000 00111110&lt;br /&gt;
| 00 3E&lt;br /&gt;
|-&lt;br /&gt;
| #10&lt;br /&gt;
| 01000000 00111110&lt;br /&gt;
| 40 3E&lt;br /&gt;
|-&lt;br /&gt;
| #11&lt;br /&gt;
| 10000000 00111110&lt;br /&gt;
| 80 3E&lt;br /&gt;
|-&lt;br /&gt;
| #12&lt;br /&gt;
| 11000000 00111110&lt;br /&gt;
| C0 3E&lt;br /&gt;
|-&lt;br /&gt;
| #13&lt;br /&gt;
| 00000000 00111111&lt;br /&gt;
| 00 3F&lt;br /&gt;
|-&lt;br /&gt;
| #14&lt;br /&gt;
| 01000000 00111111&lt;br /&gt;
| 40 3F&lt;br /&gt;
|-&lt;br /&gt;
| #15&lt;br /&gt;
| 10000000 00111111&lt;br /&gt;
| 80 3F&lt;br /&gt;
|-&lt;br /&gt;
| #16&lt;br /&gt;
| 11000000 00111111&lt;br /&gt;
| C0 3F&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Texture ==&lt;br /&gt;
&lt;br /&gt;
Contains one [[PSX/TIM_format|TIMs]] with various size 512x256, 673x256, 768x256 (8BPP).&lt;br /&gt;
&lt;br /&gt;
=== UV calculation algorithm ===&lt;br /&gt;
&lt;br /&gt;
 Float U = (float)U_Byte / (float)(TIM_Texture_Width * 2) + ((float)Texture_Page/(TIM_Texture_Width * 2));&lt;br /&gt;
&lt;br /&gt;
=== Texture page calculation ===&lt;br /&gt;
&lt;br /&gt;
                Byte TPage = InputBytes[TexturePage_index] &amp;amp; 0F; //Bitwise TPage byte AND 0F, to delete first 4 bits&lt;br /&gt;
                int TPageINT = TPage * 128; //For 16 bit TIM's, the texture page is 128 sized&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
0xB2 byte is:&lt;br /&gt;
2*128 = 256&lt;br /&gt;
&lt;br /&gt;
=== Face order / Translation/ triangulation ===&lt;br /&gt;
&lt;br /&gt;
'''1.Quad wing order:'''&lt;br /&gt;
  ABCD ---&amp;gt; ABDC&lt;br /&gt;
  example:&lt;br /&gt;
   f 1 2 3 4&lt;br /&gt;
  to:&lt;br /&gt;
   f 1 2 4 3&lt;br /&gt;
&lt;br /&gt;
'''2.Quad triangulation face order'''&lt;br /&gt;
  ABDC &amp;gt; ABD&lt;br /&gt;
         ACD (same for VT)&lt;br /&gt;
  example:&lt;br /&gt;
  f 1 2 4 3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1 2 4&lt;br /&gt;
  f 1 3 4&lt;br /&gt;
'''&lt;br /&gt;
3.Triangles VT order:'''&lt;br /&gt;
  A/T1 &amp;gt; A/T2&lt;br /&gt;
  B/T2 &amp;gt; B/T3&lt;br /&gt;
  C/T3 &amp;gt; C/T1&lt;br /&gt;
  Example:&lt;br /&gt;
  (Also with quad triangulation face order!)&lt;br /&gt;
  f 1/1 2/2 7/4 6/3&lt;br /&gt;
  to:&lt;br /&gt;
  f 1/1 2/2 7/4&lt;br /&gt;
  f 1/1 6/3 7/4&lt;br /&gt;
  where:&lt;br /&gt;
  A=1 B=2 C=6 D=7&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5831</id>
		<title>FF8/FileFormat PAK</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5831"/>
		<updated>2020-11-01T18:11:04Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* Pak File Details */ added a paragraph about the naming scheme.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Final Fantasy VIII's movie files are stored within pak files. This is for the CD 2000 version only. Steam 2013 version uses avi files.  '''publish.pak''' contains the message &amp;quot;Published by Square Electronic Arts L.L.C.&amp;quot;. '''disc1.pak''', '''disc2.pak''', '''disc3.pak''', and '''disc4.pak''' hold the rest of the FMV movies.&lt;br /&gt;
&lt;br /&gt;
=PAK File Structure=&lt;br /&gt;
The PAK file has no header. Each movie usually contains a CAM file and two BINK videos. A PAK file can contain multiple movies. One BINK file is the low res the other is the high res.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Section !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CAM - optional || Camera data &lt;br /&gt;
|-&lt;br /&gt;
| BINK - high res || FMV video&lt;br /&gt;
|-&lt;br /&gt;
| BINK - low res || FMV video&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Existing projects you can use to extract the PAK files.===&lt;br /&gt;
* https://github.com/MaKiPL/OpenVIII-monogame/tree/master/PAK%20Extractor&lt;br /&gt;
* https://github.com/MaKiPL/FF8-Rinoa-s-Toolset/blob/master/SerahToolkit_SharpGL/FF8_Core/PlayMovie.cs&lt;br /&gt;
* https://github.com/Sebanisu/OpenVIII_CPP_WIP/tree/master/src/open_viii/pak&lt;br /&gt;
&lt;br /&gt;
==BINK files==&lt;br /&gt;
* Start with 0x42494B &amp;quot;BIK&amp;quot;&lt;br /&gt;
* More info: https://wiki.multimedia.cx/index.php/Bink_Container&lt;br /&gt;
&lt;br /&gt;
==CAM files==&lt;br /&gt;
* Each frame is 44 bytes long.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 bytes || 0x463850 &amp;quot;F8P&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 bytes (uint16) || Approx number of frames. There can be extra data.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 44 bytes * number of frames || Frame data. Each frame ends with &amp;quot;END&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pak File Details ==&lt;br /&gt;
The filenames are based on the 2013 name scheme. I am using '''h''' suffix for high res and '''l''' suffix for low res. Disc numbers go from 0-3. And 4 being for extra videos not fmv related.&lt;br /&gt;
===== disc1.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00.cam||326||0||14352||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00h.bik||326||3810||5759124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00l.bik||326||5818a4||2498748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01.cam||199||7e3960||8764||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01h.bik||205||7e5b9c||3572420||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01l.bik||205||b4de60||1522312||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02.cam||161||cc18e8||7092||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02h.bik||161||cc349c||2805776||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02l.bik||161||f704ac||1410720||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03.cam||1100||10c8b4c||48408||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03h.bik||1100||10d4864||19654004||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03l.bik||1100||2392dd8||8597316||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04.cam||215||2bc5d1c||9468||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04h.bik||215||2bc8218||3778948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04l.bik||215||2f62b9c||1628944||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05.cam||1114||30f06ac||49024||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05h.bik||1114||30fc62c||20063552||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05l.bik||1114||441eb6c||8923620||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06.cam||41||4ca1550||1812||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06h.bik||41||4ca1c64||757108||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06l.bik||41||4d5a9d8||347236||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07.cam||1084||4daf63c||47704||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07h.bik||1084||4dbb094||19696056||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07l.bik||1084||6083a4c||8855428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08.cam||324||68f59d0||14264||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08h.bik||324||68f9188||4736972||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08l.bik||324||6d7d954||2073440||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09.cam||1391||6f77cb4||61212||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09h.bik||1391||6f86bd0||24180228||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09l.bik||1391||86961d4||10270268||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10.cam||393||9061810||17300||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10h.bik||393||9065ba4||7195820||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10l.bik||393||9742850||3265804||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11.cam||465||9a5fd5c||20468||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11h.bik||465||9a64d50||8496456||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11l.bik||465||a27f298||3846440||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12.cam||45||a62a3c0||1988||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12h.bik||45||a62ab84||752040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12l.bik||45||a6e252c||300964||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13.cam||15||a72bcd0||668||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13h.bik||15||a72bf6c||249788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13l.bik||15||a768f28||99988||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14.cam||360||a7815bc||15848||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14h.bik||360||a7853a4||6369460||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14l.bik||360||ad98458||2769344||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15.cam||300||b03c618||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15h.bik||300||b03f9b0||5236916||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15l.bik||300||b53e264||2236992||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16.cam||150||b7604a4||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16h.bik||150||b761e74||2776716||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16l.bik||150||ba07d00||1276724||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17.cam||890||bb3f834||39168||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17h.bik||890||bb49134||15823644||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17l.bik||890||ca60450||8111120||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18.cam||191||d21c860||8412||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18h.bik||192||d21e93c||3436444||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18l.bik||192||d5658d8||1772548||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19.cam||121||d7164dc||5332||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19h.bik||121||d7179b0||2155424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19l.bik||121||d925d50||944536||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20.cam||401||da0c6e8||17652||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20h.bik||401||da10bdc||7142436||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20l.bik||401||e0e0800||3132744||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21.cam||829||e3dd548||36484||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21h.bik||829||e3e63cc||14983636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21l.bik||829||f2305a0||6743692||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22.cam||141||f89ec2c||6212||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22h.bik||141||f8a0470||2585084||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22l.bik||141||fb1766c||1175040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23.cam||550||fc3646c||24208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23h.bik||550||fc3c2fc||9986472||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23l.bik||550||105c24a4||4486592||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24.cam||575||10a09a64||25308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24h.bik||575||10a0fd40||10441380||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24l.bik||575||11404fe4||4692084||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25.cam||130||1187e858||5728||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25h.bik||130||1187feb8||2438880||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25l.bik||130||11ad3598||1140268||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26.cam||101||11be9bc4||4452||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26h.bik||101||11bead28||1792576||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26l.bik||101||11da0768||783064||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27.cam||306||11e5fa40||13472||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27h.bik||306||11e62ee0||5574568||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27l.bik||306||123b3e88||2513668||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28.cam||432||1261998c||19016||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28h.bik||432||1261e3d4||7643824||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28l.bik||432||12d68684||3323692||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29.cam||750||13093db0||33008||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29h.bik||750||1309bea0||13517424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29l.bik||750||13d80110||6015936||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30.cam||2897||1433ccd0||127476||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30h.bik||2925||1435bec4||49898052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30l.bik||2925||172f2108||22289504||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc2.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00.cam||453||0||19940||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00h.bik||453||4de4||8128812||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00l.bik||453||7c5710||3597828||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01.cam||278||b33d14||12240||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01h.bik||278||b36ce4||4869600||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01l.bik||278||fdbac4||2060252||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02.cam||330||11d2aa0||14528||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02h.bik||330||11d6360||5962524||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02l.bik||330||1785e7c||2662428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03.cam||450||1a0fe98||19808||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03h.bik||450||1a14bf8||8227052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03l.bik||450||21ed4e4||3724748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04.cam||168||257aab0||7400||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04h.bik||168||257c798||3036032||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04l.bik||168||2861b18||1356172||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05.cam||219||29acca4||9644||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05h.bik||219||29af250||4033920||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05l.bik||219||2d87fd0||1843800||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06.cam||104||2f4a228||4584||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06h.bik||104||2f4b410||1894044||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06l.bik||104||3119aac||853980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07.cam||160||31ea288||7048||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07h.bik||160||31ebe10||2909428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07l.bik||160||34b2304||1309396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08.cam||381||35f1dd8||16772||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08h.bik||381||35f5f5c||6936652||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08l.bik||381||3c937a8||3126604||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09.cam||226||3f8ecf4||9952||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09h.bik||226||3f913d4||4177224||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09l.bik||226||438d11c||1917924||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10.cam||416||4561500||18312||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10h.bik||416||4565c88||7604492||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10l.bik||416||4ca6594||3444452||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11.cam||603||4fef478||26540||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11h.bik||603||4ff5c24||10981628||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11l.bik||603||5a6ed20||4951152||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12.cam||335||5f27990||14748||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12h.bik||335||5f2b32c||6173264||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12l.bik||335||650e57c||2823184||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13.cam||381||67bf98c||16772||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13h.bik||381||67c3b10||6843600||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13l.bik||381||6e4a7e0||3034044||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14.cam||531||712f39c||23372||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14h.bik||531||7134ee8||9498260||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14l.bik||531||7a43d7c||4188788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15.cam||120||7e427f0||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15h.bik||120||7e43c98||2224344||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15l.bik||120||8062d70||1024412||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16.cam||149||815cf0c||6564||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16h.bik||149||815e8b0||2754272||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16l.bik||149||83fef90||1264204||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17.cam||150||85339dc||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17h.bik||150||85353ac||2722300||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17l.bik||150||87cdda8||1221752||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18.cam||255||88f8220||11228||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18h.bik||255||88fadfc||4656768||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18l.bik||255||8d6bc7c||2106780||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19.cam||428||8f6e218||18840||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19h.bik||428||8f72bb0||7841392||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19l.bik||428||96ed220||3561280||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20.cam||150||9a52960||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20h.bik||150||9a54330||2667756||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20l.bik||150||9cdf81c||1168116||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21.cam||75||9dfcb10||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21h.bik||75||9dfd7fc||1396348||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21l.bik||75||9f52678||646296||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22.cam||120||9ff0310||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22h.bik||120||9ff17b8||2132696||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22l.bik||120||a1fa290||932544||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23.cam||285||a2ddd50||12548||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23h.bik||285||a2e0e54||5164156||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23l.bik||285||a7cdad0||2314168||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24.cam||330||aa02a88||14528||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24h.bik||330||aa06348||6084528||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24l.bik||330||afd3af8||2784636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25.cam||300||b27b874||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25h.bik||300||b27ec0c||5413124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25l.bik||300||b7a8510||2413380||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26.cam||120||b9f5854||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26h.bik||120||b9f6cfc||2180104||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26l.bik||120||bc0b104||980208||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27.cam||75||bcfa5f4||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27h.bik||75||bcfb2e0||1345552||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27l.bik||75||be43af0||595492||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28.cam||120||bed5114||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28h.bik||120||bed65bc||2180512||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28l.bik||120||c0eab5c||980596||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29.cam||692||c1da1d0||30456||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29h.bik||692||c1e18c8||12448828||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29l.bik||692||cdc0d04||5528956||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30.cam||120||d306a80||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30h.bik||120||d307f28||2194876||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30l.bik||120||d51fce4||994700||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31.cam||135||d612a70||5948||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31h.bik||135||d6141ac||2480668||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31l.bik||135||d871bc8||1130648||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32.cam||327||d985c60||14396||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32h.bik||327||d98949c||5902052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32l.bik||327||df2a380||2628608||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33.cam||1186||e1abf80||52192||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33h.bik||1186||e1b8b60||21305376||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33l.bik||1186||f60a380||9445316||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc3.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00.cam||197||0||8676||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00h.bik||197||21e4||3641072||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00l.bik||197||37b0d4||1670856||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01.cam||472||512f9c||20776||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01h.bik||472||5180c4||8222124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01l.bik||472||cef670||3725124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02.cam||105||107cdb4||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02h.bik||105||107dfc8||1970280||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02l.bik||105||125f030||919644||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03.cam||105||133f88c||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03h.bik||105||1340aa0||1958900||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03l.bik||105||151ee94||909292||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04.cam||106||15fce80||4672||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04h.bik||106||15fe0c0||1887824||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04l.bik||106||17caf10||827636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05.cam||106||1895004||4672||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05h.bik||106||1896244||1887052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05l.bik||106||1a62d90||827048||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06.cam||110||1b2cc38||4848||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06h.bik||110||1b2df28||2008528||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06l.bik||110||1d184f8||908540||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07.cam||300||1df61f4||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07h.bik||300||1df958c||5197180||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07l.bik||300||22ee308||2299856||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08.cam||75||251fad8||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08h.bik||75||25207c4||1331060||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08l.bik||75||2665738||580980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09.cam||728||26f34ac||32040||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09h.bik||728||26fb1d4||13015424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09l.bik||728||3364b54||5734772||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10.cam||120||38dccc8||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10h.bik||120||38de170||2201640||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10l.bik||120||3af7998||1001672||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11.cam||315||3bec260||13868||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11h.bik||315||3bef88c||5698360||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11l.bik||315||415ebc4||2548364||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12.cam||226||43cce50||9952||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12h.bik||226||43cf530||4078040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12l.bik||226||47b2f08||1818104||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13.cam||611||496ed00||26892||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13h.bik||611||497560c||10918000||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13l.bik||611||53dee7c||4793772||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14.cam||105||5871428||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14h.bik||105||587263c||1924220||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14l.bik||105||5a482b8||874880||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15.cam||255||5b1dc38||11228||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15h.bik||255||5b20814||4525952||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15l.bik||255||5f71794||2026736||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16.cam||233||6160484||10260||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16h.bik||233||6162c98||4248316||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16l.bik||233||656ff94||1918400||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17.cam||90||6744554||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17h.bik||90||67454d4||1628548||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17l.bik||90||68d2e58||728508||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18.cam||90||6984c14||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18h.bik||90||6985b94||1614036||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18l.bik||90||6b0fc68||714012||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19.cam||162||6bbe184||7136||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19h.bik||162||6bbfd64||2733948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19l.bik||162||6e5b4e0||1195420||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20.cam||275||6f7f27c||12108||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20h.bik||275||6f821c8||4904472||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20l.bik||275||742f7e0||2154376||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21.cam||280||763d768||12328||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21h.bik||280||7640790||4514208||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21l.bik||280||7a8e930||1987908||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22.cam||90||7c73e74||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22h.bik||90||7c74df4||1650640||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22l.bik||90||7e07dc4||750740||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23.cam||200||7ebf258||8808||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23h.bik||200||7ec14c0||3558312||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23l.bik||200||8226068||1558340||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24.cam||600||83a27ac||26408||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24h.bik||600||83a8ed4||10585392||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24l.bik||600||8dc1404||4585408||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25.cam||30||9220bc4||1328||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25h.bik||30||92210f4||559944||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25l.bik||30||92a9c3c||256904||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26.cam||410||92e87c4||18048||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26h.bik||410||92ece44||7479808||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26l.bik||410||9a0f044||3401948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27.cam||130||9d4d920||5728||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27h.bik||130||9d4ef80||2423808||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27l.bik||130||9f9eb80||1123796||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28.cam||376||a0b1154||16552||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28h.bik||376||a0b51fc||6874028||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28l.bik||376||a7435a8||3114128||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29.cam||395||aa3ba38||17388||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29h.bik||395||aa3fe24||7284036||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29l.bik||395||b132368||3334088||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30.cam||625||b460330||27508||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30h.bik||625||b466ea4||11211932||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30l.bik||625||bf18340||4961628||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31.cam||995||c3d389c||43788||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31h.bik||995||c3de3a8||17959496||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31l.bik||995||d4fedf0||8009592||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc4.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00.cam||390||0||17168||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00h.bik||390||4310||7076980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00l.bik||390||6c3f84||3177212||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01.cam||1260||9cba80||55448||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01h.bik||1260||9d9318||22713736||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01l.bik||1260||1f828a0||10113788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02.cam||285||2927b9c||12548||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02h.bik||285||292aca0||5103348||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02l.bik||285||2e08b94||2252028||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03.cam||225||302e890||9908||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03h.bik||225||3030f44||4064732||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03l.bik||225||3411520||1814904||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04.cam||4348||35cc698||191320||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04h.bik||4345||35fb1f0||75274524||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04l.bik||4345||7dc4b0c||32520396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05.cam||3065||9cc83d8||134868||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05h.bik||3065||9ce92ac||28030204||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05l.bik||3065||b7a47a8||15064748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06.cam||7091||c602654||312012||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06h.bik||7091||c64e920||124325396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06l.bik||7091||13cdf734||55224860||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== publish.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc04_00h.bik||117||0||196276||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc04_00l.bik||117||2feb4||86240||BIK&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5830</id>
		<title>FF8/FileFormat PAK</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5830"/>
		<updated>2020-11-01T17:58:32Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* PAK File Structure */  added tables breaking down the layout of the pak files.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Final Fantasy VIII's movie files are stored within pak files. This is for the CD 2000 version only. Steam 2013 version uses avi files.  '''publish.pak''' contains the message &amp;quot;Published by Square Electronic Arts L.L.C.&amp;quot;. '''disc1.pak''', '''disc2.pak''', '''disc3.pak''', and '''disc4.pak''' hold the rest of the FMV movies.&lt;br /&gt;
&lt;br /&gt;
=PAK File Structure=&lt;br /&gt;
The PAK file has no header. Each movie usually contains a CAM file and two BINK videos. A PAK file can contain multiple movies. One BINK file is the low res the other is the high res.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Section !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CAM - optional || Camera data &lt;br /&gt;
|-&lt;br /&gt;
| BINK - high res || FMV video&lt;br /&gt;
|-&lt;br /&gt;
| BINK - low res || FMV video&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Existing projects you can use to extract the PAK files.===&lt;br /&gt;
* https://github.com/MaKiPL/OpenVIII-monogame/tree/master/PAK%20Extractor&lt;br /&gt;
* https://github.com/MaKiPL/FF8-Rinoa-s-Toolset/blob/master/SerahToolkit_SharpGL/FF8_Core/PlayMovie.cs&lt;br /&gt;
* https://github.com/Sebanisu/OpenVIII_CPP_WIP/tree/master/src/open_viii/pak&lt;br /&gt;
&lt;br /&gt;
==BINK files==&lt;br /&gt;
* Start with 0x42494B &amp;quot;BIK&amp;quot;&lt;br /&gt;
* More info: https://wiki.multimedia.cx/index.php/Bink_Container&lt;br /&gt;
&lt;br /&gt;
==CAM files==&lt;br /&gt;
* Each frame is 44 bytes long.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 bytes || 0x463850 &amp;quot;F8P&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 bytes (uint16) || Approx number of frames. There can be extra data.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 44 bytes * number of frames || Frame data. Each frame ends with &amp;quot;END&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Pak File Details ==&lt;br /&gt;
===== disc1.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00.cam||326||0||14352||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00h.bik||326||3810||5759124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_00l.bik||326||5818a4||2498748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01.cam||199||7e3960||8764||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01h.bik||205||7e5b9c||3572420||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_01l.bik||205||b4de60||1522312||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02.cam||161||cc18e8||7092||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02h.bik||161||cc349c||2805776||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_02l.bik||161||f704ac||1410720||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03.cam||1100||10c8b4c||48408||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03h.bik||1100||10d4864||19654004||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_03l.bik||1100||2392dd8||8597316||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04.cam||215||2bc5d1c||9468||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04h.bik||215||2bc8218||3778948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_04l.bik||215||2f62b9c||1628944||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05.cam||1114||30f06ac||49024||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05h.bik||1114||30fc62c||20063552||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_05l.bik||1114||441eb6c||8923620||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06.cam||41||4ca1550||1812||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06h.bik||41||4ca1c64||757108||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_06l.bik||41||4d5a9d8||347236||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07.cam||1084||4daf63c||47704||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07h.bik||1084||4dbb094||19696056||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_07l.bik||1084||6083a4c||8855428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08.cam||324||68f59d0||14264||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08h.bik||324||68f9188||4736972||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_08l.bik||324||6d7d954||2073440||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09.cam||1391||6f77cb4||61212||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09h.bik||1391||6f86bd0||24180228||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_09l.bik||1391||86961d4||10270268||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10.cam||393||9061810||17300||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10h.bik||393||9065ba4||7195820||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_10l.bik||393||9742850||3265804||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11.cam||465||9a5fd5c||20468||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11h.bik||465||9a64d50||8496456||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_11l.bik||465||a27f298||3846440||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12.cam||45||a62a3c0||1988||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12h.bik||45||a62ab84||752040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_12l.bik||45||a6e252c||300964||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13.cam||15||a72bcd0||668||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13h.bik||15||a72bf6c||249788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_13l.bik||15||a768f28||99988||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14.cam||360||a7815bc||15848||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14h.bik||360||a7853a4||6369460||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_14l.bik||360||ad98458||2769344||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15.cam||300||b03c618||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15h.bik||300||b03f9b0||5236916||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_15l.bik||300||b53e264||2236992||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16.cam||150||b7604a4||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16h.bik||150||b761e74||2776716||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_16l.bik||150||ba07d00||1276724||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17.cam||890||bb3f834||39168||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17h.bik||890||bb49134||15823644||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_17l.bik||890||ca60450||8111120||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18.cam||191||d21c860||8412||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18h.bik||192||d21e93c||3436444||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_18l.bik||192||d5658d8||1772548||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19.cam||121||d7164dc||5332||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19h.bik||121||d7179b0||2155424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_19l.bik||121||d925d50||944536||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20.cam||401||da0c6e8||17652||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20h.bik||401||da10bdc||7142436||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_20l.bik||401||e0e0800||3132744||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21.cam||829||e3dd548||36484||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21h.bik||829||e3e63cc||14983636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_21l.bik||829||f2305a0||6743692||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22.cam||141||f89ec2c||6212||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22h.bik||141||f8a0470||2585084||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_22l.bik||141||fb1766c||1175040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23.cam||550||fc3646c||24208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23h.bik||550||fc3c2fc||9986472||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_23l.bik||550||105c24a4||4486592||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24.cam||575||10a09a64||25308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24h.bik||575||10a0fd40||10441380||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_24l.bik||575||11404fe4||4692084||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25.cam||130||1187e858||5728||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25h.bik||130||1187feb8||2438880||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_25l.bik||130||11ad3598||1140268||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26.cam||101||11be9bc4||4452||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26h.bik||101||11bead28||1792576||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_26l.bik||101||11da0768||783064||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27.cam||306||11e5fa40||13472||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27h.bik||306||11e62ee0||5574568||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_27l.bik||306||123b3e88||2513668||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28.cam||432||1261998c||19016||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28h.bik||432||1261e3d4||7643824||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_28l.bik||432||12d68684||3323692||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29.cam||750||13093db0||33008||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29h.bik||750||1309bea0||13517424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_29l.bik||750||13d80110||6015936||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30.cam||2897||1433ccd0||127476||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30h.bik||2925||1435bec4||49898052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc00_30l.bik||2925||172f2108||22289504||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc2.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00.cam||453||0||19940||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00h.bik||453||4de4||8128812||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_00l.bik||453||7c5710||3597828||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01.cam||278||b33d14||12240||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01h.bik||278||b36ce4||4869600||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_01l.bik||278||fdbac4||2060252||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02.cam||330||11d2aa0||14528||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02h.bik||330||11d6360||5962524||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_02l.bik||330||1785e7c||2662428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03.cam||450||1a0fe98||19808||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03h.bik||450||1a14bf8||8227052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_03l.bik||450||21ed4e4||3724748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04.cam||168||257aab0||7400||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04h.bik||168||257c798||3036032||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_04l.bik||168||2861b18||1356172||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05.cam||219||29acca4||9644||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05h.bik||219||29af250||4033920||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_05l.bik||219||2d87fd0||1843800||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06.cam||104||2f4a228||4584||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06h.bik||104||2f4b410||1894044||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_06l.bik||104||3119aac||853980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07.cam||160||31ea288||7048||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07h.bik||160||31ebe10||2909428||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_07l.bik||160||34b2304||1309396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08.cam||381||35f1dd8||16772||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08h.bik||381||35f5f5c||6936652||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_08l.bik||381||3c937a8||3126604||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09.cam||226||3f8ecf4||9952||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09h.bik||226||3f913d4||4177224||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_09l.bik||226||438d11c||1917924||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10.cam||416||4561500||18312||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10h.bik||416||4565c88||7604492||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_10l.bik||416||4ca6594||3444452||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11.cam||603||4fef478||26540||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11h.bik||603||4ff5c24||10981628||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_11l.bik||603||5a6ed20||4951152||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12.cam||335||5f27990||14748||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12h.bik||335||5f2b32c||6173264||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_12l.bik||335||650e57c||2823184||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13.cam||381||67bf98c||16772||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13h.bik||381||67c3b10||6843600||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_13l.bik||381||6e4a7e0||3034044||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14.cam||531||712f39c||23372||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14h.bik||531||7134ee8||9498260||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_14l.bik||531||7a43d7c||4188788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15.cam||120||7e427f0||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15h.bik||120||7e43c98||2224344||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_15l.bik||120||8062d70||1024412||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16.cam||149||815cf0c||6564||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16h.bik||149||815e8b0||2754272||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_16l.bik||149||83fef90||1264204||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17.cam||150||85339dc||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17h.bik||150||85353ac||2722300||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_17l.bik||150||87cdda8||1221752||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18.cam||255||88f8220||11228||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18h.bik||255||88fadfc||4656768||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_18l.bik||255||8d6bc7c||2106780||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19.cam||428||8f6e218||18840||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19h.bik||428||8f72bb0||7841392||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_19l.bik||428||96ed220||3561280||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20.cam||150||9a52960||6608||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20h.bik||150||9a54330||2667756||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_20l.bik||150||9cdf81c||1168116||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21.cam||75||9dfcb10||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21h.bik||75||9dfd7fc||1396348||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_21l.bik||75||9f52678||646296||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22.cam||120||9ff0310||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22h.bik||120||9ff17b8||2132696||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_22l.bik||120||a1fa290||932544||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23.cam||285||a2ddd50||12548||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23h.bik||285||a2e0e54||5164156||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_23l.bik||285||a7cdad0||2314168||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24.cam||330||aa02a88||14528||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24h.bik||330||aa06348||6084528||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_24l.bik||330||afd3af8||2784636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25.cam||300||b27b874||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25h.bik||300||b27ec0c||5413124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_25l.bik||300||b7a8510||2413380||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26.cam||120||b9f5854||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26h.bik||120||b9f6cfc||2180104||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_26l.bik||120||bc0b104||980208||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27.cam||75||bcfa5f4||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27h.bik||75||bcfb2e0||1345552||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_27l.bik||75||be43af0||595492||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28.cam||120||bed5114||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28h.bik||120||bed65bc||2180512||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_28l.bik||120||c0eab5c||980596||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29.cam||692||c1da1d0||30456||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29h.bik||692||c1e18c8||12448828||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_29l.bik||692||cdc0d04||5528956||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30.cam||120||d306a80||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30h.bik||120||d307f28||2194876||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_30l.bik||120||d51fce4||994700||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31.cam||135||d612a70||5948||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31h.bik||135||d6141ac||2480668||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_31l.bik||135||d871bc8||1130648||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32.cam||327||d985c60||14396||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32h.bik||327||d98949c||5902052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_32l.bik||327||df2a380||2628608||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33.cam||1186||e1abf80||52192||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33h.bik||1186||e1b8b60||21305376||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc01_33l.bik||1186||f60a380||9445316||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc3.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00.cam||197||0||8676||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00h.bik||197||21e4||3641072||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_00l.bik||197||37b0d4||1670856||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01.cam||472||512f9c||20776||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01h.bik||472||5180c4||8222124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_01l.bik||472||cef670||3725124||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02.cam||105||107cdb4||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02h.bik||105||107dfc8||1970280||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_02l.bik||105||125f030||919644||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03.cam||105||133f88c||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03h.bik||105||1340aa0||1958900||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_03l.bik||105||151ee94||909292||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04.cam||106||15fce80||4672||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04h.bik||106||15fe0c0||1887824||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_04l.bik||106||17caf10||827636||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05.cam||106||1895004||4672||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05h.bik||106||1896244||1887052||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_05l.bik||106||1a62d90||827048||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06.cam||110||1b2cc38||4848||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06h.bik||110||1b2df28||2008528||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_06l.bik||110||1d184f8||908540||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07.cam||300||1df61f4||13208||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07h.bik||300||1df958c||5197180||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_07l.bik||300||22ee308||2299856||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08.cam||75||251fad8||3308||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08h.bik||75||25207c4||1331060||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_08l.bik||75||2665738||580980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09.cam||728||26f34ac||32040||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09h.bik||728||26fb1d4||13015424||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_09l.bik||728||3364b54||5734772||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10.cam||120||38dccc8||5288||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10h.bik||120||38de170||2201640||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_10l.bik||120||3af7998||1001672||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11.cam||315||3bec260||13868||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11h.bik||315||3bef88c||5698360||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_11l.bik||315||415ebc4||2548364||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12.cam||226||43cce50||9952||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12h.bik||226||43cf530||4078040||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_12l.bik||226||47b2f08||1818104||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13.cam||611||496ed00||26892||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13h.bik||611||497560c||10918000||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_13l.bik||611||53dee7c||4793772||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14.cam||105||5871428||4628||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14h.bik||105||587263c||1924220||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_14l.bik||105||5a482b8||874880||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15.cam||255||5b1dc38||11228||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15h.bik||255||5b20814||4525952||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_15l.bik||255||5f71794||2026736||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16.cam||233||6160484||10260||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16h.bik||233||6162c98||4248316||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_16l.bik||233||656ff94||1918400||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17.cam||90||6744554||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17h.bik||90||67454d4||1628548||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_17l.bik||90||68d2e58||728508||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18.cam||90||6984c14||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18h.bik||90||6985b94||1614036||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_18l.bik||90||6b0fc68||714012||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19.cam||162||6bbe184||7136||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19h.bik||162||6bbfd64||2733948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_19l.bik||162||6e5b4e0||1195420||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20.cam||275||6f7f27c||12108||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20h.bik||275||6f821c8||4904472||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_20l.bik||275||742f7e0||2154376||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21.cam||280||763d768||12328||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21h.bik||280||7640790||4514208||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_21l.bik||280||7a8e930||1987908||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22.cam||90||7c73e74||3968||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22h.bik||90||7c74df4||1650640||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_22l.bik||90||7e07dc4||750740||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23.cam||200||7ebf258||8808||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23h.bik||200||7ec14c0||3558312||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_23l.bik||200||8226068||1558340||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24.cam||600||83a27ac||26408||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24h.bik||600||83a8ed4||10585392||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_24l.bik||600||8dc1404||4585408||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25.cam||30||9220bc4||1328||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25h.bik||30||92210f4||559944||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_25l.bik||30||92a9c3c||256904||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26.cam||410||92e87c4||18048||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26h.bik||410||92ece44||7479808||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_26l.bik||410||9a0f044||3401948||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27.cam||130||9d4d920||5728||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27h.bik||130||9d4ef80||2423808||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_27l.bik||130||9f9eb80||1123796||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28.cam||376||a0b1154||16552||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28h.bik||376||a0b51fc||6874028||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_28l.bik||376||a7435a8||3114128||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29.cam||395||aa3ba38||17388||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29h.bik||395||aa3fe24||7284036||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_29l.bik||395||b132368||3334088||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30.cam||625||b460330||27508||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30h.bik||625||b466ea4||11211932||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_30l.bik||625||bf18340||4961628||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31.cam||995||c3d389c||43788||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31h.bik||995||c3de3a8||17959496||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc02_31l.bik||995||d4fedf0||8009592||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== disc4.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00.cam||390||0||17168||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00h.bik||390||4310||7076980||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_00l.bik||390||6c3f84||3177212||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01.cam||1260||9cba80||55448||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01h.bik||1260||9d9318||22713736||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_01l.bik||1260||1f828a0||10113788||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02.cam||285||2927b9c||12548||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02h.bik||285||292aca0||5103348||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_02l.bik||285||2e08b94||2252028||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03.cam||225||302e890||9908||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03h.bik||225||3030f44||4064732||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_03l.bik||225||3411520||1814904||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04.cam||4348||35cc698||191320||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04h.bik||4345||35fb1f0||75274524||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_04l.bik||4345||7dc4b0c||32520396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05.cam||3065||9cc83d8||134868||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05h.bik||3065||9ce92ac||28030204||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_05l.bik||3065||b7a47a8||15064748||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06.cam||7091||c602654||312012||F8P&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06h.bik||7091||c64e920||124325396||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc03_06l.bik||7091||13cdf734||55224860||BIK&lt;br /&gt;
|}&lt;br /&gt;
===== publish.pak =====&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! FileName !! Frames !! Offset !! Size !! Type&lt;br /&gt;
|-&lt;br /&gt;
|disc04_00h.bik||117||0||196276||BIK&lt;br /&gt;
|-&lt;br /&gt;
|disc04_00l.bik||117||2feb4||86240||BIK&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5829</id>
		<title>FF8/FileFormat PAK</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5829"/>
		<updated>2020-11-01T17:20:29Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: updated message about publish.pak contents.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Final Fantasy VIII's movie files are stored within pak files. This is for the CD 2000 version only. Steam 2013 version uses avi files.  '''publish.pak''' contains the message &amp;quot;Published by Square Electronic Arts L.L.C.&amp;quot;. '''disc1.pak''', '''disc2.pak''', '''disc3.pak''', and '''disc4.pak''' hold the rest of the FMV movies.&lt;br /&gt;
&lt;br /&gt;
=PAK File Structure=&lt;br /&gt;
The PAK file has no header. Each movie usually contains a CAM file and two BINK videos. A PAK file can contain multiple movies. One BINK file is the low res the other is the high res.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Section !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CAM - optional || Camera data &lt;br /&gt;
|-&lt;br /&gt;
| BINK - high res || FMV video&lt;br /&gt;
|-&lt;br /&gt;
| BINK - low res || FMV video&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Existing projects you can use to extract the PAK files.&lt;br /&gt;
* https://github.com/MaKiPL/OpenVIII-monogame/tree/master/PAK%20Extractor&lt;br /&gt;
* https://github.com/MaKiPL/FF8-Rinoa-s-Toolset/blob/master/SerahToolkit_SharpGL/FF8_Core/PlayMovie.cs&lt;br /&gt;
* https://github.com/Sebanisu/OpenVIII_CPP_WIP/tree/master/src/open_viii/pak&lt;br /&gt;
&lt;br /&gt;
==BINK files==&lt;br /&gt;
* Start with 0x42494B &amp;quot;BIK&amp;quot;&lt;br /&gt;
* More info: https://wiki.multimedia.cx/index.php/Bink_Container&lt;br /&gt;
&lt;br /&gt;
==CAM files==&lt;br /&gt;
* Each frame is 44 bytes long.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 bytes || 0x463850 &amp;quot;F8P&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 bytes (uint16) || Approx number of frames. There can be extra data.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 44 bytes * number of frames || Frame data. Each frame ends with &amp;quot;END&amp;quot;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5828</id>
		<title>FF8/FileFormat PAK</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5828"/>
		<updated>2020-11-01T00:49:19Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* CAM files */ minor change I noticed that each of the frames ends with &amp;quot;END&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Final Fantasy VIII's movie files are stored within pak files. This is for the CD 2000 version only. Steam 2013 version uses avi files.  '''publish.pak''' contains the Eidos logo. '''disc1.pak''', '''disc2.pak''', '''disc3.pak''', and '''disc4.pak''' hold the rest of the FMV movies.&lt;br /&gt;
&lt;br /&gt;
=PAK File Structure=&lt;br /&gt;
The PAK file has no header. Each movie usually contains a CAM file and two BINK videos. A PAK file can contain multiple movies. One BINK file is the low res the other is the high res.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Section !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CAM - optional || Camera data &lt;br /&gt;
|-&lt;br /&gt;
| BINK - high res || FMV video&lt;br /&gt;
|-&lt;br /&gt;
| BINK - low res || FMV video&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Existing projects you can use to extract the PAK files.&lt;br /&gt;
* https://github.com/MaKiPL/OpenVIII-monogame/tree/master/PAK%20Extractor&lt;br /&gt;
* https://github.com/MaKiPL/FF8-Rinoa-s-Toolset/blob/master/SerahToolkit_SharpGL/FF8_Core/PlayMovie.cs&lt;br /&gt;
* https://github.com/Sebanisu/OpenVIII_CPP_WIP/tree/master/src/open_viii/pak&lt;br /&gt;
&lt;br /&gt;
==BINK files==&lt;br /&gt;
* Start with 0x42494B &amp;quot;BIK&amp;quot;&lt;br /&gt;
* More info: https://wiki.multimedia.cx/index.php/Bink_Container&lt;br /&gt;
&lt;br /&gt;
==CAM files==&lt;br /&gt;
* Each frame is 44 bytes long.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 bytes || 0x463850 &amp;quot;F8P&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 bytes (uint16) || Approx number of frames. There can be extra data.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 44 bytes * number of frames || Frame data. Each frame ends with &amp;quot;END&amp;quot;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5827</id>
		<title>FF8/FileFormat PAK</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5827"/>
		<updated>2020-11-01T00:20:10Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* PAK File Structure */ added a new table laying out the order of the data. and added a new link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Final Fantasy VIII's movie files are stored within pak files. This is for the CD 2000 version only. Steam 2013 version uses avi files.  '''publish.pak''' contains the Eidos logo. '''disc1.pak''', '''disc2.pak''', '''disc3.pak''', and '''disc4.pak''' hold the rest of the FMV movies.&lt;br /&gt;
&lt;br /&gt;
=PAK File Structure=&lt;br /&gt;
The PAK file has no header. Each movie usually contains a CAM file and two BINK videos. A PAK file can contain multiple movies. One BINK file is the low res the other is the high res.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Section !! Description &lt;br /&gt;
|-&lt;br /&gt;
| CAM - optional || Camera data &lt;br /&gt;
|-&lt;br /&gt;
| BINK - high res || FMV video&lt;br /&gt;
|-&lt;br /&gt;
| BINK - low res || FMV video&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Existing projects you can use to extract the PAK files.&lt;br /&gt;
* https://github.com/MaKiPL/OpenVIII-monogame/tree/master/PAK%20Extractor&lt;br /&gt;
* https://github.com/MaKiPL/FF8-Rinoa-s-Toolset/blob/master/SerahToolkit_SharpGL/FF8_Core/PlayMovie.cs&lt;br /&gt;
* https://github.com/Sebanisu/OpenVIII_CPP_WIP/tree/master/src/open_viii/pak&lt;br /&gt;
&lt;br /&gt;
==BINK files==&lt;br /&gt;
* Start with 0x42494B &amp;quot;BIK&amp;quot;&lt;br /&gt;
* More info: https://wiki.multimedia.cx/index.php/Bink_Container&lt;br /&gt;
&lt;br /&gt;
==CAM files==&lt;br /&gt;
* Each frame is 44 bytes long.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 bytes || 0x463850 &amp;quot;F8P&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 bytes (uint16) || Approx number of frames. There can be extra data.&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 44 bytes * number of frames || Frame data&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5822</id>
		<title>FF8/FileFormat PAK</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5822"/>
		<updated>2020-10-31T02:09:02Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: added note about which version of the game uses PAK files.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Final Fantasy VIII's movie files are stored within pak files. This is for the CD 2000 version only. Steam 2013 version uses avi files.  '''publish.pak''' contains the Eidos logo. '''disc1.pak''', '''disc2.pak''', '''disc3.pak''', and '''disc4.pak''' hold the rest of the FMV movies.&lt;br /&gt;
&lt;br /&gt;
=PAK File Structure=&lt;br /&gt;
The PAK file has no header. Each movie usually contains two BINK videos and a CAM file. A PAK file can contain multiple movies. One BINK file is the low res the other is the high res.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existing projects you can use to extract the PAK files.&lt;br /&gt;
* https://github.com/MaKiPL/OpenVIII-monogame/tree/master/PAK%20Extractor&lt;br /&gt;
* https://github.com/MaKiPL/FF8-Rinoa-s-Toolset/blob/master/SerahToolkit_SharpGL/FF8_Core/PlayMovie.cs&lt;br /&gt;
&lt;br /&gt;
==BINK files==&lt;br /&gt;
* Start with 0x42494B &amp;quot;BIK&amp;quot;&lt;br /&gt;
* More info: https://wiki.multimedia.cx/index.php/Bink_Container&lt;br /&gt;
&lt;br /&gt;
==CAM files==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 bytes || 0x463850 &amp;quot;F8P&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 bytes (uint16) || Approx number of frames can be extra&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5821</id>
		<title>FF8/FileFormat PAK</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8/FileFormat_PAK&amp;diff=5821"/>
		<updated>2020-10-31T00:14:37Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: WIP I got a start on the PAK article. As I figure more out of this file type i'll update this.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Final Fantasy 8's movie files are stored within pak files. The '''publish.pak''' contains the Eidos logo. '''disc1.pak''', '''disc2.pak''', '''disc3.pak''', and '''disc4.pak''' hold the rest of the fmv movies.&lt;br /&gt;
&lt;br /&gt;
=PAK File Structure=&lt;br /&gt;
The PAK file has no header. Each movie usually contains two BINK videos and a CAM file. A PAK file can contain multiple movies. One BINK file is the low res the other is the high res.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Existing projects you can use to extract the PAK files.&lt;br /&gt;
* https://github.com/MaKiPL/OpenVIII-monogame/tree/master/PAK%20Extractor&lt;br /&gt;
* https://github.com/MaKiPL/FF8-Rinoa-s-Toolset/blob/master/SerahToolkit_SharpGL/FF8_Core/PlayMovie.cs&lt;br /&gt;
&lt;br /&gt;
==BINK files==&lt;br /&gt;
* Start with 0x42494B &amp;quot;BIK&amp;quot;&lt;br /&gt;
* More info: https://wiki.multimedia.cx/index.php/Bink_Container&lt;br /&gt;
&lt;br /&gt;
==CAM files==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Size !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 3 bytes || 0x463850 &amp;quot;F8P&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 2 bytes (uint16) || Approx number of frames can be extra&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.ffrtt.ru/index.php?title=FF8&amp;diff=5820</id>
		<title>FF8</title>
		<link rel="alternate" type="text/html" href="https://wiki.ffrtt.ru/index.php?title=FF8&amp;diff=5820"/>
		<updated>2020-10-30T23:31:23Z</updated>

		<summary type="html">&lt;p&gt;Sebanisu: /* File Formats */ adding info about Pak files used in ff8 2000 cd version of the game.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=  Contents =&lt;br /&gt;
=== History ===&lt;br /&gt;
Final Fantasy VIII came after the mega hit [[FF7|Final Fantasy VII]], it in itself was a very successful game release for Square. For more on the [[FF8/HistoryOf|history of Final Fantasy VIII read here]].  The Game Engine &lt;br /&gt;
* [[FF8/Engine|Final Fantasy VIII's Engine]] &lt;br /&gt;
=== Engine constants ===&lt;br /&gt;
* [[FF8/Engine_const/BattleFiles|Array of Battle files]] &lt;br /&gt;
=== Details of the Game ===&lt;br /&gt;
* [[FF8/Kernel|Final Fantasy VIII's Kernel]] &lt;br /&gt;
* [[FF8/Variables|Game variables used in scripting]] &lt;br /&gt;
* [[FF8/Engine/WorldMapCamera|World map camera]]&lt;br /&gt;
* [[FF8/Encounter_Codes|Battle encounters list]]&lt;br /&gt;
* [[FF8/String_Encoding|String Encoding]]&lt;br /&gt;
&lt;br /&gt;
=== Media Formats ===&lt;br /&gt;
*  [[FF8/PlaystationMedia|Final Fantasy VIII PS1]] media information. &lt;br /&gt;
*  [[FF8/PC_Media|Final Fantasy VIII PC]] media information. &lt;br /&gt;
*  [[FF8/GameSaveFormat|Final Fantasy VIII Save data]] &lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
= File Formats =&lt;br /&gt;
=== Movie Files ===&lt;br /&gt;
*  [[FF8/FileFormat_PAK|[PAK]]] Movie Archives&lt;br /&gt;
=== Sound Files ===&lt;br /&gt;
*  [[FF8/FileFormat_FMT|[FMT]]] Sound Archives &lt;br /&gt;
=== Battle files ===&lt;br /&gt;
*  [[FF8/FileFormat_X|[X]]] Battle Fields &lt;br /&gt;
*  [[FF8/FileFormat_DAT|[DAT]]] Battle Models &lt;br /&gt;
*  [[FF8/BattleStructure|Scene.out]] Battle encounter data &lt;br /&gt;
*  [[FF8/FileFormat_r0win|r0win.dat]] Winning sequence &lt;br /&gt;
*  [[FF8/FileFormat_b0wave|b0wave.dat]] Core battle data (Textures+Music+Font) &lt;br /&gt;
*  [[FF8/FileFormat_TDW|a9btlfnt.bft]] Battle Font (Redirect to TDW) &lt;br /&gt;
*  [[FF8/FileFormat_magfiles|.mag files]] - MAG files &lt;br /&gt;
=== Field files ===&lt;br /&gt;
*  [[FF8/Field/Script/Opcodes|Opcodes]] Field script opcodes&lt;br /&gt;
*  [[FF8/FileFormat_MCH|[MCH]]] Field Character Models &lt;br /&gt;
*  [[FF8/FileFormat_ONE|[ONE]]] Field Character Models Container &lt;br /&gt;
*  [[FF8/FileFormat_MIM|[MIM]]] Field Background Image Data &lt;br /&gt;
*  [[FF8/FileFormat_MAP|[MAP]]] Field Background Tile Data &lt;br /&gt;
*  [[FF8/FileFormat_JSM|[JSM]]] Field Scripts &lt;br /&gt;
*  [[FF8/FileFormat_SYM|[SYM]]] Field Script names (unused) &lt;br /&gt;
*  [[FF8/FileFormat_MSD|[MSD]]] Field Dialogs &lt;br /&gt;
*  [[FF8/FileFormat_INF|[INF]]] Field Gateways &lt;br /&gt;
*  [[FF7/Field/Walkmesh|[ID]]] Field Walkmesh (same format as FF7) &lt;br /&gt;
*  [[FF8/FileFormat_CA|[CA]]] Field Camera &lt;br /&gt;
*  [[FF8/FileFormat_TDW|[TDW]]] Extra font &lt;br /&gt;
*  [[FF8/FileFormat_MSK|[MSK]]] Movie cam (?) &lt;br /&gt;
*  [[FF8/FileFormat_RAT_MRT|[RAT]] &amp;amp; [MRT]] Battle related &lt;br /&gt;
*  [[FF8/FileFormat_PMD|[PMD]]] Particle Info &lt;br /&gt;
*  [[FF8/FileFormat_PMP|[PMP]]] Particle Image Data &lt;br /&gt;
*  [[FF8/FileFormat_PVP|[PVP]]] Unknown (often 0x0c000000, sometimes 0x0a000000 or 0x0b000000) &lt;br /&gt;
*  [[FF8/FileFormat_SFX|[SFX]]] Indexes to Sound Effects (?)&lt;br /&gt;
&lt;br /&gt;
=== World map files ===&lt;br /&gt;
*  [[FF8/WorldMap_music|music0.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music1.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music2.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music3.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music4.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_music|music5.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_rail|rail.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_texl|texl.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_wmset|wmset.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_wmsetxx|wmsetXX.obj]] &lt;br /&gt;
*  [[FF8/WorldMap_wmx|wmx.obj]]&lt;br /&gt;
*  [[FF8/WorldMap_charaone|chara.one]]&lt;br /&gt;
&lt;br /&gt;
=== Main ===&lt;br /&gt;
*  [[FF8/Main_wm2|wm2field.tbl]] &lt;br /&gt;
*  [[FF8/Main_kernel|kernel.bin]] &lt;br /&gt;
*  [[FF8/Main_harata|harata.cnf]] &lt;br /&gt;
*  [[FF8/Main_init|init.out]] &lt;br /&gt;
*  [[FF8/Main_namedic|namedic.bin]]&lt;br /&gt;
=== Menu ===&lt;br /&gt;
*  [[FF8/Menu_sp2|*.sp1/*.sp2]]&lt;br /&gt;
* [[FF8/Menu_mngrphd_bin|mngrphd.bin]]&lt;br /&gt;
* [[FF8/Menu_mngrp_bin|mngrp.bin]]&lt;br /&gt;
* [[FF8/Menu_tkmnmes|tkmnmes*.bin]]&lt;br /&gt;
* [[Ff8/Menu_mag_textures|mag*.tex]]&lt;br /&gt;
* [[FF8/Menu_mngrp_strings_locations|mngrp strings]]&lt;br /&gt;
* [[FF8/Menu_mngrp_complex_strings|mngrp complex strings]]&lt;br /&gt;
* [[FF8/Menu_m000_m004|m00*.bin and m00*.msg]]&lt;br /&gt;
* [[FF8/Menu_areames_dc1|areames.dc1]]&lt;br /&gt;
&lt;br /&gt;
= Tools and Patches =&lt;br /&gt;
*  [[FF8/Tools|Tools and Patches]]&lt;/div&gt;</summary>
		<author><name>Sebanisu</name></author>
		
	</entry>
</feed>