<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.re.virtualworld.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Administrateur</id>
	<title>Virtual World R.E. - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.re.virtualworld.fr/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Administrateur"/>
	<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php/Special:Contributions/Administrateur"/>
	<updated>2026-04-12T20:12:29Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Gotcha_Force&amp;diff=1541</id>
		<title>Gotcha Force</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Gotcha_Force&amp;diff=1541"/>
		<updated>2024-07-21T20:05:31Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: /* Game file formats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameInfo&lt;br /&gt;
|image               = NoImage.png&lt;br /&gt;
|screenwidth         = 320px&lt;br /&gt;
|title               = Gotcha Force&lt;br /&gt;
|aka                 = Gacha Fōsu (JP)&lt;br /&gt;
|developer           = Capcom&lt;br /&gt;
|publishers          = [[Capcom]]&lt;br /&gt;
|system              = GameCube&lt;br /&gt;
|japan               = November 27, 2003&lt;br /&gt;
|usa                 = December 3, 2003&lt;br /&gt;
|europe              = February 20, 2004&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Games]]&lt;br /&gt;
&#039;&#039;&#039;Gotcha Force&#039;&#039;&#039; is a fighting / third-person shooter video game developed and published by [[Capcom]] for GameCube in 2003.&lt;br /&gt;
&lt;br /&gt;
== GCM versions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! sha1 !! Game Code&lt;br /&gt;
|-&lt;br /&gt;
| Gotcha Force (Europe) (En,Fr,De).iso || A94DF10304E6A18827C7325169E9ACE117F17A00 || GG4P&lt;br /&gt;
|-&lt;br /&gt;
| Gotcha Force (USA).iso || DFE963E5070B9BEC02BBBEFBA3F038B04DAC953E || GG4E&lt;br /&gt;
|-&lt;br /&gt;
| Gotcha Force (Japan).iso || 1B413F219A47E6B3E862A3F7A469A046E88BE893 || GG4J&lt;br /&gt;
|-&lt;br /&gt;
| GFRB2.2c.iso || E207F2223ACDE7A7FD287FBAB3C2DE59CF7984E6 || GG4P&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
GFRB2.2c.iso is a rebalanced version of the game made by the team Gotcha Force Rebalanced to play [https://www.youtube.com/channel/UC_ePVAn2C2CK6ImDSnoaQKQ multiplayer battles]. The modded iso come from EU iso version.&lt;br /&gt;
&lt;br /&gt;
== Game terminology ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Borg || 3D character used in battles.&lt;br /&gt;
|-&lt;br /&gt;
| Stage || 3D map used in battles.&lt;br /&gt;
|-&lt;br /&gt;
| Data Crystal || 3D items looted at battle&#039;s end that can be combined to earn new Borgs.&lt;br /&gt;
|-&lt;br /&gt;
| NPC || Ally or Enemy characters seen during battles.&lt;br /&gt;
|-&lt;br /&gt;
| Gotcha Box || Boxes used to store Borgs.&lt;br /&gt;
|-&lt;br /&gt;
| WareHouse || Game element used to store Borgs when the Gotcha Box is filled up. Borgs can&#039;t be selected from WareHouse during battles.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GameCube DVD Architecture ==&lt;br /&gt;
The page [[GCM (File format)]] describes in details the GCM file format used by GameCube mini DVD.&lt;br /&gt;
&lt;br /&gt;
== GameCube Tooling ==&lt;br /&gt;
The page [[GameCube Tooling]] provides softwares and scripts for handling GameCube games ROM / files.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/GameCube_technical_specifications GameCube technical specifications]&lt;br /&gt;
&lt;br /&gt;
[http://datasheets.chipdb.org/IBM/PowerPC/Gekko/gekko_user_manual.pdf#page=337 Gekko powerpc CPU user manual]: This manual is useful when reverse engineering executables ([[DOL (File format)|dol]], rel, and so on.). Assembly instructions and Gekko architecture are documented in details.&lt;br /&gt;
&lt;br /&gt;
Another interesting document is the [https://db.hfsplay.fr/files/2019/07/04/Architecture_Guide_SCQNknY.pdf GameCube SDK architecture guide] providing technical acronyms definitions and global SDK internal knowledges.&lt;br /&gt;
&lt;br /&gt;
The DSP (Digital Signal Processor allowing to process audio signals - codecs...) has been [https://www.lse.epita.fr/lse-winter-day-2013/slides/dsp.pdf studied in depth] by one of Dolphin Emulator developers team.&lt;br /&gt;
&lt;br /&gt;
== Game file formats ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Format !! Content&lt;br /&gt;
|-&lt;br /&gt;
| [[ADX (File format)|ADX]] || Audio file ||&lt;br /&gt;
|-&lt;br /&gt;
| [[AFS (File format)|AFS]] || File packing others files ([[AFS (Gotcha Force)|Ongoing researches]]) ||&lt;br /&gt;
|- &lt;br /&gt;
| [[ARC (Gotcha Force)|ARC]] || HSD Files ||&lt;br /&gt;
|- &lt;br /&gt;
| [[ARZ (Gotcha Force)|ARZ]] || Compressed file ||&lt;br /&gt;
|-&lt;br /&gt;
| [[BIN (Gotcha Force)|BIN]] &lt;br /&gt;
! Unknown ||&lt;br /&gt;
|-&lt;br /&gt;
| [[BNR (File format)|BNR]] || Banner file format ||&lt;br /&gt;
|-&lt;br /&gt;
| [[CHD (Gotcha Force)|CHD]] || DSP part ||&lt;br /&gt;
|-&lt;br /&gt;
| [[DOL (File format)|DOL]] || [[SysDolphin]] executable file ([[DOL (Gotcha Force)|Ongoing researches]]) ||&lt;br /&gt;
|-&lt;br /&gt;
| [[DPK (Gotcha Force)|DPK]] &lt;br /&gt;
|| DSP part ||&lt;br /&gt;
|-&lt;br /&gt;
| [[GCM (File format)| IMG]]  || apploader file||&lt;br /&gt;
|- &lt;br /&gt;
| [[MDT (Gotcha Force)|MDT]] &lt;br /&gt;
| Uncompressed packed files which contains dialogs ||&lt;br /&gt;
|- &lt;br /&gt;
| [[PTL (File format)|PTL]] || Particles settings ([[PTL (Gotcha Force)|Ongoing researches]])  ||&lt;br /&gt;
|-&lt;br /&gt;
| [[PZZ (Gotcha Force)|PZZ]] || Compressed archive ||&lt;br /&gt;
|- &lt;br /&gt;
| [[REF (Gotcha Force)|REF]] &lt;br /&gt;
! Unknown (Related to particles?) ||&lt;br /&gt;
|-&lt;br /&gt;
| [[SFD (File format)|SFD]] || MPEG Sofdec ||&lt;br /&gt;
|- &lt;br /&gt;
| [[TPL (File format)|TPL]] || Texture Palette Library ||&lt;br /&gt;
|- &lt;br /&gt;
| [[TSB (Gotcha Force)|TSB]] &lt;br /&gt;
|| DSP part ||&lt;br /&gt;
|- &lt;br /&gt;
| [[TXG (File format)|TXG]] || Particles images container ([[TXG (Gotcha Force)|Ongoing researches]]) ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;p class=&amp;quot;mwt-heading&amp;quot; &amp;gt;The page [[File formats reverse engineering|file formats reverse engineering]] is dedicated to methods and researches ongoing on it.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files and folders tree ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== USA: ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 GCM_SYS/&lt;br /&gt;
 ├─ apploader.img&lt;br /&gt;
 └─ boot.dol&lt;br /&gt;
 afs_data.afs&lt;br /&gt;
 ├─ *.adx (2113)&lt;br /&gt;
 ├─ *.arc (1369)&lt;br /&gt;
 ├─ *.arz (184)&lt;br /&gt;
 ├─ *.bin (586)&lt;br /&gt;
 ├─ *.chd (4)&lt;br /&gt;
 ├─ *.dpk (4)&lt;br /&gt;
 ├─ *.mdt (6)&lt;br /&gt;
 ├─ ptcl00.ptl&lt;br /&gt;
 ├─ *.pzz (254)&lt;br /&gt;
 ├─ ptcl00.ref&lt;br /&gt;
 ├─ *.sfd (2)&lt;br /&gt;
 ├─ *.tpl (442)&lt;br /&gt;
 ├─ *.tsb (4)&lt;br /&gt;
 └─ ptcl00.txg&lt;br /&gt;
 opening.bnr&lt;br /&gt;
 poq_adx_usa.afs&lt;br /&gt;
 ├─ *.adx (2115)&lt;br /&gt;
 └─ *.sfd (2)&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== EU: ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
  GCM_SYS/&lt;br /&gt;
 ├─ apploader.img&lt;br /&gt;
 └─ boot.dol&lt;br /&gt;
 afs_data.afs&lt;br /&gt;
 ├─ *.arc (1334)&lt;br /&gt;
 ├─ *.arz (172)&lt;br /&gt;
 ├─ *.bin (586)&lt;br /&gt;
 ├─ *.chd (4)&lt;br /&gt;
 ├─ *.dpk (4)&lt;br /&gt;
 ├─ *.mdt (1)&lt;br /&gt;
 ├─ *.ptl (1)&lt;br /&gt;
 ├─ *.pzz (253)&lt;br /&gt;
 ├─ *.ref (1)&lt;br /&gt;
 ├─ *.tpl (27)&lt;br /&gt;
 ├─ *.tsb (4)&lt;br /&gt;
 └─ *.txg (1)&lt;br /&gt;
 afs_data_a.afs&lt;br /&gt;
 ├─ *.arc (47)&lt;br /&gt;
 ├─ *.arz (12)&lt;br /&gt;
 ├─ *.mdt (5)&lt;br /&gt;
 ├─ *.pzz (2)&lt;br /&gt;
 └─ *.tpl (415)&lt;br /&gt;
 afs_data_f.afs&lt;br /&gt;
 ├─ *.arc (47)&lt;br /&gt;
 ├─ *.arz (12)&lt;br /&gt;
 ├─ *.mdt (5)&lt;br /&gt;
 ├─ *.pzz (2)&lt;br /&gt;
 └─ *.tpl (415)&lt;br /&gt;
 afs_data_g.afs&lt;br /&gt;
 ├─ *.arc (47)&lt;br /&gt;
 ├─ *.arz (12)&lt;br /&gt;
 ├─ *.mdt (5)&lt;br /&gt;
 ├─ *.pzz (2)&lt;br /&gt;
 └─ *.tpl (415)&lt;br /&gt;
 opening.bnr&lt;br /&gt;
 poq_adx_pal.afs&lt;br /&gt;
 ├─ *.adx (2113)&lt;br /&gt;
 └─ *.sfd (4) - pal version&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== JAP: ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
  GCM_SYS/&lt;br /&gt;
 ├─ apploader.img&lt;br /&gt;
 └─ boot.dol&lt;br /&gt;
 afs_data.afs&lt;br /&gt;
 ├─ *.arc (1369)&lt;br /&gt;
 ├─ *.arz (184)&lt;br /&gt;
 ├─ *.bin (586)&lt;br /&gt;
 ├─ *.chd (4)&lt;br /&gt;
 ├─ *.dpk (4)&lt;br /&gt;
 ├─ *.mdt (6)&lt;br /&gt;
 ├─ *.ptl (1)&lt;br /&gt;
 ├─ *.pzz (255)&lt;br /&gt;
 ├─ *.ref (1)&lt;br /&gt;
 ├─ *.tpl (442)&lt;br /&gt;
 ├─ *.tsb (4)&lt;br /&gt;
 └─ *.txg (1)&lt;br /&gt;
 opening.bnr&lt;br /&gt;
 poq_adx.afs&lt;br /&gt;
 ├─ *.adx (2113)&lt;br /&gt;
 └─ *.sfd (2)&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== afs_data.afs file naming scheme ==&lt;br /&gt;
&lt;br /&gt;
You can check full description of all file here: [[All Assets File Name Index]]&lt;br /&gt;
&lt;br /&gt;
File naming scheme:&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | File naming scheme. &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| pl####* || Borgs files (&#039;&#039;&#039;Pl&#039;&#039;&#039;ayer Character)&lt;br /&gt;
|-&lt;br /&gt;
| mn####.tpl || Borgs names in &#039;&#039;&#039;M&#039;&#039;&#039;e&#039;&#039;&#039;n&#039;&#039;&#039;us (206)&lt;br /&gt;
|-&lt;br /&gt;
| st## || &#039;&#039;&#039;st&#039;&#039;&#039;age - maps files. We find in position 1,2,3 hitsxx.bin files.&lt;br /&gt;
|-&lt;br /&gt;
| so## || &#039;&#039;&#039;s&#039;&#039;&#039;tage &#039;&#039;&#039;o&#039;&#039;&#039;bject. Building and structures used in battles.&lt;br /&gt;
|-&lt;br /&gt;
| firstld.pzz || Memory card related files (&#039;&#039;&#039;First l&#039;&#039;&#039;oa&#039;&#039;&#039;d&#039;&#039;&#039; - We found the memory card picture in the pzz)&lt;br /&gt;
|-&lt;br /&gt;
| icon.bin || Same than firstld\003C_firstldicon.bin - 3D icon of the memory card&lt;br /&gt;
|-&lt;br /&gt;
| face#### || Describe NPCs and properties used when using Special Moves / Abilities&lt;br /&gt;
|-&lt;br /&gt;
| it####_mdl.arz || (90 files) - &#039;&#039;&#039;It&#039;&#039;&#039;em Data Crystal -&amp;gt; #### Match everytime to a Borg requesting multiple Data Crystals&lt;br /&gt;
|-&lt;br /&gt;
| box00_mdl.arc || Gotcha Box&lt;br /&gt;
|-&lt;br /&gt;
| ckpt* || Graphical user interface elements used in battles.&lt;br /&gt;
|-&lt;br /&gt;
| d###_mdl.arc || Menu collection 002: Borgs list, 001: Borg View &lt;br /&gt;
|-&lt;br /&gt;
| deck00_mdl.arc || Edit force menu&lt;br /&gt;
|-&lt;br /&gt;
| entry00_mdl.arc || Interface used to enter player name with characters&lt;br /&gt;
|-&lt;br /&gt;
| optn00_mdl.arc || Option menu&lt;br /&gt;
|-&lt;br /&gt;
| fmg00_mdl.arc || Neo G Red icon used in Story Mode dialogs&lt;br /&gt;
|-&lt;br /&gt;
| rpot##_mdl.arc || Graphical elements used in end of battles&lt;br /&gt;
|-&lt;br /&gt;
| unitall_mdl.arc || Borgs miniatures images used in Edit Force menu, at battle start and so on.&lt;br /&gt;
|-&lt;br /&gt;
| mcmg00_mdl.arc || When loading memory card.&lt;br /&gt;
|-&lt;br /&gt;
| stff* || Main menu&lt;br /&gt;
|-&lt;br /&gt;
| story* || Used in Story Mode progress&lt;br /&gt;
|-&lt;br /&gt;
| trade00_mdl.arc || Used in Trade Menu&lt;br /&gt;
|-&lt;br /&gt;
| set* || Elements to place in the maps (wall, trees and so on.)&lt;br /&gt;
|-&lt;br /&gt;
| tl00_mdl.arc || Used on the corners of the main menu.&lt;br /&gt;
|-&lt;br /&gt;
| gets* || Cinematic used when earning a new Borg. (Blue = Crystal); &lt;br /&gt;
|-&lt;br /&gt;
| gets06_mdl.arc || Cinematic when earning Neo G Red and others colors of Neo G Red.&lt;br /&gt;
|-&lt;br /&gt;
| nwld* || Unimplemented.&lt;br /&gt;
|-&lt;br /&gt;
| staff00_mdl.arc || Credits screen.&lt;br /&gt;
|-&lt;br /&gt;
| vsel00_mdl.arc || Multiplayer screen.&lt;br /&gt;
|-&lt;br /&gt;
| vsel01_mdl.arc || Created forces selection screen before start of battles. &lt;br /&gt;
|-&lt;br /&gt;
| st###_mdl.arz || PNJs images&lt;br /&gt;
|-&lt;br /&gt;
| stm## || Dialogs used in story mode.&lt;br /&gt;
|-&lt;br /&gt;
| sts## || Images used when selecting zones in story mode (face your opponent &amp;amp; defeat the boss)&lt;br /&gt;
|-&lt;br /&gt;
| briff00_mdl.arc || Images used for &amp;quot;VS&amp;quot; page start of fight.&lt;br /&gt;
|-&lt;br /&gt;
| cnd* (3) || Unimplemented files or used for animated titles. The text is inclined and distorted. (defeat enemy gotcha borgs! and so on.)&lt;br /&gt;
|-&lt;br /&gt;
| efct* || &#039;&#039;&#039;Ef&#039;&#039;&#039;fe&#039;&#039;&#039;ct&#039;&#039;&#039;s - effects used in battles like Shots or Shock.&lt;br /&gt;
|-&lt;br /&gt;
| name00_mdl.arc || Used in &amp;quot;Enter Name&amp;quot; window with grey alphabet.&lt;br /&gt;
|-&lt;br /&gt;
| arrow_mdl.arc || Used probably with a scale for Ally / Enemy health bar.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Game assets implementation ==&lt;br /&gt;
The page [[Implementations|implementations]] group technical details about game assets implementations:&lt;br /&gt;
* Borgs&lt;br /&gt;
* Data Crystals&lt;br /&gt;
* and so on.&lt;br /&gt;
&lt;br /&gt;
You might also want to read:&lt;br /&gt;
* [[Models]]&lt;br /&gt;
* [[Motions]]&lt;br /&gt;
* [[Borg - data file]]&lt;br /&gt;
&lt;br /&gt;
See also [https://github.com/Virtual-World-RE/NeoGF/tree/main/doc our documentation] available on github.&lt;br /&gt;
&lt;br /&gt;
== Main executable ==&lt;br /&gt;
Depending of which software is used the name of main executable may change since it&#039;s not stored in the GCM file: boot.[[DOL (File format)|dol]] / Start.[[DOL (File format) |dol]] and so on.&lt;br /&gt;
&lt;br /&gt;
The page [[DOL (Gotcha Force)]] group ongoing researches, technical details and characteristics of the mains Gotcha Force dols.&lt;br /&gt;
&lt;br /&gt;
The main executable embeds [https://usermanual.wiki/m/f28d717b124185a5deabfe6020cb945538679565e15cad6ec9f93a47e04eabef.pdf MetroTRK], a Target Resident Kernel for embedded systems allowing to remotely debug the game.&lt;br /&gt;
&lt;br /&gt;
We found differents staticly linked libraries in it and in particular HSD engine (HAL Sysdolphin engine). Source files haven&#039;t been leaked on the internet but we can find an awesome work realized by [https://smashboards.com/search/1402833/?q=hsd&amp;amp;o=relevance &amp;quot;Super Smash Bros. Melee&amp;quot; GameCube community] on which we can refer:&lt;br /&gt;
&lt;br /&gt;
-[https://github.com/UnclePunch/Training-Mode/wiki/HSD-Documentation Global description of HSD elements]&lt;br /&gt;
&lt;br /&gt;
-[https://github.com/PsiLupan/FRAY Reverse engineering of assemblies rewritten in C]&lt;br /&gt;
&lt;br /&gt;
== Beta version ==&lt;br /&gt;
The beta version of the game contains differences from the final releases. The 3D map is isometric with 3D elements in it and Borgs descriptions were contained in the screen with two sections: one for characteristics and the other one for the Borg story.&lt;br /&gt;
&lt;br /&gt;
[[File:Gfbeta02.jpg|800px|center|thumb|Isometric beta map. [https://www.unseen64.net/2008/04/08/gotcha-force-gc-beta-concept/ Source]]]&lt;br /&gt;
&lt;br /&gt;
[[File:gotchaforcebeta01.jpg|800px|thumb|center|Beta Borg description. [https://www.unseen64.net/2008/04/08/gotcha-force-gc-beta-concept/ Source]]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1540</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1540"/>
		<updated>2024-04-23T09:01:31Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: /* CObj: (0x38 bytes) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
{{Research | 2| Researches on headers / bodies structures are partially achieved. }}&lt;br /&gt;
&lt;br /&gt;
== Gotcha Force Models ==&lt;br /&gt;
&lt;br /&gt;
Gotcha Force models work as those from the game Super Smash Bros Melee (SSBM) investigated by its [https://smashboards.com/threads/melee-dat-format.292603/ community].&lt;br /&gt;
&lt;br /&gt;
A model is a file format that organizes objects and resources serialized to be used by the &#039;&#039;&#039;H&#039;&#039;&#039;al &#039;&#039;&#039;S&#039;&#039;&#039;ys&#039;&#039;&#039;D&#039;&#039;&#039;olphin (&#039;&#039;&#039;HSD&#039;&#039;&#039;) library. The HSD library is used in several Capcom games. These are graphic materials structured in a hierarchical way. Some pictures present in the models seem to indicate the use of [https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/matcap.html matcap] technic. This library uses Dolphin SDK functions like GX / MTX and so on.&lt;br /&gt;
&lt;br /&gt;
=== Affected files ===&lt;br /&gt;
All files in the AFS having &#039;&#039;&#039;_mdl&#039;&#039;&#039; in their names are models described in this page. We notice also [[ARZ (Gotcha Force)|.arz]] which are compressed models. collision.arc and tdc00.arc to tdc09.arc are also models.&lt;br /&gt;
&lt;br /&gt;
Model files are also found in the borgs&#039; pzz (plxxxx.pzz) at positions 004 to 009.&lt;br /&gt;
&lt;br /&gt;
=== HSDRaw ===&lt;br /&gt;
HSDRaw, a dotnet 3D editor for this format, is unstable on my Windows (algoflash). However, it has been proven that editing the _mdl starting at offset 0x100 - after the preamble - allows visualizing the file on HSDRaw and obtaining the 3D rendering of the Borg (click on the first JOBJ folder - then the JOBJ inside and double-click on the violet node). This should also allow editing certain properties?&lt;br /&gt;
&lt;br /&gt;
== General Structure ==&lt;br /&gt;
The model format is divided into several blocks. The preamble is 0x100 bytes at the very beginning of the file. It is often absent. All values are in unsigned big endian, and the pad is in Null bytes (\x00). Offsets found after the beginning of the Data Block (DB) are relative to the beginning of the DB. The relocation table is an array of 4-byte offsets (relative to the DB) used to translate the offsets of structures into absolute addressing during memory loading. The relocation table, for example, helps delimit the structures because it is unlikely that an offset points in the middle of a structure.&lt;br /&gt;
&lt;br /&gt;
All files following this format have a single root_node of type SObj (Scene data).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Preamble&#039;&#039;&#039;: (0x100 bytes / 0 bytes) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Size !! Description !! Observations&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 4 bytes || HSD Header offset ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || 4 bytes || Joints relation table offset || Offset of the relationship joints&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || 4 bytes || Joints array position || Position of the joint in the array&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || 20 bytes || Pad ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 bytes [32] || Joints relation table ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 32 bytes || Pad ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0 || 32 bytes || Joints array position ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0 || 32 bytes || Pad ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;HSD Header&#039;&#039;&#039; - (0x20 bytes) ===&lt;br /&gt;
* 4 bytes - Total file size&lt;br /&gt;
* 4 bytes - Data block size&lt;br /&gt;
* 4 bytes - Number of entries in the Relocation Table&lt;br /&gt;
* 4 bytes - root0_count&lt;br /&gt;
* 4 bytes - root1_count&lt;br /&gt;
* 12 bytes - Pad - (always)&lt;br /&gt;
=== &#039;&#039;&#039;Data block&#039;&#039;&#039;: ===&lt;br /&gt;
* JOBJ, etc. -&amp;gt; These structures are detailed below.&lt;br /&gt;
=== &#039;&#039;&#039;Relocation Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of 4-byte offsets - Offsets of structures in the DB.&lt;br /&gt;
=== &#039;&#039;&#039;Root Nodes (2)&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of size 8 * root0_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
* Array of size 8 * root1_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
=== &#039;&#039;&#039;String Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Series of strings terminated by Null, the number of root0_count + root1_count&lt;br /&gt;
&lt;br /&gt;
== Structures encountered in the DB ==&lt;br /&gt;
Note: The hierarchy is cumulative on transformations for parent-&amp;gt;child relationships&lt;br /&gt;
&lt;br /&gt;
Root Nodes with the name &amp;quot;scene_data&amp;quot; point to an SObj:&lt;br /&gt;
=== &#039;&#039;&#039;SObj&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - JObjDescs_offsets_list_offset&lt;br /&gt;
* 4 bytes - Cameras_list_offset&lt;br /&gt;
* 4 bytes - Lights_list_offset&lt;br /&gt;
* 4 bytes - Fog&lt;br /&gt;
&lt;br /&gt;
&amp;quot;scene_data&amp;quot; == name of the root node&lt;br /&gt;
JObjDescs_offsets_list_offset, cameras... point to a list of offsets terminated by 4 bytes at 0x00.&lt;br /&gt;
lights_list_offset points to pairs (4 bytes - LObj_offset; 4 bytes - light_anim_pointer_offset)&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObjDesc&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - root_joint_offset - JObj&lt;br /&gt;
* 4 bytes - joint_animations_offset - ?&lt;br /&gt;
* 4 bytes - material_animations_offset - ?&lt;br /&gt;
* 4 bytes - shape_animations_offset - ?&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CObj&#039;&#039;&#039;: (0x38 bytes) ===&lt;br /&gt;
* 4 bytes - flags&lt;br /&gt;
* 4 bytes - projection_type - ProjectionTypeEnum&lt;br /&gt;
* 2 bytes - viewport_left&lt;br /&gt;
* 2 bytes - viewport_right&lt;br /&gt;
* 2 bytes - viewport_top&lt;br /&gt;
* 2 bytes - viewport_bottom&lt;br /&gt;
* 4 bytes - proj_width&lt;br /&gt;
* 4 bytes - proj_height&lt;br /&gt;
* 4 bytes - eye_offset - WObj&lt;br /&gt;
* 4 bytes - target_offset - WObj&lt;br /&gt;
* 4 bytes - roll&lt;br /&gt;
* 4 bytes - up - Vec3&lt;br /&gt;
* 4 bytes - float - near_clip&lt;br /&gt;
* 4 bytes - float - far_clip&lt;br /&gt;
* 4 bytes - float - field_of_view&lt;br /&gt;
* 4 bytes - float - aspect&lt;br /&gt;
Camera object. Note: for frustrum or ortho, the structure is different.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ProjectionTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** PERSPECTIVE = 1&lt;br /&gt;
** FRUSTRUM = 2&lt;br /&gt;
** ORTHO = 3&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;WObj&#039;&#039;&#039;: (0x14 bytes) ===&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - v1&lt;br /&gt;
* 4 bytes - float - v2&lt;br /&gt;
* 4 bytes - float - v3&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
eye / target&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObj&#039;&#039;&#039;: (0x1c bytes) ===&lt;br /&gt;
* 4 bytes - class_name&lt;br /&gt;
* 4 bytes - next_offset&lt;br /&gt;
* 2 bytes - flags - LObjFlagsEnum&lt;br /&gt;
* 2 bytes - attenuation_flags - LObjAttenuationFlagsEnum&lt;br /&gt;
* 1 byte - color_r&lt;br /&gt;
* 1 byte - color_g&lt;br /&gt;
* 1 byte - color_b&lt;br /&gt;
* 1 byte - color_alpha&lt;br /&gt;
* 4 bytes - lobj_point_offset - position&lt;br /&gt;
* 4 bytes - infinite_data&lt;br /&gt;
* 4 bytes - point_spot_data&lt;br /&gt;
light&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_AMBIANT = 00 00&lt;br /&gt;
** LOBJ_INFINITE = 00 01&lt;br /&gt;
** LOBJ_POINT = 00 02&lt;br /&gt;
** LOBJ_SPOT = 00 03&lt;br /&gt;
** LOBJ_DIFFUSE = 00 04&lt;br /&gt;
** LOBJ_SPECULAR = 00 08&lt;br /&gt;
** LOBJ_ALPHA = 00 10&lt;br /&gt;
** LOBJ_HIDDEN = 00 20&lt;br /&gt;
** LOBJ_RAW_PARAM = 00 40&lt;br /&gt;
** LOBJ_DIFF_DIRTY = 00 80&lt;br /&gt;
** LOBJ_SPEC_DIRTY = 01 00&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjAttenuationFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_LIGHT_ATTN_NONE = 00 00&lt;br /&gt;
** LOBJ_LIGHT_ATTN = 00 01&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObjPoint&#039;&#039;&#039; : (0x14 bytes) ===&lt;br /&gt;
4 bytes - class_name&lt;br /&gt;
4 bytes - float - x&lt;br /&gt;
4 bytes - float - y&lt;br /&gt;
4 bytes - float - z&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
=== &#039;&#039;&#039;LightAnimPointer&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
** 4 bytes - next_offset - (LightAnimPointer)&lt;br /&gt;
** 4 bytes - light_anim - ?&lt;br /&gt;
** 4 bytes - position_anim - ?&lt;br /&gt;
** 4 bytes - interst_anim - ?&lt;br /&gt;
Bugs in HSDRaw - to be tested&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObj&#039;&#039;&#039; : (0x40 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - flags&lt;br /&gt;
4 bytes - child_offset (JObj)&lt;br /&gt;
4 bytes - next_offset (JObj)&lt;br /&gt;
4 bytes - dobj_offset (DObj)&lt;br /&gt;
4 bytes [3] - float3 - rotation_xyz&lt;br /&gt;
4 bytes [3] - float3 - scale_xyz&lt;br /&gt;
4 bytes [3] - float3 - translation_xyz&lt;br /&gt;
4 bytes - inverse_world_transform_offset (inverse world transform = 4x3 matrix)&lt;br /&gt;
4 bytes - robj_offset&lt;br /&gt;
Pointed by the lists in Root Node scene_data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JObjFlagsEnum&#039;&#039;&#039; : (can be cumulative)&lt;br /&gt;
** NULL = 00 00 00 00&lt;br /&gt;
** SKELETON = 00 00 00 01&lt;br /&gt;
** SKELETON_ROOT = 00 00 00 02&lt;br /&gt;
** ENVELOPE_MODEL = 00 00 00 04&lt;br /&gt;
** CLASSICAL_SCALING = 00 00 00 08&lt;br /&gt;
** HIDDEN = 00 00 00 10&lt;br /&gt;
** PTCL = 00 00 00 20&lt;br /&gt;
** MTX_DIRTY = 00 00 00 40&lt;br /&gt;
** LIGHTING = 00 00 00 80&lt;br /&gt;
** TEXGEN = 00 00 01 00&lt;br /&gt;
** BILLBOARD = 00 00 02 00&lt;br /&gt;
** VBILLBOARD = 00 00 04 00&lt;br /&gt;
** HBILLBOARD = 00 00 06 00&lt;br /&gt;
** RBILLBOARD = 00 00 08 00&lt;br /&gt;
** INSTANCE = 00 00 10 00&lt;br /&gt;
** PBILLBOARD = 00 00 20 00&lt;br /&gt;
** SPLINE = 00 00 40 00&lt;br /&gt;
** FLIP_IK = 00 00 80 00&lt;br /&gt;
** SPECULAR = 00 01 00 00&lt;br /&gt;
** USE_QUATERNION = 00 02 00 00&lt;br /&gt;
** OPA = 00 04 00 00&lt;br /&gt;
** XLU = 00 08 00 00&lt;br /&gt;
** TEXEDGE = 00 10 00 00&lt;br /&gt;
** JOINT1 = 00 20 00 00&lt;br /&gt;
** JOINT2 = 00 40 00 00&lt;br /&gt;
** EFFECTOR = 00 60 00 00&lt;br /&gt;
** USER_DEFINED_MTX = 00 80 00 00&lt;br /&gt;
** MTX_INDEPEND_PARENT = 01 00 00 00&lt;br /&gt;
** MTX_INDEPEND_SRT = 02 00 00 00&lt;br /&gt;
** MTX_SCALE_COMPENSATE = 04 00 00 00&lt;br /&gt;
** ROOT_OPA = 10 00 00 00&lt;br /&gt;
** ROOT_XLU = 20 00 00 00&lt;br /&gt;
** ROOT_TEXEDGE = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;InverseWorldTransform&#039;&#039;&#039; : (0x30 bytes) ===&lt;br /&gt;
4 bytes - float - M11&lt;br /&gt;
4 bytes - float - M12&lt;br /&gt;
4 bytes - float - M13&lt;br /&gt;
4 bytes - float - M14&lt;br /&gt;
4 bytes - float - M21&lt;br /&gt;
4 bytes - float - M22&lt;br /&gt;
4 bytes - float - M23&lt;br /&gt;
4 bytes - float - M24&lt;br /&gt;
4 bytes - float - M31&lt;br /&gt;
4 bytes - float - M32&lt;br /&gt;
4 bytes - float - M33&lt;br /&gt;
4 bytes - float - M34&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;DObj&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - next_offset - next DOBJ&lt;br /&gt;
4 bytes - mobj_offset - material offset&lt;br /&gt;
4 bytes - pobj_offset - mesh offset&lt;br /&gt;
Linked list that allows retrieving all materials &amp;amp; meshes for the associated JObj.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;MObj&#039;&#039;&#039; : (0x18 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - render_flags - RenderFlagsEnum&lt;br /&gt;
4 bytes - tobj_offset - texture offset - may be invalid if there is no texture for the material&lt;br /&gt;
4 bytes - material_offset - material colors?&lt;br /&gt;
8 bytes - PEDesc?&lt;br /&gt;
Contains textures &amp;amp; information about material colors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RenderFlagsEnum&#039;&#039;&#039; : (cumulative)&lt;br /&gt;
** USER = 80 00 00 00&lt;br /&gt;
** CONSTANT = 00 00 00 01&lt;br /&gt;
** VERTEX = 00 00 00 02&lt;br /&gt;
** BOTH = 00 00 00 03&lt;br /&gt;
** DIFFUSE = 00 00 00 04&lt;br /&gt;
** SPECULAR = 00 00 00 08&lt;br /&gt;
** TEX0 = 00 00 00 10&lt;br /&gt;
** TEX1 = 00 00 00 20&lt;br /&gt;
** TEX2 = 00 00 00 40&lt;br /&gt;
** TEX3 = 00 00 00 80&lt;br /&gt;
** TEX4 = 00 00 01 00&lt;br /&gt;
** TEX5 = 00 00 02 00&lt;br /&gt;
** TEX6 = 00 00 04 00&lt;br /&gt;
** TEX7 = 00 00 08 00&lt;br /&gt;
** TOON = 00 00 10 00&lt;br /&gt;
** ALPHA_MAT = 00 00 20 00&lt;br /&gt;
** ALPHA_VTX = 00 00 40 00&lt;br /&gt;
** ALPHA_BOTH = 00 00 60 00&lt;br /&gt;
** ZOFST = 01 00 00 00&lt;br /&gt;
** EFFECT = 02 00 00 00&lt;br /&gt;
** SHADOW = 04 00 00 00&lt;br /&gt;
** ZMODE_ALWAYS = 08 00 00 00&lt;br /&gt;
** DF_ALL = 10 00 00 00&lt;br /&gt;
** NO_ZUPDATE = 20 00 00 00&lt;br /&gt;
** XLU = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;TObj&#039;&#039;&#039; : (0x5c octets) ===&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - tex_map_id - TexMapIdEnum&lt;br /&gt;
* 4 bytes - gx_tex_gen_src - GXTexGenSrcEnum&lt;br /&gt;
* 4 bytes - float - rx&lt;br /&gt;
* 4 bytes - float - ry&lt;br /&gt;
* 4 bytes - float - rz&lt;br /&gt;
* 4 bytes - float - sx&lt;br /&gt;
* 4 bytes - float - sy&lt;br /&gt;
* 4 bytes - float - sz&lt;br /&gt;
* 4 bytes - float - tx&lt;br /&gt;
* 4 bytes - float - ty&lt;br /&gt;
* 4 bytes - float - tz&lt;br /&gt;
* 4 bytes - wrap_s - WrapEnum&lt;br /&gt;
* 4 bytes - wrap_t - WrapEnum&lt;br /&gt;
* 1 byte- w_scale&lt;br /&gt;
* 1 byte- h_scale&lt;br /&gt;
* 2 bytes - ?&lt;br /&gt;
1 byte - bump_map - (False = 00 ; True = 01)&lt;br /&gt;
4 bits - alpha_operation - AlphaOperationEnum&lt;br /&gt;
4 bits - color_operation - ColorOperationEnum&lt;br /&gt;
1 byte - shadow_lightmap - (False = 00 ; True = 01) (2 bytes with a lightmap limit Enum)&lt;br /&gt;
1 bit - ext_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - ambient_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - specular_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - diffuse_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
4 bits - coord_type - CoordTypeEnum&lt;br /&gt;
4 bytes - float - blending - used when color_operation or alpha_operation == BLEND&lt;br /&gt;
4 bytes - mag_filter - MagFilterEnum&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
Texture Information: The TObj contains information about texture environment parameters used for graphic rendering, as well as the offsets of the image and palette data used for this texture. The most important aspects here are the image offset and the palette/TLUT (Texture Look-Up Table) - if the image is not indexed (RGBA, CMPR, etc.), then the palette/TLUT description structure is not used.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TexMapIdEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TEXMAP0 = 00 00 00 00&lt;br /&gt;
** GX_TEXMAP1 = 00 00 00 01&lt;br /&gt;
** GX_TEXMAP2 = 00 00 00 02&lt;br /&gt;
** GX_TEXMAP3 = 00 00 00 03&lt;br /&gt;
** GX_TEXMAP4 = 00 00 00 04&lt;br /&gt;
** GX_TEXMAP5 = 00 00 00 05&lt;br /&gt;
** GX_TEXMAP6 = 00 00 00 06&lt;br /&gt;
** GX_TEXMAP7 = 00 00 00 07&lt;br /&gt;
** GX_MAX_TEXMAP = 00 00 00 08&lt;br /&gt;
** GX_TEXMAP_NULL = 00 00 00 09&lt;br /&gt;
** GX_TEXMAP_DISABLE = 00 00 00 0A&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GXTexGenSrcEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TG_POS = 00 00 00 00&lt;br /&gt;
** GX_TG_NRM = 00 00 00 01&lt;br /&gt;
** GX_TG_BINRM = 00 00 00 02&lt;br /&gt;
** GX_TG_TANGENT = 00 00 00 03&lt;br /&gt;
** GX_TG_TEX0 = 00 00 00 04&lt;br /&gt;
** GX_TG_TEX1 = 00 00 00 05&lt;br /&gt;
** GX_TG_TEX2 = 00 00 00 06&lt;br /&gt;
** GX_TG_TEX3 = 00 00 00 07&lt;br /&gt;
** GX_TG_TEX4 = 00 00 00 08&lt;br /&gt;
** GX_TG_TEX5 = 00 00 00 09&lt;br /&gt;
** GX_TG_TEX6 = 00 00 00 0A&lt;br /&gt;
** GX_TG_TEX7 = 00 00 00 0B&lt;br /&gt;
** GX_TG_TEXCOORD0 = 00 00 00 0C&lt;br /&gt;
** GX_TG_TEXCOORD1 = 00 00 00 0D&lt;br /&gt;
** GX_TG_TEXCOORD2 = 00 00 00 0E&lt;br /&gt;
** GX_TG_TEXCOORD3 = 00 00 00 0F&lt;br /&gt;
** GX_TG_TEXCOORD4 = 00 00 00 10&lt;br /&gt;
** GX_TG_TEXCOORD5 = 00 00 00 11&lt;br /&gt;
** GX_TG_TEXCOORD6 = 00 00 00 12&lt;br /&gt;
** GX_TG_COLOR0 = 00 00 00 13&lt;br /&gt;
** GX_TG_COLOR1 = 00 00 00 14&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AlphaOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = 0X&lt;br /&gt;
** ALPHAMASK = 1X&lt;br /&gt;
** BLEND = 2X&lt;br /&gt;
** MODULATE = 3X&lt;br /&gt;
** REPLACE = 4X&lt;br /&gt;
** PASS = 5X&lt;br /&gt;
** ADD = 6X&lt;br /&gt;
** SUB = 7X&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ColorOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = X0&lt;br /&gt;
** ALPHA_MASK = X1&lt;br /&gt;
** RGB_MASK = X2&lt;br /&gt;
** BLEND = X3&lt;br /&gt;
** MODULATE = X4&lt;br /&gt;
** REPLACE = X5&lt;br /&gt;
** PASS = X6&lt;br /&gt;
** ADD = X7&lt;br /&gt;
** SUB = X8&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CoordTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** UV = X0&lt;br /&gt;
** REFLECTION = X1&lt;br /&gt;
** HILIGHT = X2&lt;br /&gt;
** SHADOW = X3&lt;br /&gt;
** TOON = X4&lt;br /&gt;
** GRADATION = X5&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MagFilterEnum&#039;&#039;&#039;:&lt;br /&gt;
** GX_NEAR = 00 00 00 00&lt;br /&gt;
** GX_LINEAR = 00 00 00 01&lt;br /&gt;
** GX_NEAR_MIP_NEAR = 00 00 00 02&lt;br /&gt;
** GX_LIN_MIP_NEAR = 00 00 00 03&lt;br /&gt;
** GX_NEAR_MIP_LIN = 00 00 00 04&lt;br /&gt;
** GX_LIN_MIP_LIN = 00 00 00 05&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WrapEnum&#039;&#039;&#039;:&lt;br /&gt;
** CLAMP = 00 00 00 00&lt;br /&gt;
** REPEAT = 00 00 00 01&lt;br /&gt;
** MIRROR = 00 00 00 02&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Material&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 1 byte - AMB_R - (ambient)&lt;br /&gt;
* 1 byte - AMB_G&lt;br /&gt;
* 1 byte - AMB_B&lt;br /&gt;
* 1 byte - AMB_A&lt;br /&gt;
* 1 byte - DIF_R - (diffuse)&lt;br /&gt;
* 1 byte - DIF_G&lt;br /&gt;
* 1 byte - DIF_B&lt;br /&gt;
* 1 byte - DIF_A&lt;br /&gt;
* 1 byte - SPC_R - (specular)&lt;br /&gt;
* 1 byte - SPC_G&lt;br /&gt;
* 1 byte - SPC_B&lt;br /&gt;
* 1 byte - SPC_A&lt;br /&gt;
* 4 bytes - float - alpha&lt;br /&gt;
* 4 bytes - float - shininess&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 bytes - Inconnu&lt;br /&gt;
* 4 bytes - next_offset - pobj&lt;br /&gt;
* 4 bytes - vertex_attr_list_offset&lt;br /&gt;
* 2 bytes  - Flags - PObjFlagsEnum&lt;br /&gt;
* 2 bytes - display_list_size - number of 0x20 (32) byte blocks occupied by display list data&lt;br /&gt;
* 4 bytes - display_list_offset&lt;br /&gt;
*4 bytes - weight_list_offset - ? Verify that the envelope_weights array is indeed found at this offset.&lt;br /&gt;
&lt;br /&gt;
As indicated by next_offset, it is a list of meshes to be displayed for a given material referenced by a dobj. PObj contains the offsets of vertex attributes / display list / joint weight list, which is sufficient and allows interpreting and processing vertex, normal, and texture coordinates.&lt;br /&gt;
&lt;br /&gt;
Vertex attributes are the most important - the specified parameters control everything: from the format to the size of the data for each vertex, normal, and texture coordinates, and how these values are dimensioned (scaled) based on the presence and size of each index value appearing in the display list information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
Unknown0 = 00 01&lt;br /&gt;
Unknown1 = 00 02&lt;br /&gt;
** ANIM = 00 08&lt;br /&gt;
** SHAPE_ANIM = 10 00&lt;br /&gt;
** ENVELOPE = 20 00&lt;br /&gt;
** CULLBACK = 40 00&lt;br /&gt;
** CULLFRONT = 80 00&lt;br /&gt;
&lt;br /&gt;
=== EnvelopeWeights : (0x? octets) ===&lt;br /&gt;
* 4 bytes - envelope_count&lt;br /&gt;
* [envelope_count]:&lt;br /&gt;
** 4 bytes - float - weight&lt;br /&gt;
** 4 bytes - pad ?&lt;br /&gt;
* 4 bytes - jobj_list_offset&lt;br /&gt;
&lt;br /&gt;
=== not verified yet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IMAGE_HEADER&#039;&#039;&#039; :&lt;br /&gt;
** 4 bytes - image_offset - image data&lt;br /&gt;
** 2 bytes - width&lt;br /&gt;
** 2 bytes - height&lt;br /&gt;
** 4 bytes - image_format&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PALETTE_HEADER&#039;&#039;&#039; : (0x10 bytes)&lt;br /&gt;
** 4 bytes - palette_offset - palette data&lt;br /&gt;
** 4 bytes - palette_format&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 2 bytes - color_count&lt;br /&gt;
** 2 bytes - Unknown&lt;br /&gt;
The image_offset and palette_offset are often shared by several textures. Knowing this allows you to find all the information about the textures&#039; image data (width, height, format), as well as the format and the number of colors in the palette/TLUT.&lt;br /&gt;
&lt;br /&gt;
The image format does not determine the total number of colors in the palette it uses. For example, an 8-bit indexed image would have a maximum of 256 colors, but only 136 or 221 colors may be currently used. In this way, the palette will not use the total size it should use.&lt;br /&gt;
&lt;br /&gt;
Images follow the structure generally used by the GameCube:&lt;br /&gt;
&lt;br /&gt;
IMAGE FORMATS :&lt;br /&gt;
* case 0: //i4&lt;br /&gt;
* case 1: //i8&lt;br /&gt;
* case 2: //i4a4&lt;br /&gt;
* case 3: //i8a8&lt;br /&gt;
* case 4: //r5g6b5&lt;br /&gt;
* case 5: //rgb5a3&lt;br /&gt;
* case 6: //r8g8b8a8&lt;br /&gt;
* case 8: //index4&lt;br /&gt;
* case 9: //index8&lt;br /&gt;
* case 0xa: //index14x2&lt;br /&gt;
* case 0xe: //s3tc1&lt;br /&gt;
&lt;br /&gt;
The indexed formats also use palette/TLUT information, and the data can appear in various formats:&lt;br /&gt;
&lt;br /&gt;
PALETTE FORMATS :&lt;br /&gt;
* case 0: //ia8&lt;br /&gt;
* case 1: //r5g6b5&lt;br /&gt;
* case 2: //rgb5a3&lt;br /&gt;
&lt;br /&gt;
---&amp;gt; &amp;quot;Joint Data - Accessing Geometry, Mesh, and Vertex Attributes&amp;quot; https://smashboards.com/threads/melee-dat-format.292603/&lt;br /&gt;
&lt;br /&gt;
// Declaration of a vertex and attribute information&lt;br /&gt;
// attr, type, cnt, data_type, flags?, file_offset&lt;br /&gt;
* ATTR_DATA&lt;br /&gt;
** 4 bytes - GXAttr     vtx_attr_offset - attr&lt;br /&gt;
** 4 bytes - GXAttrType vtx_attr_type   - index_type&lt;br /&gt;
** 4 bytes - GXCompCnt  comp_cnt        - cnt&lt;br /&gt;
** 4 bytes - GXCompType comp_type       - data_type	&lt;br /&gt;
** 1 bytes - scale&lt;br /&gt;
** 1 bytes - unknown&lt;br /&gt;
** 2 bytes - vtx_stride&lt;br /&gt;
** 2 bytes - data_offset&lt;br /&gt;
&lt;br /&gt;
vertex_attr_offset points to a list of vertex attributes. The number of these attributes is not provided. The data in this structure follows the information and types designed by the GameCube/WII architecture and its API. The list is terminated by a specific value of vtx_attr signaling the end of this list. With access to the SDK documentation, it is strongly recommended to read the section about &amp;quot;vertex attributes and other specifications.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The value of vtx_attr determines the type of data that this attribute represents and can indicate a number of native types used for passing data between software and hardware interfaces.&lt;br /&gt;
&lt;br /&gt;
The possible values are as follows:&lt;br /&gt;
enum GXAttr (4 bytes)&lt;br /&gt;
** GX_VA_PNMTXIDX = 0, // position/normal matrix index&lt;br /&gt;
** GX_VA_TEX0MTXIDX, // texture 0 matrix index&lt;br /&gt;
** GX_VA_TEX1MTXIDX, // texture 1 matrix index&lt;br /&gt;
** GX_VA_TEX2MTXIDX, // texture 2 matrix index&lt;br /&gt;
** GX_VA_TEX3MTXIDX, // texture 3 matrix index&lt;br /&gt;
** GX_VA_TEX4MTXIDX, // texture 4 matrix index&lt;br /&gt;
** GX_VA_TEX5MTXIDX, // texture 5 matrix index&lt;br /&gt;
** GX_VA_TEX6MTXIDX, // texture 6 matrix index&lt;br /&gt;
** GX_VA_TEX7MTXIDX, // texture 7 matrix index&lt;br /&gt;
** GX_VA_POS = 9, // position&lt;br /&gt;
** GX_VA_NRM, // normal&lt;br /&gt;
** GX_VA_CLR0, // color 0&lt;br /&gt;
** GX_VA_CLR1, // color 1&lt;br /&gt;
** GX_VA_TEX0, // input texture coordinate 0&lt;br /&gt;
** GX_VA_TEX1, // input texture coordinate 1&lt;br /&gt;
** GX_VA_TEX2, // input texture coordinate 2&lt;br /&gt;
** GX_VA_TEX3, // input texture coordinate 3&lt;br /&gt;
** GX_VA_TEX4, // input texture coordinate 4&lt;br /&gt;
** GX_VA_TEX5, // input texture coordinate 5&lt;br /&gt;
** GX_VA_TEX6, // input texture coordinate 6&lt;br /&gt;
** GX_VA_TEX7, // input texture coordinate 7&lt;br /&gt;
&lt;br /&gt;
** GX_POS_MTX_ARRAY, // position matrix array pointer&lt;br /&gt;
** GX_NRM_MTX_ARRAY, // normal matrix array pointer&lt;br /&gt;
** GX_TEX_MTX_ARRAY, // texture matrix array pointer&lt;br /&gt;
** GX_LIGHT_ARRAY, // light parameter array pointer&lt;br /&gt;
** GX_VA_NBT, // normal, bi-normal, tangent&lt;br /&gt;
** GX_VA_MAX_ATTR, // maximum number of vertex attributes&lt;br /&gt;
&lt;br /&gt;
** GX_VA_NULL = 0xff // NULL attribute (to mark the end of lists)&lt;br /&gt;
&lt;br /&gt;
All the necessary data to represent a mesh can be specified and indexed in one way or another. Similarly, GX_VA_TEX0MTXIDX, GX_VA_CLR0, and others are also possible - the most frequent values in the SSBM data are: GX_VA_PNMTXIDX, GX_VA_POS, GX_VA_NRM, and GX_VA_TEX0. This is to be expected as joint matrices, vertex positions/normals, and texture coordinates respectively are probably the most basic elements needed to display a textured mesh, whether static or animated.&lt;br /&gt;
&lt;br /&gt;
When the value of vtx_attr == GX_VA_NULL (0xFF), the end of the vertex attribute array has been reached.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The vtx_attr_type values is actually associated with how the value is indexed, and can thus also determine the size of the index value within the display list data.&lt;br /&gt;
&lt;br /&gt;
* 4 bytes - enum GXAttrType&lt;br /&gt;
** GX_NONE    = 0,&lt;br /&gt;
** GX_DIRECT,&lt;br /&gt;
** GX_INDEX8,&lt;br /&gt;
** GX_INDEX16&lt;br /&gt;
&lt;br /&gt;
* Structures COLL_DATA : (collision data)&lt;br /&gt;
** 4 bytes - vertex_offset (2 floats per entry corresponding to probably 2D data)&lt;br /&gt;
** 4 bytes - vertex_count&lt;br /&gt;
** 4 bytes - index_offset&lt;br /&gt;
** 4 bytes - index_count&lt;br /&gt;
** 4 bytes [5] - Unknown&lt;br /&gt;
*** 2 bytes - index_start&lt;br /&gt;
*** 2 bytes - index_count&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1539</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1539"/>
		<updated>2023-12-29T07:40:51Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
{{Research | 2| Researches on headers / bodies structures are partially achieved. }}&lt;br /&gt;
&lt;br /&gt;
== Gotcha Force Models ==&lt;br /&gt;
&lt;br /&gt;
Gotcha Force models work as those from the game Super Smash Bros Melee (SSBM) investigated by its [https://smashboards.com/threads/melee-dat-format.292603/ community].&lt;br /&gt;
&lt;br /&gt;
A model is a file format that organizes objects and resources serialized to be used by the &#039;&#039;&#039;H&#039;&#039;&#039;al &#039;&#039;&#039;S&#039;&#039;&#039;ys&#039;&#039;&#039;D&#039;&#039;&#039;olphin (&#039;&#039;&#039;HSD&#039;&#039;&#039;) library. The HSD library is used in several Capcom games. These are graphic materials structured in a hierarchical way. Some pictures present in the models seem to indicate the use of [https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/matcap.html matcap] technic. This library uses Dolphin SDK functions like GX / MTX and so on.&lt;br /&gt;
&lt;br /&gt;
=== Affected files ===&lt;br /&gt;
All files in the AFS having &#039;&#039;&#039;_mdl&#039;&#039;&#039; in their names are models described in this page. We notice also [[ARZ (Gotcha Force)|.arz]] which are compressed models. collision.arc and tdc00.arc to tdc09.arc are also models.&lt;br /&gt;
&lt;br /&gt;
Model files are also found in the borgs&#039; pzz (plxxxx.pzz) at positions 004 to 009.&lt;br /&gt;
&lt;br /&gt;
=== HSDRaw ===&lt;br /&gt;
HSDRaw, a dotnet 3D editor for this format, is unstable on my Windows (algoflash). However, it has been proven that editing the _mdl starting at offset 0x100 - after the preamble - allows visualizing the file on HSDRaw and obtaining the 3D rendering of the Borg (click on the first JOBJ folder - then the JOBJ inside and double-click on the violet node). This should also allow editing certain properties?&lt;br /&gt;
&lt;br /&gt;
== General Structure ==&lt;br /&gt;
The model format is divided into several blocks. The preamble is 0x100 bytes at the very beginning of the file. It is often absent. All values are in unsigned big endian, and the pad is in Null bytes (\x00). Offsets found after the beginning of the Data Block (DB) are relative to the beginning of the DB. The relocation table is an array of 4-byte offsets (relative to the DB) used to translate the offsets of structures into absolute addressing during memory loading. The relocation table, for example, helps delimit the structures because it is unlikely that an offset points in the middle of a structure.&lt;br /&gt;
&lt;br /&gt;
All files following this format have a single root_node of type SObj (Scene data).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Preamble&#039;&#039;&#039;: (0x100 bytes / 0 bytes) ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Position !! Size !! Description !! Observations&lt;br /&gt;
|-&lt;br /&gt;
| 0x0 || 4 bytes || HSD Header offset ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4 || 4 bytes || Joints relation table offset || Offset of the relationship joints&lt;br /&gt;
|-&lt;br /&gt;
| 0x8 || 4 bytes || Joints array position || Position of the joint in the array&lt;br /&gt;
|-&lt;br /&gt;
| 0xC || 20 bytes || Pad ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 bytes [32] || Joints relation table ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || 32 bytes || Pad ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0 || 32 bytes || Joints array position ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xE0 || 32 bytes || Pad ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;HSD Header&#039;&#039;&#039; - (0x20 bytes) ===&lt;br /&gt;
* 4 bytes - Total file size&lt;br /&gt;
* 4 bytes - Data block size&lt;br /&gt;
* 4 bytes - Number of entries in the Relocation Table&lt;br /&gt;
* 4 bytes - root0_count&lt;br /&gt;
* 4 bytes - root1_count&lt;br /&gt;
* 12 bytes - Pad - (always)&lt;br /&gt;
=== &#039;&#039;&#039;Data block&#039;&#039;&#039;: ===&lt;br /&gt;
* JOBJ, etc. -&amp;gt; These structures are detailed below.&lt;br /&gt;
=== &#039;&#039;&#039;Relocation Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of 4-byte offsets - Offsets of structures in the DB.&lt;br /&gt;
=== &#039;&#039;&#039;Root Nodes (2)&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of size 8 * root0_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
* Array of size 8 * root1_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
=== &#039;&#039;&#039;String Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Series of strings terminated by Null, the number of root0_count + root1_count&lt;br /&gt;
&lt;br /&gt;
== Structures encountered in the DB ==&lt;br /&gt;
Note: The hierarchy is cumulative on transformations for parent-&amp;gt;child relationships&lt;br /&gt;
&lt;br /&gt;
Root Nodes with the name &amp;quot;scene_data&amp;quot; point to an SObj:&lt;br /&gt;
=== &#039;&#039;&#039;SObj&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - JObjDescs_offsets_list_offset&lt;br /&gt;
* 4 bytes - Cameras_list_offset&lt;br /&gt;
* 4 bytes - Lights_list_offset&lt;br /&gt;
* 4 bytes - Fog&lt;br /&gt;
&lt;br /&gt;
&amp;quot;scene_data&amp;quot; == name of the root node&lt;br /&gt;
JObjDescs_offsets_list_offset, cameras... point to a list of offsets terminated by 4 bytes at 0x00.&lt;br /&gt;
lights_list_offset points to pairs (4 bytes - LObj_offset; 4 bytes - light_anim_pointer_offset)&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObjDesc&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - root_joint_offset - JObj&lt;br /&gt;
* 4 bytes - joint_animations_offset - ?&lt;br /&gt;
* 4 bytes - material_animations_offset - ?&lt;br /&gt;
* 4 bytes - shape_animations_offset - ?&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CObj&#039;&#039;&#039;: (0x38 bytes) ===&lt;br /&gt;
* 4 bytes - flags&lt;br /&gt;
* 4 bytes - projection_type - ProjectionTypeEnum&lt;br /&gt;
* 2 bytes - viewport_left&lt;br /&gt;
* 2 bytes - viewport_right&lt;br /&gt;
* 2 bytes - viewport_top&lt;br /&gt;
* 2 bytes - viewport_bottom&lt;br /&gt;
* 4 bytes - proj_width&lt;br /&gt;
* 4 bytes - proj_height&lt;br /&gt;
* 4 bytes - eye_offset - WObj&lt;br /&gt;
* 4 bytes - target_offset - WObj&lt;br /&gt;
* 4 bytes - roll&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - near_clip&lt;br /&gt;
* 4 bytes - float - far_clip&lt;br /&gt;
* 4 bytes - float - field_of_view&lt;br /&gt;
* 4 bytes - float - aspect&lt;br /&gt;
Camera object. Note: for frustrum or ortho, the structure is different.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ProjectionTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** PERSPECTIVE = 1&lt;br /&gt;
** FRUSTRUM = 2&lt;br /&gt;
** ORTHO = 3&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;WObj&#039;&#039;&#039;: (0x14 bytes) ===&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - v1&lt;br /&gt;
* 4 bytes - float - v2&lt;br /&gt;
* 4 bytes - float - v3&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
eye / target&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObj&#039;&#039;&#039;: (0x1c bytes) ===&lt;br /&gt;
* 4 bytes - class_name&lt;br /&gt;
* 4 bytes - next_offset&lt;br /&gt;
* 2 bytes - flags - LObjFlagsEnum&lt;br /&gt;
* 2 bytes - attenuation_flags - LObjAttenuationFlagsEnum&lt;br /&gt;
* 1 byte - color_r&lt;br /&gt;
* 1 byte - color_g&lt;br /&gt;
* 1 byte - color_b&lt;br /&gt;
* 1 byte - color_alpha&lt;br /&gt;
* 4 bytes - lobj_point_offset - position&lt;br /&gt;
* 4 bytes - infinite_data&lt;br /&gt;
* 4 bytes - point_spot_data&lt;br /&gt;
light&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_AMBIANT = 00 00&lt;br /&gt;
** LOBJ_INFINITE = 00 01&lt;br /&gt;
** LOBJ_POINT = 00 02&lt;br /&gt;
** LOBJ_SPOT = 00 03&lt;br /&gt;
** LOBJ_DIFFUSE = 00 04&lt;br /&gt;
** LOBJ_SPECULAR = 00 08&lt;br /&gt;
** LOBJ_ALPHA = 00 10&lt;br /&gt;
** LOBJ_HIDDEN = 00 20&lt;br /&gt;
** LOBJ_RAW_PARAM = 00 40&lt;br /&gt;
** LOBJ_DIFF_DIRTY = 00 80&lt;br /&gt;
** LOBJ_SPEC_DIRTY = 01 00&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjAttenuationFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_LIGHT_ATTN_NONE = 00 00&lt;br /&gt;
** LOBJ_LIGHT_ATTN = 00 01&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObjPoint&#039;&#039;&#039; : (0x14 bytes) ===&lt;br /&gt;
4 bytes - class_name&lt;br /&gt;
4 bytes - float - x&lt;br /&gt;
4 bytes - float - y&lt;br /&gt;
4 bytes - float - z&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
=== &#039;&#039;&#039;LightAnimPointer&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
** 4 bytes - next_offset - (LightAnimPointer)&lt;br /&gt;
** 4 bytes - light_anim - ?&lt;br /&gt;
** 4 bytes - position_anim - ?&lt;br /&gt;
** 4 bytes - interst_anim - ?&lt;br /&gt;
Bugs in HSDRaw - to be tested&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObj&#039;&#039;&#039; : (0x40 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - flags&lt;br /&gt;
4 bytes - child_offset (JObj)&lt;br /&gt;
4 bytes - next_offset (JObj)&lt;br /&gt;
4 bytes - dobj_offset (DObj)&lt;br /&gt;
4 bytes [3] - float3 - rotation_xyz&lt;br /&gt;
4 bytes [3] - float3 - scale_xyz&lt;br /&gt;
4 bytes [3] - float3 - translation_xyz&lt;br /&gt;
4 bytes - inverse_world_transform_offset (inverse world transform = 4x3 matrix)&lt;br /&gt;
4 bytes - robj_offset&lt;br /&gt;
Pointed by the lists in Root Node scene_data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JObjFlagsEnum&#039;&#039;&#039; : (can be cumulative)&lt;br /&gt;
** NULL = 00 00 00 00&lt;br /&gt;
** SKELETON = 00 00 00 01&lt;br /&gt;
** SKELETON_ROOT = 00 00 00 02&lt;br /&gt;
** ENVELOPE_MODEL = 00 00 00 04&lt;br /&gt;
** CLASSICAL_SCALING = 00 00 00 08&lt;br /&gt;
** HIDDEN = 00 00 00 10&lt;br /&gt;
** PTCL = 00 00 00 20&lt;br /&gt;
** MTX_DIRTY = 00 00 00 40&lt;br /&gt;
** LIGHTING = 00 00 00 80&lt;br /&gt;
** TEXGEN = 00 00 01 00&lt;br /&gt;
** BILLBOARD = 00 00 02 00&lt;br /&gt;
** VBILLBOARD = 00 00 04 00&lt;br /&gt;
** HBILLBOARD = 00 00 06 00&lt;br /&gt;
** RBILLBOARD = 00 00 08 00&lt;br /&gt;
** INSTANCE = 00 00 10 00&lt;br /&gt;
** PBILLBOARD = 00 00 20 00&lt;br /&gt;
** SPLINE = 00 00 40 00&lt;br /&gt;
** FLIP_IK = 00 00 80 00&lt;br /&gt;
** SPECULAR = 00 01 00 00&lt;br /&gt;
** USE_QUATERNION = 00 02 00 00&lt;br /&gt;
** OPA = 00 04 00 00&lt;br /&gt;
** XLU = 00 08 00 00&lt;br /&gt;
** TEXEDGE = 00 10 00 00&lt;br /&gt;
** JOINT1 = 00 20 00 00&lt;br /&gt;
** JOINT2 = 00 40 00 00&lt;br /&gt;
** EFFECTOR = 00 60 00 00&lt;br /&gt;
** USER_DEFINED_MTX = 00 80 00 00&lt;br /&gt;
** MTX_INDEPEND_PARENT = 01 00 00 00&lt;br /&gt;
** MTX_INDEPEND_SRT = 02 00 00 00&lt;br /&gt;
** MTX_SCALE_COMPENSATE = 04 00 00 00&lt;br /&gt;
** ROOT_OPA = 10 00 00 00&lt;br /&gt;
** ROOT_XLU = 20 00 00 00&lt;br /&gt;
** ROOT_TEXEDGE = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;InverseWorldTransform&#039;&#039;&#039; : (0x30 bytes) ===&lt;br /&gt;
4 bytes - float - M11&lt;br /&gt;
4 bytes - float - M12&lt;br /&gt;
4 bytes - float - M13&lt;br /&gt;
4 bytes - float - M14&lt;br /&gt;
4 bytes - float - M21&lt;br /&gt;
4 bytes - float - M22&lt;br /&gt;
4 bytes - float - M23&lt;br /&gt;
4 bytes - float - M24&lt;br /&gt;
4 bytes - float - M31&lt;br /&gt;
4 bytes - float - M32&lt;br /&gt;
4 bytes - float - M33&lt;br /&gt;
4 bytes - float - M34&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;DObj&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - next_offset - next DOBJ&lt;br /&gt;
4 bytes - mobj_offset - material offset&lt;br /&gt;
4 bytes - pobj_offset - mesh offset&lt;br /&gt;
Linked list that allows retrieving all materials &amp;amp; meshes for the associated JObj.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;MObj&#039;&#039;&#039; : (0x18 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - render_flags - RenderFlagsEnum&lt;br /&gt;
4 bytes - tobj_offset - texture offset - may be invalid if there is no texture for the material&lt;br /&gt;
4 bytes - material_offset - material colors?&lt;br /&gt;
8 bytes - PEDesc?&lt;br /&gt;
Contains textures &amp;amp; information about material colors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RenderFlagsEnum&#039;&#039;&#039; : (cumulative)&lt;br /&gt;
** USER = 80 00 00 00&lt;br /&gt;
** CONSTANT = 00 00 00 01&lt;br /&gt;
** VERTEX = 00 00 00 02&lt;br /&gt;
** BOTH = 00 00 00 03&lt;br /&gt;
** DIFFUSE = 00 00 00 04&lt;br /&gt;
** SPECULAR = 00 00 00 08&lt;br /&gt;
** TEX0 = 00 00 00 10&lt;br /&gt;
** TEX1 = 00 00 00 20&lt;br /&gt;
** TEX2 = 00 00 00 40&lt;br /&gt;
** TEX3 = 00 00 00 80&lt;br /&gt;
** TEX4 = 00 00 01 00&lt;br /&gt;
** TEX5 = 00 00 02 00&lt;br /&gt;
** TEX6 = 00 00 04 00&lt;br /&gt;
** TEX7 = 00 00 08 00&lt;br /&gt;
** TOON = 00 00 10 00&lt;br /&gt;
** ALPHA_MAT = 00 00 20 00&lt;br /&gt;
** ALPHA_VTX = 00 00 40 00&lt;br /&gt;
** ALPHA_BOTH = 00 00 60 00&lt;br /&gt;
** ZOFST = 01 00 00 00&lt;br /&gt;
** EFFECT = 02 00 00 00&lt;br /&gt;
** SHADOW = 04 00 00 00&lt;br /&gt;
** ZMODE_ALWAYS = 08 00 00 00&lt;br /&gt;
** DF_ALL = 10 00 00 00&lt;br /&gt;
** NO_ZUPDATE = 20 00 00 00&lt;br /&gt;
** XLU = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;TObj&#039;&#039;&#039; : (0x5c octets) ===&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - tex_map_id - TexMapIdEnum&lt;br /&gt;
* 4 bytes - gx_tex_gen_src - GXTexGenSrcEnum&lt;br /&gt;
* 4 bytes - float - rx&lt;br /&gt;
* 4 bytes - float - ry&lt;br /&gt;
* 4 bytes - float - rz&lt;br /&gt;
* 4 bytes - float - sx&lt;br /&gt;
* 4 bytes - float - sy&lt;br /&gt;
* 4 bytes - float - sz&lt;br /&gt;
* 4 bytes - float - tx&lt;br /&gt;
* 4 bytes - float - ty&lt;br /&gt;
* 4 bytes - float - tz&lt;br /&gt;
* 4 bytes - wrap_s - WrapEnum&lt;br /&gt;
* 4 bytes - wrap_t - WrapEnum&lt;br /&gt;
* 1 byte- w_scale&lt;br /&gt;
* 1 byte- h_scale&lt;br /&gt;
* 2 bytes - ?&lt;br /&gt;
1 byte - bump_map - (False = 00 ; True = 01)&lt;br /&gt;
4 bits - alpha_operation - AlphaOperationEnum&lt;br /&gt;
4 bits - color_operation - ColorOperationEnum&lt;br /&gt;
1 byte - shadow_lightmap - (False = 00 ; True = 01) (2 bytes with a lightmap limit Enum)&lt;br /&gt;
1 bit - ext_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - ambient_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - specular_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - diffuse_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
4 bits - coord_type - CoordTypeEnum&lt;br /&gt;
4 bytes - float - blending - used when color_operation or alpha_operation == BLEND&lt;br /&gt;
4 bytes - mag_filter - MagFilterEnum&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
Texture Information: The TObj contains information about texture environment parameters used for graphic rendering, as well as the offsets of the image and palette data used for this texture. The most important aspects here are the image offset and the palette/TLUT (Texture Look-Up Table) - if the image is not indexed (RGBA, CMPR, etc.), then the palette/TLUT description structure is not used.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TexMapIdEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TEXMAP0 = 00 00 00 00&lt;br /&gt;
** GX_TEXMAP1 = 00 00 00 01&lt;br /&gt;
** GX_TEXMAP2 = 00 00 00 02&lt;br /&gt;
** GX_TEXMAP3 = 00 00 00 03&lt;br /&gt;
** GX_TEXMAP4 = 00 00 00 04&lt;br /&gt;
** GX_TEXMAP5 = 00 00 00 05&lt;br /&gt;
** GX_TEXMAP6 = 00 00 00 06&lt;br /&gt;
** GX_TEXMAP7 = 00 00 00 07&lt;br /&gt;
** GX_MAX_TEXMAP = 00 00 00 08&lt;br /&gt;
** GX_TEXMAP_NULL = 00 00 00 09&lt;br /&gt;
** GX_TEXMAP_DISABLE = 00 00 00 0A&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GXTexGenSrcEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TG_POS = 00 00 00 00&lt;br /&gt;
** GX_TG_NRM = 00 00 00 01&lt;br /&gt;
** GX_TG_BINRM = 00 00 00 02&lt;br /&gt;
** GX_TG_TANGENT = 00 00 00 03&lt;br /&gt;
** GX_TG_TEX0 = 00 00 00 04&lt;br /&gt;
** GX_TG_TEX1 = 00 00 00 05&lt;br /&gt;
** GX_TG_TEX2 = 00 00 00 06&lt;br /&gt;
** GX_TG_TEX3 = 00 00 00 07&lt;br /&gt;
** GX_TG_TEX4 = 00 00 00 08&lt;br /&gt;
** GX_TG_TEX5 = 00 00 00 09&lt;br /&gt;
** GX_TG_TEX6 = 00 00 00 0A&lt;br /&gt;
** GX_TG_TEX7 = 00 00 00 0B&lt;br /&gt;
** GX_TG_TEXCOORD0 = 00 00 00 0C&lt;br /&gt;
** GX_TG_TEXCOORD1 = 00 00 00 0D&lt;br /&gt;
** GX_TG_TEXCOORD2 = 00 00 00 0E&lt;br /&gt;
** GX_TG_TEXCOORD3 = 00 00 00 0F&lt;br /&gt;
** GX_TG_TEXCOORD4 = 00 00 00 10&lt;br /&gt;
** GX_TG_TEXCOORD5 = 00 00 00 11&lt;br /&gt;
** GX_TG_TEXCOORD6 = 00 00 00 12&lt;br /&gt;
** GX_TG_COLOR0 = 00 00 00 13&lt;br /&gt;
** GX_TG_COLOR1 = 00 00 00 14&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AlphaOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = 0X&lt;br /&gt;
** ALPHAMASK = 1X&lt;br /&gt;
** BLEND = 2X&lt;br /&gt;
** MODULATE = 3X&lt;br /&gt;
** REPLACE = 4X&lt;br /&gt;
** PASS = 5X&lt;br /&gt;
** ADD = 6X&lt;br /&gt;
** SUB = 7X&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ColorOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = X0&lt;br /&gt;
** ALPHA_MASK = X1&lt;br /&gt;
** RGB_MASK = X2&lt;br /&gt;
** BLEND = X3&lt;br /&gt;
** MODULATE = X4&lt;br /&gt;
** REPLACE = X5&lt;br /&gt;
** PASS = X6&lt;br /&gt;
** ADD = X7&lt;br /&gt;
** SUB = X8&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CoordTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** UV = X0&lt;br /&gt;
** REFLECTION = X1&lt;br /&gt;
** HILIGHT = X2&lt;br /&gt;
** SHADOW = X3&lt;br /&gt;
** TOON = X4&lt;br /&gt;
** GRADATION = X5&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MagFilterEnum&#039;&#039;&#039;:&lt;br /&gt;
** GX_NEAR = 00 00 00 00&lt;br /&gt;
** GX_LINEAR = 00 00 00 01&lt;br /&gt;
** GX_NEAR_MIP_NEAR = 00 00 00 02&lt;br /&gt;
** GX_LIN_MIP_NEAR = 00 00 00 03&lt;br /&gt;
** GX_NEAR_MIP_LIN = 00 00 00 04&lt;br /&gt;
** GX_LIN_MIP_LIN = 00 00 00 05&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WrapEnum&#039;&#039;&#039;:&lt;br /&gt;
** CLAMP = 00 00 00 00&lt;br /&gt;
** REPEAT = 00 00 00 01&lt;br /&gt;
** MIRROR = 00 00 00 02&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Material&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 1 byte - AMB_R - (ambient)&lt;br /&gt;
* 1 byte - AMB_G&lt;br /&gt;
* 1 byte - AMB_B&lt;br /&gt;
* 1 byte - AMB_A&lt;br /&gt;
* 1 byte - DIF_R - (diffuse)&lt;br /&gt;
* 1 byte - DIF_G&lt;br /&gt;
* 1 byte - DIF_B&lt;br /&gt;
* 1 byte - DIF_A&lt;br /&gt;
* 1 byte - SPC_R - (specular)&lt;br /&gt;
* 1 byte - SPC_G&lt;br /&gt;
* 1 byte - SPC_B&lt;br /&gt;
* 1 byte - SPC_A&lt;br /&gt;
* 4 bytes - float - alpha&lt;br /&gt;
* 4 bytes - float - shininess&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 bytes - Inconnu&lt;br /&gt;
* 4 bytes - next_offset - pobj&lt;br /&gt;
* 4 bytes - vertex_attr_list_offset&lt;br /&gt;
* 2 bytes  - Flags - PObjFlagsEnum&lt;br /&gt;
* 2 bytes - display_list_size - number of 0x20 (32) byte blocks occupied by display list data&lt;br /&gt;
* 4 bytes - display_list_offset&lt;br /&gt;
*4 bytes - weight_list_offset - ? Verify that the envelope_weights array is indeed found at this offset.&lt;br /&gt;
&lt;br /&gt;
As indicated by next_offset, it is a list of meshes to be displayed for a given material referenced by a dobj. PObj contains the offsets of vertex attributes / display list / joint weight list, which is sufficient and allows interpreting and processing vertex, normal, and texture coordinates.&lt;br /&gt;
&lt;br /&gt;
Vertex attributes are the most important - the specified parameters control everything: from the format to the size of the data for each vertex, normal, and texture coordinates, and how these values are dimensioned (scaled) based on the presence and size of each index value appearing in the display list information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
Unknown0 = 00 01&lt;br /&gt;
Unknown1 = 00 02&lt;br /&gt;
** ANIM = 00 08&lt;br /&gt;
** SHAPE_ANIM = 10 00&lt;br /&gt;
** ENVELOPE = 20 00&lt;br /&gt;
** CULLBACK = 40 00&lt;br /&gt;
** CULLFRONT = 80 00&lt;br /&gt;
&lt;br /&gt;
=== EnvelopeWeights : (0x? octets) ===&lt;br /&gt;
* 4 bytes - envelope_count&lt;br /&gt;
* [envelope_count]:&lt;br /&gt;
** 4 bytes - float - weight&lt;br /&gt;
** 4 bytes - pad ?&lt;br /&gt;
* 4 bytes - jobj_list_offset&lt;br /&gt;
&lt;br /&gt;
=== not verified yet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IMAGE_HEADER&#039;&#039;&#039; :&lt;br /&gt;
** 4 bytes - image_offset - image data&lt;br /&gt;
** 2 bytes - width&lt;br /&gt;
** 2 bytes - height&lt;br /&gt;
** 4 bytes - image_format&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PALETTE_HEADER&#039;&#039;&#039; : (0x10 bytes)&lt;br /&gt;
** 4 bytes - palette_offset - palette data&lt;br /&gt;
** 4 bytes - palette_format&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 2 bytes - color_count&lt;br /&gt;
** 2 bytes - Unknown&lt;br /&gt;
The image_offset and palette_offset are often shared by several textures. Knowing this allows you to find all the information about the textures&#039; image data (width, height, format), as well as the format and the number of colors in the palette/TLUT.&lt;br /&gt;
&lt;br /&gt;
The image format does not determine the total number of colors in the palette it uses. For example, an 8-bit indexed image would have a maximum of 256 colors, but only 136 or 221 colors may be currently used. In this way, the palette will not use the total size it should use.&lt;br /&gt;
&lt;br /&gt;
Images follow the structure generally used by the GameCube:&lt;br /&gt;
&lt;br /&gt;
IMAGE FORMATS :&lt;br /&gt;
* case 0: //i4&lt;br /&gt;
* case 1: //i8&lt;br /&gt;
* case 2: //i4a4&lt;br /&gt;
* case 3: //i8a8&lt;br /&gt;
* case 4: //r5g6b5&lt;br /&gt;
* case 5: //rgb5a3&lt;br /&gt;
* case 6: //r8g8b8a8&lt;br /&gt;
* case 8: //index4&lt;br /&gt;
* case 9: //index8&lt;br /&gt;
* case 0xa: //index14x2&lt;br /&gt;
* case 0xe: //s3tc1&lt;br /&gt;
&lt;br /&gt;
The indexed formats also use palette/TLUT information, and the data can appear in various formats:&lt;br /&gt;
&lt;br /&gt;
PALETTE FORMATS :&lt;br /&gt;
* case 0: //ia8&lt;br /&gt;
* case 1: //r5g6b5&lt;br /&gt;
* case 2: //rgb5a3&lt;br /&gt;
&lt;br /&gt;
---&amp;gt; &amp;quot;Joint Data - Accessing Geometry, Mesh, and Vertex Attributes&amp;quot; https://smashboards.com/threads/melee-dat-format.292603/&lt;br /&gt;
&lt;br /&gt;
// Declaration of a vertex and attribute information&lt;br /&gt;
// attr, type, cnt, data_type, flags?, file_offset&lt;br /&gt;
* ATTR_DATA&lt;br /&gt;
** 4 bytes - GXAttr     vtx_attr_offset - attr&lt;br /&gt;
** 4 bytes - GXAttrType vtx_attr_type   - index_type&lt;br /&gt;
** 4 bytes - GXCompCnt  comp_cnt        - cnt&lt;br /&gt;
** 4 bytes - GXCompType comp_type       - data_type	&lt;br /&gt;
** 1 bytes - scale&lt;br /&gt;
** 1 bytes - unknown&lt;br /&gt;
** 2 bytes - vtx_stride&lt;br /&gt;
** 2 bytes - data_offset&lt;br /&gt;
&lt;br /&gt;
vertex_attr_offset points to a list of vertex attributes. The number of these attributes is not provided. The data in this structure follows the information and types designed by the GameCube/WII architecture and its API. The list is terminated by a specific value of vtx_attr signaling the end of this list. With access to the SDK documentation, it is strongly recommended to read the section about &amp;quot;vertex attributes and other specifications.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The value of vtx_attr determines the type of data that this attribute represents and can indicate a number of native types used for passing data between software and hardware interfaces.&lt;br /&gt;
&lt;br /&gt;
The possible values are as follows:&lt;br /&gt;
enum GXAttr (4 bytes)&lt;br /&gt;
** GX_VA_PNMTXIDX = 0, // position/normal matrix index&lt;br /&gt;
** GX_VA_TEX0MTXIDX, // texture 0 matrix index&lt;br /&gt;
** GX_VA_TEX1MTXIDX, // texture 1 matrix index&lt;br /&gt;
** GX_VA_TEX2MTXIDX, // texture 2 matrix index&lt;br /&gt;
** GX_VA_TEX3MTXIDX, // texture 3 matrix index&lt;br /&gt;
** GX_VA_TEX4MTXIDX, // texture 4 matrix index&lt;br /&gt;
** GX_VA_TEX5MTXIDX, // texture 5 matrix index&lt;br /&gt;
** GX_VA_TEX6MTXIDX, // texture 6 matrix index&lt;br /&gt;
** GX_VA_TEX7MTXIDX, // texture 7 matrix index&lt;br /&gt;
** GX_VA_POS = 9, // position&lt;br /&gt;
** GX_VA_NRM, // normal&lt;br /&gt;
** GX_VA_CLR0, // color 0&lt;br /&gt;
** GX_VA_CLR1, // color 1&lt;br /&gt;
** GX_VA_TEX0, // input texture coordinate 0&lt;br /&gt;
** GX_VA_TEX1, // input texture coordinate 1&lt;br /&gt;
** GX_VA_TEX2, // input texture coordinate 2&lt;br /&gt;
** GX_VA_TEX3, // input texture coordinate 3&lt;br /&gt;
** GX_VA_TEX4, // input texture coordinate 4&lt;br /&gt;
** GX_VA_TEX5, // input texture coordinate 5&lt;br /&gt;
** GX_VA_TEX6, // input texture coordinate 6&lt;br /&gt;
** GX_VA_TEX7, // input texture coordinate 7&lt;br /&gt;
&lt;br /&gt;
** GX_POS_MTX_ARRAY, // position matrix array pointer&lt;br /&gt;
** GX_NRM_MTX_ARRAY, // normal matrix array pointer&lt;br /&gt;
** GX_TEX_MTX_ARRAY, // texture matrix array pointer&lt;br /&gt;
** GX_LIGHT_ARRAY, // light parameter array pointer&lt;br /&gt;
** GX_VA_NBT, // normal, bi-normal, tangent&lt;br /&gt;
** GX_VA_MAX_ATTR, // maximum number of vertex attributes&lt;br /&gt;
&lt;br /&gt;
** GX_VA_NULL = 0xff // NULL attribute (to mark the end of lists)&lt;br /&gt;
&lt;br /&gt;
All the necessary data to represent a mesh can be specified and indexed in one way or another. Similarly, GX_VA_TEX0MTXIDX, GX_VA_CLR0, and others are also possible - the most frequent values in the SSBM data are: GX_VA_PNMTXIDX, GX_VA_POS, GX_VA_NRM, and GX_VA_TEX0. This is to be expected as joint matrices, vertex positions/normals, and texture coordinates respectively are probably the most basic elements needed to display a textured mesh, whether static or animated.&lt;br /&gt;
&lt;br /&gt;
When the value of vtx_attr == GX_VA_NULL (0xFF), the end of the vertex attribute array has been reached.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The vtx_attr_type values is actually associated with how the value is indexed, and can thus also determine the size of the index value within the display list data.&lt;br /&gt;
&lt;br /&gt;
* 4 bytes - enum GXAttrType&lt;br /&gt;
** GX_NONE    = 0,&lt;br /&gt;
** GX_DIRECT,&lt;br /&gt;
** GX_INDEX8,&lt;br /&gt;
** GX_INDEX16&lt;br /&gt;
&lt;br /&gt;
* Structures COLL_DATA : (collision data)&lt;br /&gt;
** 4 bytes - vertex_offset (2 floats per entry corresponding to probably 2D data)&lt;br /&gt;
** 4 bytes - vertex_count&lt;br /&gt;
** 4 bytes - index_offset&lt;br /&gt;
** 4 bytes - index_count&lt;br /&gt;
** 4 bytes [5] - Unknown&lt;br /&gt;
*** 2 bytes - index_start&lt;br /&gt;
*** 2 bytes - index_count&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1538</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1538"/>
		<updated>2023-12-29T07:09:59Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: /* PObj : (0x18 octets) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
{{Research | 2| Researches on headers / bodies structures are partially achieved. }}&lt;br /&gt;
&lt;br /&gt;
== Gotcha Force Models ==&lt;br /&gt;
&lt;br /&gt;
Gotcha Force models work as those from the game Super Smash Bros Melee (SSBM) investigated by its [https://smashboards.com/threads/melee-dat-format.292603/ community].&lt;br /&gt;
&lt;br /&gt;
A model is a file format that organizes objects and resources serialized to be used by the &#039;&#039;&#039;H&#039;&#039;&#039;al &#039;&#039;&#039;S&#039;&#039;&#039;ys&#039;&#039;&#039;D&#039;&#039;&#039;olphin (&#039;&#039;&#039;HSD&#039;&#039;&#039;) library. The HSD library is used in several Capcom games. These are graphic materials structured in a hierarchical way. Some pictures present in the models seem to indicate the use of [https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/matcap.html matcap] technic. This library uses Dolphin SDK functions like GX / MTX and so on.&lt;br /&gt;
&lt;br /&gt;
=== Affected files ===&lt;br /&gt;
All files in the AFS having &#039;&#039;&#039;_mdl&#039;&#039;&#039; in their names are models described in this page. We notice also [[ARZ (Gotcha Force)|.arz]] which are compressed models. collision.arc and tdc00.arc to tdc09.arc are also models.&lt;br /&gt;
&lt;br /&gt;
Model files are also found in the borgs&#039; pzz (plxxxx.pzz) at positions 004 to 009.&lt;br /&gt;
&lt;br /&gt;
=== HSDRaw ===&lt;br /&gt;
HSDRaw, a dotnet 3D editor for this format, is unstable on my Windows (algoflash). However, it has been proven that editing the _mdl starting at offset 0x100 - after the preamble - allows visualizing the file on HSDRaw and obtaining the 3D rendering of the Borg (click on the first JOBJ folder - then the JOBJ inside and double-click on the violet node). This should also allow editing certain properties?&lt;br /&gt;
&lt;br /&gt;
== General Structure ==&lt;br /&gt;
The model format is divided into several blocks. The preamble is 0x100 bytes at the very beginning of the file. It is often absent. All values are in unsigned big endian, and the pad is in Null bytes (\x00). Offsets found after the beginning of the Data Block (DB) are relative to the beginning of the DB. The relocation table is an array of 4-byte offsets (relative to the DB) used to translate the offsets of structures into absolute addressing during memory loading. The relocation table, for example, helps delimit the structures because it is unlikely that an offset points in the middle of a structure.&lt;br /&gt;
&lt;br /&gt;
All files following this format have a single root_node of type SObj (Scene data).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Preamble&#039;&#039;&#039;: (0x100 bytes / 0 bytes) ===&lt;br /&gt;
* 4 bytes - hsd_header_offset=0x100 (always)&lt;br /&gt;
* 4 bytes - bones_flags_table_offset=0x20 (always) - offset of the skeleton flags list&lt;br /&gt;
* 4 bytes - bones_table_offset=0xC0 (always) - offset of the skeleton list&lt;br /&gt;
* 20 bytes - Pad - (always)&lt;br /&gt;
* 4 bytes [32] - Unknown (skeleton flags?) 1 byte per flag?&lt;br /&gt;
* 32 bytes - Pad - (always)&lt;br /&gt;
* 32 bytes - skeletons?&lt;br /&gt;
* 32 bytes - Pad - (always)&lt;br /&gt;
=== &#039;&#039;&#039;HSD Header&#039;&#039;&#039; - (0x20 bytes) ===&lt;br /&gt;
* 4 bytes - Total file size&lt;br /&gt;
* 4 bytes - Data block size&lt;br /&gt;
* 4 bytes - Number of entries in the Relocation Table&lt;br /&gt;
* 4 bytes - root0_count&lt;br /&gt;
* 4 bytes - root1_count&lt;br /&gt;
* 12 bytes - Pad - (always)&lt;br /&gt;
=== &#039;&#039;&#039;Data block&#039;&#039;&#039;: ===&lt;br /&gt;
* JOBJ, etc. -&amp;gt; These structures are detailed below.&lt;br /&gt;
=== &#039;&#039;&#039;Relocation Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of 4-byte offsets - Offsets of structures in the DB.&lt;br /&gt;
=== &#039;&#039;&#039;Root Nodes (2)&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of size 8 * root0_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
* Array of size 8 * root1_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
=== &#039;&#039;&#039;String Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Series of strings terminated by Null, the number of root0_count + root1_count&lt;br /&gt;
&lt;br /&gt;
== Structures encountered in the DB ==&lt;br /&gt;
Note: The hierarchy is cumulative on transformations for parent-&amp;gt;child relationships&lt;br /&gt;
&lt;br /&gt;
Root Nodes with the name &amp;quot;scene_data&amp;quot; point to an SObj:&lt;br /&gt;
=== &#039;&#039;&#039;SObj&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - JObjDescs_offsets_list_offset&lt;br /&gt;
* 4 bytes - Cameras_list_offset&lt;br /&gt;
* 4 bytes - Lights_list_offset&lt;br /&gt;
* 4 bytes - Fog&lt;br /&gt;
&lt;br /&gt;
&amp;quot;scene_data&amp;quot; == name of the root node&lt;br /&gt;
JObjDescs_offsets_list_offset, cameras... point to a list of offsets terminated by 4 bytes at 0x00.&lt;br /&gt;
lights_list_offset points to pairs (4 bytes - LObj_offset; 4 bytes - light_anim_pointer_offset)&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObjDesc&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - root_joint_offset - JObj&lt;br /&gt;
* 4 bytes - joint_animations_offset - ?&lt;br /&gt;
* 4 bytes - material_animations_offset - ?&lt;br /&gt;
* 4 bytes - shape_animations_offset - ?&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CObj&#039;&#039;&#039;: (0x38 bytes) ===&lt;br /&gt;
* 4 bytes - flags&lt;br /&gt;
* 4 bytes - projection_type - ProjectionTypeEnum&lt;br /&gt;
* 2 bytes - viewport_left&lt;br /&gt;
* 2 bytes - viewport_right&lt;br /&gt;
* 2 bytes - viewport_top&lt;br /&gt;
* 2 bytes - viewport_bottom&lt;br /&gt;
* 4 bytes - proj_width&lt;br /&gt;
* 4 bytes - proj_height&lt;br /&gt;
* 4 bytes - eye_offset - WObj&lt;br /&gt;
* 4 bytes - target_offset - WObj&lt;br /&gt;
* 4 bytes - roll&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - near_clip&lt;br /&gt;
* 4 bytes - float - far_clip&lt;br /&gt;
* 4 bytes - float - field_of_view&lt;br /&gt;
* 4 bytes - float - aspect&lt;br /&gt;
Camera object. Note: for frustrum or ortho, the structure is different.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ProjectionTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** PERSPECTIVE = 1&lt;br /&gt;
** FRUSTRUM = 2&lt;br /&gt;
** ORTHO = 3&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;WObj&#039;&#039;&#039;: (0x14 bytes) ===&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - v1&lt;br /&gt;
* 4 bytes - float - v2&lt;br /&gt;
* 4 bytes - float - v3&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
eye / target&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObj&#039;&#039;&#039;: (0x1c bytes) ===&lt;br /&gt;
* 4 bytes - class_name&lt;br /&gt;
* 4 bytes - next_offset&lt;br /&gt;
* 2 bytes - flags - LObjFlagsEnum&lt;br /&gt;
* 2 bytes - attenuation_flags - LObjAttenuationFlagsEnum&lt;br /&gt;
* 1 byte - color_r&lt;br /&gt;
* 1 byte - color_g&lt;br /&gt;
* 1 byte - color_b&lt;br /&gt;
* 1 byte - color_alpha&lt;br /&gt;
* 4 bytes - lobj_point_offset - position&lt;br /&gt;
* 4 bytes - infinite_data&lt;br /&gt;
* 4 bytes - point_spot_data&lt;br /&gt;
light&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_AMBIANT = 00 00&lt;br /&gt;
** LOBJ_INFINITE = 00 01&lt;br /&gt;
** LOBJ_POINT = 00 02&lt;br /&gt;
** LOBJ_SPOT = 00 03&lt;br /&gt;
** LOBJ_DIFFUSE = 00 04&lt;br /&gt;
** LOBJ_SPECULAR = 00 08&lt;br /&gt;
** LOBJ_ALPHA = 00 10&lt;br /&gt;
** LOBJ_HIDDEN = 00 20&lt;br /&gt;
** LOBJ_RAW_PARAM = 00 40&lt;br /&gt;
** LOBJ_DIFF_DIRTY = 00 80&lt;br /&gt;
** LOBJ_SPEC_DIRTY = 01 00&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjAttenuationFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_LIGHT_ATTN_NONE = 00 00&lt;br /&gt;
** LOBJ_LIGHT_ATTN = 00 01&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObjPoint&#039;&#039;&#039; : (0x14 bytes) ===&lt;br /&gt;
4 bytes - class_name&lt;br /&gt;
4 bytes - float - x&lt;br /&gt;
4 bytes - float - y&lt;br /&gt;
4 bytes - float - z&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
=== &#039;&#039;&#039;LightAnimPointer&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
** 4 bytes - next_offset - (LightAnimPointer)&lt;br /&gt;
** 4 bytes - light_anim - ?&lt;br /&gt;
** 4 bytes - position_anim - ?&lt;br /&gt;
** 4 bytes - interst_anim - ?&lt;br /&gt;
Bugs in HSDRaw - to be tested&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObj&#039;&#039;&#039; : (0x40 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - flags&lt;br /&gt;
4 bytes - child_offset (JObj)&lt;br /&gt;
4 bytes - next_offset (JObj)&lt;br /&gt;
4 bytes - dobj_offset (DObj)&lt;br /&gt;
4 bytes [3] - float3 - rotation_xyz&lt;br /&gt;
4 bytes [3] - float3 - scale_xyz&lt;br /&gt;
4 bytes [3] - float3 - translation_xyz&lt;br /&gt;
4 bytes - inverse_world_transform_offset (inverse world transform = 4x3 matrix)&lt;br /&gt;
4 bytes - robj_offset&lt;br /&gt;
Pointed by the lists in Root Node scene_data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JObjFlagsEnum&#039;&#039;&#039; : (can be cumulative)&lt;br /&gt;
** NULL = 00 00 00 00&lt;br /&gt;
** SKELETON = 00 00 00 01&lt;br /&gt;
** SKELETON_ROOT = 00 00 00 02&lt;br /&gt;
** ENVELOPE_MODEL = 00 00 00 04&lt;br /&gt;
** CLASSICAL_SCALING = 00 00 00 08&lt;br /&gt;
** HIDDEN = 00 00 00 10&lt;br /&gt;
** PTCL = 00 00 00 20&lt;br /&gt;
** MTX_DIRTY = 00 00 00 40&lt;br /&gt;
** LIGHTING = 00 00 00 80&lt;br /&gt;
** TEXGEN = 00 00 01 00&lt;br /&gt;
** BILLBOARD = 00 00 02 00&lt;br /&gt;
** VBILLBOARD = 00 00 04 00&lt;br /&gt;
** HBILLBOARD = 00 00 06 00&lt;br /&gt;
** RBILLBOARD = 00 00 08 00&lt;br /&gt;
** INSTANCE = 00 00 10 00&lt;br /&gt;
** PBILLBOARD = 00 00 20 00&lt;br /&gt;
** SPLINE = 00 00 40 00&lt;br /&gt;
** FLIP_IK = 00 00 80 00&lt;br /&gt;
** SPECULAR = 00 01 00 00&lt;br /&gt;
** USE_QUATERNION = 00 02 00 00&lt;br /&gt;
** OPA = 00 04 00 00&lt;br /&gt;
** XLU = 00 08 00 00&lt;br /&gt;
** TEXEDGE = 00 10 00 00&lt;br /&gt;
** JOINT1 = 00 20 00 00&lt;br /&gt;
** JOINT2 = 00 40 00 00&lt;br /&gt;
** EFFECTOR = 00 60 00 00&lt;br /&gt;
** USER_DEFINED_MTX = 00 80 00 00&lt;br /&gt;
** MTX_INDEPEND_PARENT = 01 00 00 00&lt;br /&gt;
** MTX_INDEPEND_SRT = 02 00 00 00&lt;br /&gt;
** MTX_SCALE_COMPENSATE = 04 00 00 00&lt;br /&gt;
** ROOT_OPA = 10 00 00 00&lt;br /&gt;
** ROOT_XLU = 20 00 00 00&lt;br /&gt;
** ROOT_TEXEDGE = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;InverseWorldTransform&#039;&#039;&#039; : (0x30 bytes) ===&lt;br /&gt;
4 bytes - float - M11&lt;br /&gt;
4 bytes - float - M12&lt;br /&gt;
4 bytes - float - M13&lt;br /&gt;
4 bytes - float - M14&lt;br /&gt;
4 bytes - float - M21&lt;br /&gt;
4 bytes - float - M22&lt;br /&gt;
4 bytes - float - M23&lt;br /&gt;
4 bytes - float - M24&lt;br /&gt;
4 bytes - float - M31&lt;br /&gt;
4 bytes - float - M32&lt;br /&gt;
4 bytes - float - M33&lt;br /&gt;
4 bytes - float - M34&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;DObj&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - next_offset - next DOBJ&lt;br /&gt;
4 bytes - mobj_offset - material offset&lt;br /&gt;
4 bytes - pobj_offset - mesh offset&lt;br /&gt;
Linked list that allows retrieving all materials &amp;amp; meshes for the associated JObj.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;MObj&#039;&#039;&#039; : (0x18 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - render_flags - RenderFlagsEnum&lt;br /&gt;
4 bytes - tobj_offset - texture offset - may be invalid if there is no texture for the material&lt;br /&gt;
4 bytes - material_offset - material colors?&lt;br /&gt;
8 bytes - PEDesc?&lt;br /&gt;
Contains textures &amp;amp; information about material colors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RenderFlagsEnum&#039;&#039;&#039; : (cumulative)&lt;br /&gt;
** USER = 80 00 00 00&lt;br /&gt;
** CONSTANT = 00 00 00 01&lt;br /&gt;
** VERTEX = 00 00 00 02&lt;br /&gt;
** BOTH = 00 00 00 03&lt;br /&gt;
** DIFFUSE = 00 00 00 04&lt;br /&gt;
** SPECULAR = 00 00 00 08&lt;br /&gt;
** TEX0 = 00 00 00 10&lt;br /&gt;
** TEX1 = 00 00 00 20&lt;br /&gt;
** TEX2 = 00 00 00 40&lt;br /&gt;
** TEX3 = 00 00 00 80&lt;br /&gt;
** TEX4 = 00 00 01 00&lt;br /&gt;
** TEX5 = 00 00 02 00&lt;br /&gt;
** TEX6 = 00 00 04 00&lt;br /&gt;
** TEX7 = 00 00 08 00&lt;br /&gt;
** TOON = 00 00 10 00&lt;br /&gt;
** ALPHA_MAT = 00 00 20 00&lt;br /&gt;
** ALPHA_VTX = 00 00 40 00&lt;br /&gt;
** ALPHA_BOTH = 00 00 60 00&lt;br /&gt;
** ZOFST = 01 00 00 00&lt;br /&gt;
** EFFECT = 02 00 00 00&lt;br /&gt;
** SHADOW = 04 00 00 00&lt;br /&gt;
** ZMODE_ALWAYS = 08 00 00 00&lt;br /&gt;
** DF_ALL = 10 00 00 00&lt;br /&gt;
** NO_ZUPDATE = 20 00 00 00&lt;br /&gt;
** XLU = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;TObj&#039;&#039;&#039; : (0x5c octets) ===&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - tex_map_id - TexMapIdEnum&lt;br /&gt;
* 4 bytes - gx_tex_gen_src - GXTexGenSrcEnum&lt;br /&gt;
* 4 bytes - float - rx&lt;br /&gt;
* 4 bytes - float - ry&lt;br /&gt;
* 4 bytes - float - rz&lt;br /&gt;
* 4 bytes - float - sx&lt;br /&gt;
* 4 bytes - float - sy&lt;br /&gt;
* 4 bytes - float - sz&lt;br /&gt;
* 4 bytes - float - tx&lt;br /&gt;
* 4 bytes - float - ty&lt;br /&gt;
* 4 bytes - float - tz&lt;br /&gt;
* 4 bytes - wrap_s - WrapEnum&lt;br /&gt;
* 4 bytes - wrap_t - WrapEnum&lt;br /&gt;
* 1 byte- w_scale&lt;br /&gt;
* 1 byte- h_scale&lt;br /&gt;
* 2 bytes - ?&lt;br /&gt;
1 byte - bump_map - (False = 00 ; True = 01)&lt;br /&gt;
4 bits - alpha_operation - AlphaOperationEnum&lt;br /&gt;
4 bits - color_operation - ColorOperationEnum&lt;br /&gt;
1 byte - shadow_lightmap - (False = 00 ; True = 01) (2 bytes with a lightmap limit Enum)&lt;br /&gt;
1 bit - ext_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - ambient_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - specular_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - diffuse_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
4 bits - coord_type - CoordTypeEnum&lt;br /&gt;
4 bytes - float - blending - used when color_operation or alpha_operation == BLEND&lt;br /&gt;
4 bytes - mag_filter - MagFilterEnum&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
Texture Information: The TObj contains information about texture environment parameters used for graphic rendering, as well as the offsets of the image and palette data used for this texture. The most important aspects here are the image offset and the palette/TLUT (Texture Look-Up Table) - if the image is not indexed (RGBA, CMPR, etc.), then the palette/TLUT description structure is not used.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TexMapIdEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TEXMAP0 = 00 00 00 00&lt;br /&gt;
** GX_TEXMAP1 = 00 00 00 01&lt;br /&gt;
** GX_TEXMAP2 = 00 00 00 02&lt;br /&gt;
** GX_TEXMAP3 = 00 00 00 03&lt;br /&gt;
** GX_TEXMAP4 = 00 00 00 04&lt;br /&gt;
** GX_TEXMAP5 = 00 00 00 05&lt;br /&gt;
** GX_TEXMAP6 = 00 00 00 06&lt;br /&gt;
** GX_TEXMAP7 = 00 00 00 07&lt;br /&gt;
** GX_MAX_TEXMAP = 00 00 00 08&lt;br /&gt;
** GX_TEXMAP_NULL = 00 00 00 09&lt;br /&gt;
** GX_TEXMAP_DISABLE = 00 00 00 0A&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GXTexGenSrcEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TG_POS = 00 00 00 00&lt;br /&gt;
** GX_TG_NRM = 00 00 00 01&lt;br /&gt;
** GX_TG_BINRM = 00 00 00 02&lt;br /&gt;
** GX_TG_TANGENT = 00 00 00 03&lt;br /&gt;
** GX_TG_TEX0 = 00 00 00 04&lt;br /&gt;
** GX_TG_TEX1 = 00 00 00 05&lt;br /&gt;
** GX_TG_TEX2 = 00 00 00 06&lt;br /&gt;
** GX_TG_TEX3 = 00 00 00 07&lt;br /&gt;
** GX_TG_TEX4 = 00 00 00 08&lt;br /&gt;
** GX_TG_TEX5 = 00 00 00 09&lt;br /&gt;
** GX_TG_TEX6 = 00 00 00 0A&lt;br /&gt;
** GX_TG_TEX7 = 00 00 00 0B&lt;br /&gt;
** GX_TG_TEXCOORD0 = 00 00 00 0C&lt;br /&gt;
** GX_TG_TEXCOORD1 = 00 00 00 0D&lt;br /&gt;
** GX_TG_TEXCOORD2 = 00 00 00 0E&lt;br /&gt;
** GX_TG_TEXCOORD3 = 00 00 00 0F&lt;br /&gt;
** GX_TG_TEXCOORD4 = 00 00 00 10&lt;br /&gt;
** GX_TG_TEXCOORD5 = 00 00 00 11&lt;br /&gt;
** GX_TG_TEXCOORD6 = 00 00 00 12&lt;br /&gt;
** GX_TG_COLOR0 = 00 00 00 13&lt;br /&gt;
** GX_TG_COLOR1 = 00 00 00 14&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AlphaOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = 0X&lt;br /&gt;
** ALPHAMASK = 1X&lt;br /&gt;
** BLEND = 2X&lt;br /&gt;
** MODULATE = 3X&lt;br /&gt;
** REPLACE = 4X&lt;br /&gt;
** PASS = 5X&lt;br /&gt;
** ADD = 6X&lt;br /&gt;
** SUB = 7X&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ColorOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = X0&lt;br /&gt;
** ALPHA_MASK = X1&lt;br /&gt;
** RGB_MASK = X2&lt;br /&gt;
** BLEND = X3&lt;br /&gt;
** MODULATE = X4&lt;br /&gt;
** REPLACE = X5&lt;br /&gt;
** PASS = X6&lt;br /&gt;
** ADD = X7&lt;br /&gt;
** SUB = X8&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CoordTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** UV = X0&lt;br /&gt;
** REFLECTION = X1&lt;br /&gt;
** HILIGHT = X2&lt;br /&gt;
** SHADOW = X3&lt;br /&gt;
** TOON = X4&lt;br /&gt;
** GRADATION = X5&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MagFilterEnum&#039;&#039;&#039;:&lt;br /&gt;
** GX_NEAR = 00 00 00 00&lt;br /&gt;
** GX_LINEAR = 00 00 00 01&lt;br /&gt;
** GX_NEAR_MIP_NEAR = 00 00 00 02&lt;br /&gt;
** GX_LIN_MIP_NEAR = 00 00 00 03&lt;br /&gt;
** GX_NEAR_MIP_LIN = 00 00 00 04&lt;br /&gt;
** GX_LIN_MIP_LIN = 00 00 00 05&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WrapEnum&#039;&#039;&#039;:&lt;br /&gt;
** CLAMP = 00 00 00 00&lt;br /&gt;
** REPEAT = 00 00 00 01&lt;br /&gt;
** MIRROR = 00 00 00 02&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Material&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 1 byte - AMB_R - (ambient)&lt;br /&gt;
* 1 byte - AMB_G&lt;br /&gt;
* 1 byte - AMB_B&lt;br /&gt;
* 1 byte - AMB_A&lt;br /&gt;
* 1 byte - DIF_R - (diffuse)&lt;br /&gt;
* 1 byte - DIF_G&lt;br /&gt;
* 1 byte - DIF_B&lt;br /&gt;
* 1 byte - DIF_A&lt;br /&gt;
* 1 byte - SPC_R - (specular)&lt;br /&gt;
* 1 byte - SPC_G&lt;br /&gt;
* 1 byte - SPC_B&lt;br /&gt;
* 1 byte - SPC_A&lt;br /&gt;
* 4 bytes - float - alpha&lt;br /&gt;
* 4 bytes - float - shininess&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 bytes - Inconnu&lt;br /&gt;
* 4 bytes - next_offset - pobj&lt;br /&gt;
* 4 bytes - vertex_attr_list_offset&lt;br /&gt;
* 2 bytes  - Flags - PObjFlagsEnum&lt;br /&gt;
* 2 bytes - display_list_size - number of 0x20 (32) byte blocks occupied by display list data&lt;br /&gt;
* 4 bytes - display_list_offset&lt;br /&gt;
*4 bytes - weight_list_offset - ? Verify that the envelope_weights array is indeed found at this offset.&lt;br /&gt;
&lt;br /&gt;
As indicated by next_offset, it is a list of meshes to be displayed for a given material referenced by a dobj. PObj contains the offsets of vertex attributes / display list / joint weight list, which is sufficient and allows interpreting and processing vertex, normal, and texture coordinates.&lt;br /&gt;
&lt;br /&gt;
Vertex attributes are the most important - the specified parameters control everything: from the format to the size of the data for each vertex, normal, and texture coordinates, and how these values are dimensioned (scaled) based on the presence and size of each index value appearing in the display list information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
Unknown0 = 00 01&lt;br /&gt;
Unknown1 = 00 02&lt;br /&gt;
** ANIM = 00 08&lt;br /&gt;
** SHAPE_ANIM = 10 00&lt;br /&gt;
** ENVELOPE = 20 00&lt;br /&gt;
** CULLBACK = 40 00&lt;br /&gt;
** CULLFRONT = 80 00&lt;br /&gt;
&lt;br /&gt;
=== EnvelopeWeights : (0x? octets) ===&lt;br /&gt;
* 4 bytes - envelope_count&lt;br /&gt;
* [envelope_count]:&lt;br /&gt;
** 4 bytes - float - weight&lt;br /&gt;
** 4 bytes - pad ?&lt;br /&gt;
* 4 bytes - jobj_list_offset&lt;br /&gt;
&lt;br /&gt;
=== not verified yet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IMAGE_HEADER&#039;&#039;&#039; :&lt;br /&gt;
** 4 bytes - image_offset - image data&lt;br /&gt;
** 2 bytes - width&lt;br /&gt;
** 2 bytes - height&lt;br /&gt;
** 4 bytes - image_format&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PALETTE_HEADER&#039;&#039;&#039; : (0x10 bytes)&lt;br /&gt;
** 4 bytes - palette_offset - palette data&lt;br /&gt;
** 4 bytes - palette_format&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 2 bytes - color_count&lt;br /&gt;
** 2 bytes - Unknown&lt;br /&gt;
The image_offset and palette_offset are often shared by several textures. Knowing this allows you to find all the information about the textures&#039; image data (width, height, format), as well as the format and the number of colors in the palette/TLUT.&lt;br /&gt;
&lt;br /&gt;
The image format does not determine the total number of colors in the palette it uses. For example, an 8-bit indexed image would have a maximum of 256 colors, but only 136 or 221 colors may be currently used. In this way, the palette will not use the total size it should use.&lt;br /&gt;
&lt;br /&gt;
Images follow the structure generally used by the GameCube:&lt;br /&gt;
&lt;br /&gt;
IMAGE FORMATS :&lt;br /&gt;
* case 0: //i4&lt;br /&gt;
* case 1: //i8&lt;br /&gt;
* case 2: //i4a4&lt;br /&gt;
* case 3: //i8a8&lt;br /&gt;
* case 4: //r5g6b5&lt;br /&gt;
* case 5: //rgb5a3&lt;br /&gt;
* case 6: //r8g8b8a8&lt;br /&gt;
* case 8: //index4&lt;br /&gt;
* case 9: //index8&lt;br /&gt;
* case 0xa: //index14x2&lt;br /&gt;
* case 0xe: //s3tc1&lt;br /&gt;
&lt;br /&gt;
The indexed formats also use palette/TLUT information, and the data can appear in various formats:&lt;br /&gt;
&lt;br /&gt;
PALETTE FORMATS :&lt;br /&gt;
* case 0: //ia8&lt;br /&gt;
* case 1: //r5g6b5&lt;br /&gt;
* case 2: //rgb5a3&lt;br /&gt;
&lt;br /&gt;
---&amp;gt; &amp;quot;Joint Data - Accessing Geometry, Mesh, and Vertex Attributes&amp;quot; https://smashboards.com/threads/melee-dat-format.292603/&lt;br /&gt;
&lt;br /&gt;
// Declaration of a vertex and attribute information&lt;br /&gt;
// attr, type, cnt, data_type, flags?, file_offset&lt;br /&gt;
* ATTR_DATA&lt;br /&gt;
** 4 bytes - GXAttr     vtx_attr_offset - attr&lt;br /&gt;
** 4 bytes - GXAttrType vtx_attr_type   - index_type&lt;br /&gt;
** 4 bytes - GXCompCnt  comp_cnt        - cnt&lt;br /&gt;
** 4 bytes - GXCompType comp_type       - data_type	&lt;br /&gt;
** 1 bytes - scale&lt;br /&gt;
** 1 bytes - unknown&lt;br /&gt;
** 2 bytes - vtx_stride&lt;br /&gt;
** 2 bytes - data_offset&lt;br /&gt;
&lt;br /&gt;
vertex_attr_offset points to a list of vertex attributes. The number of these attributes is not provided. The data in this structure follows the information and types designed by the GameCube/WII architecture and its API. The list is terminated by a specific value of vtx_attr signaling the end of this list. With access to the SDK documentation, it is strongly recommended to read the section about &amp;quot;vertex attributes and other specifications.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The value of vtx_attr determines the type of data that this attribute represents and can indicate a number of native types used for passing data between software and hardware interfaces.&lt;br /&gt;
&lt;br /&gt;
The possible values are as follows:&lt;br /&gt;
enum GXAttr (4 bytes)&lt;br /&gt;
** GX_VA_PNMTXIDX = 0, // position/normal matrix index&lt;br /&gt;
** GX_VA_TEX0MTXIDX, // texture 0 matrix index&lt;br /&gt;
** GX_VA_TEX1MTXIDX, // texture 1 matrix index&lt;br /&gt;
** GX_VA_TEX2MTXIDX, // texture 2 matrix index&lt;br /&gt;
** GX_VA_TEX3MTXIDX, // texture 3 matrix index&lt;br /&gt;
** GX_VA_TEX4MTXIDX, // texture 4 matrix index&lt;br /&gt;
** GX_VA_TEX5MTXIDX, // texture 5 matrix index&lt;br /&gt;
** GX_VA_TEX6MTXIDX, // texture 6 matrix index&lt;br /&gt;
** GX_VA_TEX7MTXIDX, // texture 7 matrix index&lt;br /&gt;
** GX_VA_POS = 9, // position&lt;br /&gt;
** GX_VA_NRM, // normal&lt;br /&gt;
** GX_VA_CLR0, // color 0&lt;br /&gt;
** GX_VA_CLR1, // color 1&lt;br /&gt;
** GX_VA_TEX0, // input texture coordinate 0&lt;br /&gt;
** GX_VA_TEX1, // input texture coordinate 1&lt;br /&gt;
** GX_VA_TEX2, // input texture coordinate 2&lt;br /&gt;
** GX_VA_TEX3, // input texture coordinate 3&lt;br /&gt;
** GX_VA_TEX4, // input texture coordinate 4&lt;br /&gt;
** GX_VA_TEX5, // input texture coordinate 5&lt;br /&gt;
** GX_VA_TEX6, // input texture coordinate 6&lt;br /&gt;
** GX_VA_TEX7, // input texture coordinate 7&lt;br /&gt;
&lt;br /&gt;
** GX_POS_MTX_ARRAY, // position matrix array pointer&lt;br /&gt;
** GX_NRM_MTX_ARRAY, // normal matrix array pointer&lt;br /&gt;
** GX_TEX_MTX_ARRAY, // texture matrix array pointer&lt;br /&gt;
** GX_LIGHT_ARRAY, // light parameter array pointer&lt;br /&gt;
** GX_VA_NBT, // normal, bi-normal, tangent&lt;br /&gt;
** GX_VA_MAX_ATTR, // maximum number of vertex attributes&lt;br /&gt;
&lt;br /&gt;
** GX_VA_NULL = 0xff // NULL attribute (to mark the end of lists)&lt;br /&gt;
&lt;br /&gt;
All the necessary data to represent a mesh can be specified and indexed in one way or another. Similarly, GX_VA_TEX0MTXIDX, GX_VA_CLR0, and others are also possible - the most frequent values in the SSBM data are: GX_VA_PNMTXIDX, GX_VA_POS, GX_VA_NRM, and GX_VA_TEX0. This is to be expected as joint matrices, vertex positions/normals, and texture coordinates respectively are probably the most basic elements needed to display a textured mesh, whether static or animated.&lt;br /&gt;
&lt;br /&gt;
When the value of vtx_attr == GX_VA_NULL (0xFF), the end of the vertex attribute array has been reached.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The vtx_attr_type values is actually associated with how the value is indexed, and can thus also determine the size of the index value within the display list data.&lt;br /&gt;
&lt;br /&gt;
* 4 bytes - enum GXAttrType&lt;br /&gt;
** GX_NONE    = 0,&lt;br /&gt;
** GX_DIRECT,&lt;br /&gt;
** GX_INDEX8,&lt;br /&gt;
** GX_INDEX16&lt;br /&gt;
&lt;br /&gt;
* Structures COLL_DATA : (collision data)&lt;br /&gt;
** 4 bytes - vertex_offset (2 floats per entry corresponding to probably 2D data)&lt;br /&gt;
** 4 bytes - vertex_count&lt;br /&gt;
** 4 bytes - index_offset&lt;br /&gt;
** 4 bytes - index_count&lt;br /&gt;
** 4 bytes [5] - Unknown&lt;br /&gt;
*** 2 bytes - index_start&lt;br /&gt;
*** 2 bytes - index_count&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1537</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1537"/>
		<updated>2023-12-29T07:09:51Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: /* PObj : (0x18 octets) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
{{Research | 2| Researches on headers / bodies structures are partially achieved. }}&lt;br /&gt;
&lt;br /&gt;
== Gotcha Force Models ==&lt;br /&gt;
&lt;br /&gt;
Gotcha Force models work as those from the game Super Smash Bros Melee (SSBM) investigated by its [https://smashboards.com/threads/melee-dat-format.292603/ community].&lt;br /&gt;
&lt;br /&gt;
A model is a file format that organizes objects and resources serialized to be used by the &#039;&#039;&#039;H&#039;&#039;&#039;al &#039;&#039;&#039;S&#039;&#039;&#039;ys&#039;&#039;&#039;D&#039;&#039;&#039;olphin (&#039;&#039;&#039;HSD&#039;&#039;&#039;) library. The HSD library is used in several Capcom games. These are graphic materials structured in a hierarchical way. Some pictures present in the models seem to indicate the use of [https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/matcap.html matcap] technic. This library uses Dolphin SDK functions like GX / MTX and so on.&lt;br /&gt;
&lt;br /&gt;
=== Affected files ===&lt;br /&gt;
All files in the AFS having &#039;&#039;&#039;_mdl&#039;&#039;&#039; in their names are models described in this page. We notice also [[ARZ (Gotcha Force)|.arz]] which are compressed models. collision.arc and tdc00.arc to tdc09.arc are also models.&lt;br /&gt;
&lt;br /&gt;
Model files are also found in the borgs&#039; pzz (plxxxx.pzz) at positions 004 to 009.&lt;br /&gt;
&lt;br /&gt;
=== HSDRaw ===&lt;br /&gt;
HSDRaw, a dotnet 3D editor for this format, is unstable on my Windows (algoflash). However, it has been proven that editing the _mdl starting at offset 0x100 - after the preamble - allows visualizing the file on HSDRaw and obtaining the 3D rendering of the Borg (click on the first JOBJ folder - then the JOBJ inside and double-click on the violet node). This should also allow editing certain properties?&lt;br /&gt;
&lt;br /&gt;
== General Structure ==&lt;br /&gt;
The model format is divided into several blocks. The preamble is 0x100 bytes at the very beginning of the file. It is often absent. All values are in unsigned big endian, and the pad is in Null bytes (\x00). Offsets found after the beginning of the Data Block (DB) are relative to the beginning of the DB. The relocation table is an array of 4-byte offsets (relative to the DB) used to translate the offsets of structures into absolute addressing during memory loading. The relocation table, for example, helps delimit the structures because it is unlikely that an offset points in the middle of a structure.&lt;br /&gt;
&lt;br /&gt;
All files following this format have a single root_node of type SObj (Scene data).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Preamble&#039;&#039;&#039;: (0x100 bytes / 0 bytes) ===&lt;br /&gt;
* 4 bytes - hsd_header_offset=0x100 (always)&lt;br /&gt;
* 4 bytes - bones_flags_table_offset=0x20 (always) - offset of the skeleton flags list&lt;br /&gt;
* 4 bytes - bones_table_offset=0xC0 (always) - offset of the skeleton list&lt;br /&gt;
* 20 bytes - Pad - (always)&lt;br /&gt;
* 4 bytes [32] - Unknown (skeleton flags?) 1 byte per flag?&lt;br /&gt;
* 32 bytes - Pad - (always)&lt;br /&gt;
* 32 bytes - skeletons?&lt;br /&gt;
* 32 bytes - Pad - (always)&lt;br /&gt;
=== &#039;&#039;&#039;HSD Header&#039;&#039;&#039; - (0x20 bytes) ===&lt;br /&gt;
* 4 bytes - Total file size&lt;br /&gt;
* 4 bytes - Data block size&lt;br /&gt;
* 4 bytes - Number of entries in the Relocation Table&lt;br /&gt;
* 4 bytes - root0_count&lt;br /&gt;
* 4 bytes - root1_count&lt;br /&gt;
* 12 bytes - Pad - (always)&lt;br /&gt;
=== &#039;&#039;&#039;Data block&#039;&#039;&#039;: ===&lt;br /&gt;
* JOBJ, etc. -&amp;gt; These structures are detailed below.&lt;br /&gt;
=== &#039;&#039;&#039;Relocation Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of 4-byte offsets - Offsets of structures in the DB.&lt;br /&gt;
=== &#039;&#039;&#039;Root Nodes (2)&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of size 8 * root0_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
* Array of size 8 * root1_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
=== &#039;&#039;&#039;String Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Series of strings terminated by Null, the number of root0_count + root1_count&lt;br /&gt;
&lt;br /&gt;
== Structures encountered in the DB ==&lt;br /&gt;
Note: The hierarchy is cumulative on transformations for parent-&amp;gt;child relationships&lt;br /&gt;
&lt;br /&gt;
Root Nodes with the name &amp;quot;scene_data&amp;quot; point to an SObj:&lt;br /&gt;
=== &#039;&#039;&#039;SObj&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - JObjDescs_offsets_list_offset&lt;br /&gt;
* 4 bytes - Cameras_list_offset&lt;br /&gt;
* 4 bytes - Lights_list_offset&lt;br /&gt;
* 4 bytes - Fog&lt;br /&gt;
&lt;br /&gt;
&amp;quot;scene_data&amp;quot; == name of the root node&lt;br /&gt;
JObjDescs_offsets_list_offset, cameras... point to a list of offsets terminated by 4 bytes at 0x00.&lt;br /&gt;
lights_list_offset points to pairs (4 bytes - LObj_offset; 4 bytes - light_anim_pointer_offset)&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObjDesc&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - root_joint_offset - JObj&lt;br /&gt;
* 4 bytes - joint_animations_offset - ?&lt;br /&gt;
* 4 bytes - material_animations_offset - ?&lt;br /&gt;
* 4 bytes - shape_animations_offset - ?&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CObj&#039;&#039;&#039;: (0x38 bytes) ===&lt;br /&gt;
* 4 bytes - flags&lt;br /&gt;
* 4 bytes - projection_type - ProjectionTypeEnum&lt;br /&gt;
* 2 bytes - viewport_left&lt;br /&gt;
* 2 bytes - viewport_right&lt;br /&gt;
* 2 bytes - viewport_top&lt;br /&gt;
* 2 bytes - viewport_bottom&lt;br /&gt;
* 4 bytes - proj_width&lt;br /&gt;
* 4 bytes - proj_height&lt;br /&gt;
* 4 bytes - eye_offset - WObj&lt;br /&gt;
* 4 bytes - target_offset - WObj&lt;br /&gt;
* 4 bytes - roll&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - near_clip&lt;br /&gt;
* 4 bytes - float - far_clip&lt;br /&gt;
* 4 bytes - float - field_of_view&lt;br /&gt;
* 4 bytes - float - aspect&lt;br /&gt;
Camera object. Note: for frustrum or ortho, the structure is different.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ProjectionTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** PERSPECTIVE = 1&lt;br /&gt;
** FRUSTRUM = 2&lt;br /&gt;
** ORTHO = 3&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;WObj&#039;&#039;&#039;: (0x14 bytes) ===&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - v1&lt;br /&gt;
* 4 bytes - float - v2&lt;br /&gt;
* 4 bytes - float - v3&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
eye / target&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObj&#039;&#039;&#039;: (0x1c bytes) ===&lt;br /&gt;
* 4 bytes - class_name&lt;br /&gt;
* 4 bytes - next_offset&lt;br /&gt;
* 2 bytes - flags - LObjFlagsEnum&lt;br /&gt;
* 2 bytes - attenuation_flags - LObjAttenuationFlagsEnum&lt;br /&gt;
* 1 byte - color_r&lt;br /&gt;
* 1 byte - color_g&lt;br /&gt;
* 1 byte - color_b&lt;br /&gt;
* 1 byte - color_alpha&lt;br /&gt;
* 4 bytes - lobj_point_offset - position&lt;br /&gt;
* 4 bytes - infinite_data&lt;br /&gt;
* 4 bytes - point_spot_data&lt;br /&gt;
light&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_AMBIANT = 00 00&lt;br /&gt;
** LOBJ_INFINITE = 00 01&lt;br /&gt;
** LOBJ_POINT = 00 02&lt;br /&gt;
** LOBJ_SPOT = 00 03&lt;br /&gt;
** LOBJ_DIFFUSE = 00 04&lt;br /&gt;
** LOBJ_SPECULAR = 00 08&lt;br /&gt;
** LOBJ_ALPHA = 00 10&lt;br /&gt;
** LOBJ_HIDDEN = 00 20&lt;br /&gt;
** LOBJ_RAW_PARAM = 00 40&lt;br /&gt;
** LOBJ_DIFF_DIRTY = 00 80&lt;br /&gt;
** LOBJ_SPEC_DIRTY = 01 00&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjAttenuationFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_LIGHT_ATTN_NONE = 00 00&lt;br /&gt;
** LOBJ_LIGHT_ATTN = 00 01&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObjPoint&#039;&#039;&#039; : (0x14 bytes) ===&lt;br /&gt;
4 bytes - class_name&lt;br /&gt;
4 bytes - float - x&lt;br /&gt;
4 bytes - float - y&lt;br /&gt;
4 bytes - float - z&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
=== &#039;&#039;&#039;LightAnimPointer&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
** 4 bytes - next_offset - (LightAnimPointer)&lt;br /&gt;
** 4 bytes - light_anim - ?&lt;br /&gt;
** 4 bytes - position_anim - ?&lt;br /&gt;
** 4 bytes - interst_anim - ?&lt;br /&gt;
Bugs in HSDRaw - to be tested&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObj&#039;&#039;&#039; : (0x40 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - flags&lt;br /&gt;
4 bytes - child_offset (JObj)&lt;br /&gt;
4 bytes - next_offset (JObj)&lt;br /&gt;
4 bytes - dobj_offset (DObj)&lt;br /&gt;
4 bytes [3] - float3 - rotation_xyz&lt;br /&gt;
4 bytes [3] - float3 - scale_xyz&lt;br /&gt;
4 bytes [3] - float3 - translation_xyz&lt;br /&gt;
4 bytes - inverse_world_transform_offset (inverse world transform = 4x3 matrix)&lt;br /&gt;
4 bytes - robj_offset&lt;br /&gt;
Pointed by the lists in Root Node scene_data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JObjFlagsEnum&#039;&#039;&#039; : (can be cumulative)&lt;br /&gt;
** NULL = 00 00 00 00&lt;br /&gt;
** SKELETON = 00 00 00 01&lt;br /&gt;
** SKELETON_ROOT = 00 00 00 02&lt;br /&gt;
** ENVELOPE_MODEL = 00 00 00 04&lt;br /&gt;
** CLASSICAL_SCALING = 00 00 00 08&lt;br /&gt;
** HIDDEN = 00 00 00 10&lt;br /&gt;
** PTCL = 00 00 00 20&lt;br /&gt;
** MTX_DIRTY = 00 00 00 40&lt;br /&gt;
** LIGHTING = 00 00 00 80&lt;br /&gt;
** TEXGEN = 00 00 01 00&lt;br /&gt;
** BILLBOARD = 00 00 02 00&lt;br /&gt;
** VBILLBOARD = 00 00 04 00&lt;br /&gt;
** HBILLBOARD = 00 00 06 00&lt;br /&gt;
** RBILLBOARD = 00 00 08 00&lt;br /&gt;
** INSTANCE = 00 00 10 00&lt;br /&gt;
** PBILLBOARD = 00 00 20 00&lt;br /&gt;
** SPLINE = 00 00 40 00&lt;br /&gt;
** FLIP_IK = 00 00 80 00&lt;br /&gt;
** SPECULAR = 00 01 00 00&lt;br /&gt;
** USE_QUATERNION = 00 02 00 00&lt;br /&gt;
** OPA = 00 04 00 00&lt;br /&gt;
** XLU = 00 08 00 00&lt;br /&gt;
** TEXEDGE = 00 10 00 00&lt;br /&gt;
** JOINT1 = 00 20 00 00&lt;br /&gt;
** JOINT2 = 00 40 00 00&lt;br /&gt;
** EFFECTOR = 00 60 00 00&lt;br /&gt;
** USER_DEFINED_MTX = 00 80 00 00&lt;br /&gt;
** MTX_INDEPEND_PARENT = 01 00 00 00&lt;br /&gt;
** MTX_INDEPEND_SRT = 02 00 00 00&lt;br /&gt;
** MTX_SCALE_COMPENSATE = 04 00 00 00&lt;br /&gt;
** ROOT_OPA = 10 00 00 00&lt;br /&gt;
** ROOT_XLU = 20 00 00 00&lt;br /&gt;
** ROOT_TEXEDGE = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;InverseWorldTransform&#039;&#039;&#039; : (0x30 bytes) ===&lt;br /&gt;
4 bytes - float - M11&lt;br /&gt;
4 bytes - float - M12&lt;br /&gt;
4 bytes - float - M13&lt;br /&gt;
4 bytes - float - M14&lt;br /&gt;
4 bytes - float - M21&lt;br /&gt;
4 bytes - float - M22&lt;br /&gt;
4 bytes - float - M23&lt;br /&gt;
4 bytes - float - M24&lt;br /&gt;
4 bytes - float - M31&lt;br /&gt;
4 bytes - float - M32&lt;br /&gt;
4 bytes - float - M33&lt;br /&gt;
4 bytes - float - M34&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;DObj&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - next_offset - next DOBJ&lt;br /&gt;
4 bytes - mobj_offset - material offset&lt;br /&gt;
4 bytes - pobj_offset - mesh offset&lt;br /&gt;
Linked list that allows retrieving all materials &amp;amp; meshes for the associated JObj.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;MObj&#039;&#039;&#039; : (0x18 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - render_flags - RenderFlagsEnum&lt;br /&gt;
4 bytes - tobj_offset - texture offset - may be invalid if there is no texture for the material&lt;br /&gt;
4 bytes - material_offset - material colors?&lt;br /&gt;
8 bytes - PEDesc?&lt;br /&gt;
Contains textures &amp;amp; information about material colors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RenderFlagsEnum&#039;&#039;&#039; : (cumulative)&lt;br /&gt;
** USER = 80 00 00 00&lt;br /&gt;
** CONSTANT = 00 00 00 01&lt;br /&gt;
** VERTEX = 00 00 00 02&lt;br /&gt;
** BOTH = 00 00 00 03&lt;br /&gt;
** DIFFUSE = 00 00 00 04&lt;br /&gt;
** SPECULAR = 00 00 00 08&lt;br /&gt;
** TEX0 = 00 00 00 10&lt;br /&gt;
** TEX1 = 00 00 00 20&lt;br /&gt;
** TEX2 = 00 00 00 40&lt;br /&gt;
** TEX3 = 00 00 00 80&lt;br /&gt;
** TEX4 = 00 00 01 00&lt;br /&gt;
** TEX5 = 00 00 02 00&lt;br /&gt;
** TEX6 = 00 00 04 00&lt;br /&gt;
** TEX7 = 00 00 08 00&lt;br /&gt;
** TOON = 00 00 10 00&lt;br /&gt;
** ALPHA_MAT = 00 00 20 00&lt;br /&gt;
** ALPHA_VTX = 00 00 40 00&lt;br /&gt;
** ALPHA_BOTH = 00 00 60 00&lt;br /&gt;
** ZOFST = 01 00 00 00&lt;br /&gt;
** EFFECT = 02 00 00 00&lt;br /&gt;
** SHADOW = 04 00 00 00&lt;br /&gt;
** ZMODE_ALWAYS = 08 00 00 00&lt;br /&gt;
** DF_ALL = 10 00 00 00&lt;br /&gt;
** NO_ZUPDATE = 20 00 00 00&lt;br /&gt;
** XLU = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;TObj&#039;&#039;&#039; : (0x5c octets) ===&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - tex_map_id - TexMapIdEnum&lt;br /&gt;
* 4 bytes - gx_tex_gen_src - GXTexGenSrcEnum&lt;br /&gt;
* 4 bytes - float - rx&lt;br /&gt;
* 4 bytes - float - ry&lt;br /&gt;
* 4 bytes - float - rz&lt;br /&gt;
* 4 bytes - float - sx&lt;br /&gt;
* 4 bytes - float - sy&lt;br /&gt;
* 4 bytes - float - sz&lt;br /&gt;
* 4 bytes - float - tx&lt;br /&gt;
* 4 bytes - float - ty&lt;br /&gt;
* 4 bytes - float - tz&lt;br /&gt;
* 4 bytes - wrap_s - WrapEnum&lt;br /&gt;
* 4 bytes - wrap_t - WrapEnum&lt;br /&gt;
* 1 byte- w_scale&lt;br /&gt;
* 1 byte- h_scale&lt;br /&gt;
* 2 bytes - ?&lt;br /&gt;
1 byte - bump_map - (False = 00 ; True = 01)&lt;br /&gt;
4 bits - alpha_operation - AlphaOperationEnum&lt;br /&gt;
4 bits - color_operation - ColorOperationEnum&lt;br /&gt;
1 byte - shadow_lightmap - (False = 00 ; True = 01) (2 bytes with a lightmap limit Enum)&lt;br /&gt;
1 bit - ext_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - ambient_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - specular_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - diffuse_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
4 bits - coord_type - CoordTypeEnum&lt;br /&gt;
4 bytes - float - blending - used when color_operation or alpha_operation == BLEND&lt;br /&gt;
4 bytes - mag_filter - MagFilterEnum&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
Texture Information: The TObj contains information about texture environment parameters used for graphic rendering, as well as the offsets of the image and palette data used for this texture. The most important aspects here are the image offset and the palette/TLUT (Texture Look-Up Table) - if the image is not indexed (RGBA, CMPR, etc.), then the palette/TLUT description structure is not used.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TexMapIdEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TEXMAP0 = 00 00 00 00&lt;br /&gt;
** GX_TEXMAP1 = 00 00 00 01&lt;br /&gt;
** GX_TEXMAP2 = 00 00 00 02&lt;br /&gt;
** GX_TEXMAP3 = 00 00 00 03&lt;br /&gt;
** GX_TEXMAP4 = 00 00 00 04&lt;br /&gt;
** GX_TEXMAP5 = 00 00 00 05&lt;br /&gt;
** GX_TEXMAP6 = 00 00 00 06&lt;br /&gt;
** GX_TEXMAP7 = 00 00 00 07&lt;br /&gt;
** GX_MAX_TEXMAP = 00 00 00 08&lt;br /&gt;
** GX_TEXMAP_NULL = 00 00 00 09&lt;br /&gt;
** GX_TEXMAP_DISABLE = 00 00 00 0A&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GXTexGenSrcEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TG_POS = 00 00 00 00&lt;br /&gt;
** GX_TG_NRM = 00 00 00 01&lt;br /&gt;
** GX_TG_BINRM = 00 00 00 02&lt;br /&gt;
** GX_TG_TANGENT = 00 00 00 03&lt;br /&gt;
** GX_TG_TEX0 = 00 00 00 04&lt;br /&gt;
** GX_TG_TEX1 = 00 00 00 05&lt;br /&gt;
** GX_TG_TEX2 = 00 00 00 06&lt;br /&gt;
** GX_TG_TEX3 = 00 00 00 07&lt;br /&gt;
** GX_TG_TEX4 = 00 00 00 08&lt;br /&gt;
** GX_TG_TEX5 = 00 00 00 09&lt;br /&gt;
** GX_TG_TEX6 = 00 00 00 0A&lt;br /&gt;
** GX_TG_TEX7 = 00 00 00 0B&lt;br /&gt;
** GX_TG_TEXCOORD0 = 00 00 00 0C&lt;br /&gt;
** GX_TG_TEXCOORD1 = 00 00 00 0D&lt;br /&gt;
** GX_TG_TEXCOORD2 = 00 00 00 0E&lt;br /&gt;
** GX_TG_TEXCOORD3 = 00 00 00 0F&lt;br /&gt;
** GX_TG_TEXCOORD4 = 00 00 00 10&lt;br /&gt;
** GX_TG_TEXCOORD5 = 00 00 00 11&lt;br /&gt;
** GX_TG_TEXCOORD6 = 00 00 00 12&lt;br /&gt;
** GX_TG_COLOR0 = 00 00 00 13&lt;br /&gt;
** GX_TG_COLOR1 = 00 00 00 14&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AlphaOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = 0X&lt;br /&gt;
** ALPHAMASK = 1X&lt;br /&gt;
** BLEND = 2X&lt;br /&gt;
** MODULATE = 3X&lt;br /&gt;
** REPLACE = 4X&lt;br /&gt;
** PASS = 5X&lt;br /&gt;
** ADD = 6X&lt;br /&gt;
** SUB = 7X&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ColorOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = X0&lt;br /&gt;
** ALPHA_MASK = X1&lt;br /&gt;
** RGB_MASK = X2&lt;br /&gt;
** BLEND = X3&lt;br /&gt;
** MODULATE = X4&lt;br /&gt;
** REPLACE = X5&lt;br /&gt;
** PASS = X6&lt;br /&gt;
** ADD = X7&lt;br /&gt;
** SUB = X8&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CoordTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** UV = X0&lt;br /&gt;
** REFLECTION = X1&lt;br /&gt;
** HILIGHT = X2&lt;br /&gt;
** SHADOW = X3&lt;br /&gt;
** TOON = X4&lt;br /&gt;
** GRADATION = X5&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MagFilterEnum&#039;&#039;&#039;:&lt;br /&gt;
** GX_NEAR = 00 00 00 00&lt;br /&gt;
** GX_LINEAR = 00 00 00 01&lt;br /&gt;
** GX_NEAR_MIP_NEAR = 00 00 00 02&lt;br /&gt;
** GX_LIN_MIP_NEAR = 00 00 00 03&lt;br /&gt;
** GX_NEAR_MIP_LIN = 00 00 00 04&lt;br /&gt;
** GX_LIN_MIP_LIN = 00 00 00 05&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WrapEnum&#039;&#039;&#039;:&lt;br /&gt;
** CLAMP = 00 00 00 00&lt;br /&gt;
** REPEAT = 00 00 00 01&lt;br /&gt;
** MIRROR = 00 00 00 02&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Material&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 1 byte - AMB_R - (ambient)&lt;br /&gt;
* 1 byte - AMB_G&lt;br /&gt;
* 1 byte - AMB_B&lt;br /&gt;
* 1 byte - AMB_A&lt;br /&gt;
* 1 byte - DIF_R - (diffuse)&lt;br /&gt;
* 1 byte - DIF_G&lt;br /&gt;
* 1 byte - DIF_B&lt;br /&gt;
* 1 byte - DIF_A&lt;br /&gt;
* 1 byte - SPC_R - (specular)&lt;br /&gt;
* 1 byte - SPC_G&lt;br /&gt;
* 1 byte - SPC_B&lt;br /&gt;
* 1 byte - SPC_A&lt;br /&gt;
* 4 bytes - float - alpha&lt;br /&gt;
* 4 bytes - float - shininess&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 bytes - Inconnu&lt;br /&gt;
* 4 bytes - next_offset - pobj&lt;br /&gt;
* 4 bytes - vertex_attr_list_offset&lt;br /&gt;
* 2 bytes  - Flags - PObjFlagsEnum&lt;br /&gt;
* 2 bytes - display_list_size - number of 0x20 (32) byte blocks occupied by display list data&lt;br /&gt;
* 4 bytes - display_list_offset&lt;br /&gt;
4 bytes - weight_list_offset - ? Verify that the envelope_weights array is indeed found at this offset.&lt;br /&gt;
&lt;br /&gt;
As indicated by next_offset, it is a list of meshes to be displayed for a given material referenced by a dobj. PObj contains the offsets of vertex attributes / display list / joint weight list, which is sufficient and allows interpreting and processing vertex, normal, and texture coordinates.&lt;br /&gt;
&lt;br /&gt;
Vertex attributes are the most important - the specified parameters control everything: from the format to the size of the data for each vertex, normal, and texture coordinates, and how these values are dimensioned (scaled) based on the presence and size of each index value appearing in the display list information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
Unknown0 = 00 01&lt;br /&gt;
Unknown1 = 00 02&lt;br /&gt;
** ANIM = 00 08&lt;br /&gt;
** SHAPE_ANIM = 10 00&lt;br /&gt;
** ENVELOPE = 20 00&lt;br /&gt;
** CULLBACK = 40 00&lt;br /&gt;
** CULLFRONT = 80 00&lt;br /&gt;
&lt;br /&gt;
=== EnvelopeWeights : (0x? octets) ===&lt;br /&gt;
* 4 bytes - envelope_count&lt;br /&gt;
* [envelope_count]:&lt;br /&gt;
** 4 bytes - float - weight&lt;br /&gt;
** 4 bytes - pad ?&lt;br /&gt;
* 4 bytes - jobj_list_offset&lt;br /&gt;
&lt;br /&gt;
=== not verified yet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IMAGE_HEADER&#039;&#039;&#039; :&lt;br /&gt;
** 4 bytes - image_offset - image data&lt;br /&gt;
** 2 bytes - width&lt;br /&gt;
** 2 bytes - height&lt;br /&gt;
** 4 bytes - image_format&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PALETTE_HEADER&#039;&#039;&#039; : (0x10 bytes)&lt;br /&gt;
** 4 bytes - palette_offset - palette data&lt;br /&gt;
** 4 bytes - palette_format&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 2 bytes - color_count&lt;br /&gt;
** 2 bytes - Unknown&lt;br /&gt;
The image_offset and palette_offset are often shared by several textures. Knowing this allows you to find all the information about the textures&#039; image data (width, height, format), as well as the format and the number of colors in the palette/TLUT.&lt;br /&gt;
&lt;br /&gt;
The image format does not determine the total number of colors in the palette it uses. For example, an 8-bit indexed image would have a maximum of 256 colors, but only 136 or 221 colors may be currently used. In this way, the palette will not use the total size it should use.&lt;br /&gt;
&lt;br /&gt;
Images follow the structure generally used by the GameCube:&lt;br /&gt;
&lt;br /&gt;
IMAGE FORMATS :&lt;br /&gt;
* case 0: //i4&lt;br /&gt;
* case 1: //i8&lt;br /&gt;
* case 2: //i4a4&lt;br /&gt;
* case 3: //i8a8&lt;br /&gt;
* case 4: //r5g6b5&lt;br /&gt;
* case 5: //rgb5a3&lt;br /&gt;
* case 6: //r8g8b8a8&lt;br /&gt;
* case 8: //index4&lt;br /&gt;
* case 9: //index8&lt;br /&gt;
* case 0xa: //index14x2&lt;br /&gt;
* case 0xe: //s3tc1&lt;br /&gt;
&lt;br /&gt;
The indexed formats also use palette/TLUT information, and the data can appear in various formats:&lt;br /&gt;
&lt;br /&gt;
PALETTE FORMATS :&lt;br /&gt;
* case 0: //ia8&lt;br /&gt;
* case 1: //r5g6b5&lt;br /&gt;
* case 2: //rgb5a3&lt;br /&gt;
&lt;br /&gt;
---&amp;gt; &amp;quot;Joint Data - Accessing Geometry, Mesh, and Vertex Attributes&amp;quot; https://smashboards.com/threads/melee-dat-format.292603/&lt;br /&gt;
&lt;br /&gt;
// Declaration of a vertex and attribute information&lt;br /&gt;
// attr, type, cnt, data_type, flags?, file_offset&lt;br /&gt;
* ATTR_DATA&lt;br /&gt;
** 4 bytes - GXAttr     vtx_attr_offset - attr&lt;br /&gt;
** 4 bytes - GXAttrType vtx_attr_type   - index_type&lt;br /&gt;
** 4 bytes - GXCompCnt  comp_cnt        - cnt&lt;br /&gt;
** 4 bytes - GXCompType comp_type       - data_type	&lt;br /&gt;
** 1 bytes - scale&lt;br /&gt;
** 1 bytes - unknown&lt;br /&gt;
** 2 bytes - vtx_stride&lt;br /&gt;
** 2 bytes - data_offset&lt;br /&gt;
&lt;br /&gt;
vertex_attr_offset points to a list of vertex attributes. The number of these attributes is not provided. The data in this structure follows the information and types designed by the GameCube/WII architecture and its API. The list is terminated by a specific value of vtx_attr signaling the end of this list. With access to the SDK documentation, it is strongly recommended to read the section about &amp;quot;vertex attributes and other specifications.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The value of vtx_attr determines the type of data that this attribute represents and can indicate a number of native types used for passing data between software and hardware interfaces.&lt;br /&gt;
&lt;br /&gt;
The possible values are as follows:&lt;br /&gt;
enum GXAttr (4 bytes)&lt;br /&gt;
** GX_VA_PNMTXIDX = 0, // position/normal matrix index&lt;br /&gt;
** GX_VA_TEX0MTXIDX, // texture 0 matrix index&lt;br /&gt;
** GX_VA_TEX1MTXIDX, // texture 1 matrix index&lt;br /&gt;
** GX_VA_TEX2MTXIDX, // texture 2 matrix index&lt;br /&gt;
** GX_VA_TEX3MTXIDX, // texture 3 matrix index&lt;br /&gt;
** GX_VA_TEX4MTXIDX, // texture 4 matrix index&lt;br /&gt;
** GX_VA_TEX5MTXIDX, // texture 5 matrix index&lt;br /&gt;
** GX_VA_TEX6MTXIDX, // texture 6 matrix index&lt;br /&gt;
** GX_VA_TEX7MTXIDX, // texture 7 matrix index&lt;br /&gt;
** GX_VA_POS = 9, // position&lt;br /&gt;
** GX_VA_NRM, // normal&lt;br /&gt;
** GX_VA_CLR0, // color 0&lt;br /&gt;
** GX_VA_CLR1, // color 1&lt;br /&gt;
** GX_VA_TEX0, // input texture coordinate 0&lt;br /&gt;
** GX_VA_TEX1, // input texture coordinate 1&lt;br /&gt;
** GX_VA_TEX2, // input texture coordinate 2&lt;br /&gt;
** GX_VA_TEX3, // input texture coordinate 3&lt;br /&gt;
** GX_VA_TEX4, // input texture coordinate 4&lt;br /&gt;
** GX_VA_TEX5, // input texture coordinate 5&lt;br /&gt;
** GX_VA_TEX6, // input texture coordinate 6&lt;br /&gt;
** GX_VA_TEX7, // input texture coordinate 7&lt;br /&gt;
&lt;br /&gt;
** GX_POS_MTX_ARRAY, // position matrix array pointer&lt;br /&gt;
** GX_NRM_MTX_ARRAY, // normal matrix array pointer&lt;br /&gt;
** GX_TEX_MTX_ARRAY, // texture matrix array pointer&lt;br /&gt;
** GX_LIGHT_ARRAY, // light parameter array pointer&lt;br /&gt;
** GX_VA_NBT, // normal, bi-normal, tangent&lt;br /&gt;
** GX_VA_MAX_ATTR, // maximum number of vertex attributes&lt;br /&gt;
&lt;br /&gt;
** GX_VA_NULL = 0xff // NULL attribute (to mark the end of lists)&lt;br /&gt;
&lt;br /&gt;
All the necessary data to represent a mesh can be specified and indexed in one way or another. Similarly, GX_VA_TEX0MTXIDX, GX_VA_CLR0, and others are also possible - the most frequent values in the SSBM data are: GX_VA_PNMTXIDX, GX_VA_POS, GX_VA_NRM, and GX_VA_TEX0. This is to be expected as joint matrices, vertex positions/normals, and texture coordinates respectively are probably the most basic elements needed to display a textured mesh, whether static or animated.&lt;br /&gt;
&lt;br /&gt;
When the value of vtx_attr == GX_VA_NULL (0xFF), the end of the vertex attribute array has been reached.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The vtx_attr_type values is actually associated with how the value is indexed, and can thus also determine the size of the index value within the display list data.&lt;br /&gt;
&lt;br /&gt;
* 4 bytes - enum GXAttrType&lt;br /&gt;
** GX_NONE    = 0,&lt;br /&gt;
** GX_DIRECT,&lt;br /&gt;
** GX_INDEX8,&lt;br /&gt;
** GX_INDEX16&lt;br /&gt;
&lt;br /&gt;
* Structures COLL_DATA : (collision data)&lt;br /&gt;
** 4 bytes - vertex_offset (2 floats per entry corresponding to probably 2D data)&lt;br /&gt;
** 4 bytes - vertex_count&lt;br /&gt;
** 4 bytes - index_offset&lt;br /&gt;
** 4 bytes - index_count&lt;br /&gt;
** 4 bytes [5] - Unknown&lt;br /&gt;
*** 2 bytes - index_start&lt;br /&gt;
*** 2 bytes - index_count&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1536</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1536"/>
		<updated>2023-12-29T07:09:18Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
{{Research | 2| Researches on headers / bodies structures are partially achieved. }}&lt;br /&gt;
&lt;br /&gt;
== Gotcha Force Models ==&lt;br /&gt;
&lt;br /&gt;
Gotcha Force models work as those from the game Super Smash Bros Melee (SSBM) investigated by its [https://smashboards.com/threads/melee-dat-format.292603/ community].&lt;br /&gt;
&lt;br /&gt;
A model is a file format that organizes objects and resources serialized to be used by the &#039;&#039;&#039;H&#039;&#039;&#039;al &#039;&#039;&#039;S&#039;&#039;&#039;ys&#039;&#039;&#039;D&#039;&#039;&#039;olphin (&#039;&#039;&#039;HSD&#039;&#039;&#039;) library. The HSD library is used in several Capcom games. These are graphic materials structured in a hierarchical way. Some pictures present in the models seem to indicate the use of [https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/matcap.html matcap] technic. This library uses Dolphin SDK functions like GX / MTX and so on.&lt;br /&gt;
&lt;br /&gt;
=== Affected files ===&lt;br /&gt;
All files in the AFS having &#039;&#039;&#039;_mdl&#039;&#039;&#039; in their names are models described in this page. We notice also [[ARZ (Gotcha Force)|.arz]] which are compressed models. collision.arc and tdc00.arc to tdc09.arc are also models.&lt;br /&gt;
&lt;br /&gt;
Model files are also found in the borgs&#039; pzz (plxxxx.pzz) at positions 004 to 009.&lt;br /&gt;
&lt;br /&gt;
=== HSDRaw ===&lt;br /&gt;
HSDRaw, a dotnet 3D editor for this format, is unstable on my Windows (algoflash). However, it has been proven that editing the _mdl starting at offset 0x100 - after the preamble - allows visualizing the file on HSDRaw and obtaining the 3D rendering of the Borg (click on the first JOBJ folder - then the JOBJ inside and double-click on the violet node). This should also allow editing certain properties?&lt;br /&gt;
&lt;br /&gt;
== General Structure ==&lt;br /&gt;
The model format is divided into several blocks. The preamble is 0x100 bytes at the very beginning of the file. It is often absent. All values are in unsigned big endian, and the pad is in Null bytes (\x00). Offsets found after the beginning of the Data Block (DB) are relative to the beginning of the DB. The relocation table is an array of 4-byte offsets (relative to the DB) used to translate the offsets of structures into absolute addressing during memory loading. The relocation table, for example, helps delimit the structures because it is unlikely that an offset points in the middle of a structure.&lt;br /&gt;
&lt;br /&gt;
All files following this format have a single root_node of type SObj (Scene data).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Preamble&#039;&#039;&#039;: (0x100 bytes / 0 bytes) ===&lt;br /&gt;
* 4 bytes - hsd_header_offset=0x100 (always)&lt;br /&gt;
* 4 bytes - bones_flags_table_offset=0x20 (always) - offset of the skeleton flags list&lt;br /&gt;
* 4 bytes - bones_table_offset=0xC0 (always) - offset of the skeleton list&lt;br /&gt;
* 20 bytes - Pad - (always)&lt;br /&gt;
* 4 bytes [32] - Unknown (skeleton flags?) 1 byte per flag?&lt;br /&gt;
* 32 bytes - Pad - (always)&lt;br /&gt;
* 32 bytes - skeletons?&lt;br /&gt;
* 32 bytes - Pad - (always)&lt;br /&gt;
=== &#039;&#039;&#039;HSD Header&#039;&#039;&#039; - (0x20 bytes) ===&lt;br /&gt;
* 4 bytes - Total file size&lt;br /&gt;
* 4 bytes - Data block size&lt;br /&gt;
* 4 bytes - Number of entries in the Relocation Table&lt;br /&gt;
* 4 bytes - root0_count&lt;br /&gt;
* 4 bytes - root1_count&lt;br /&gt;
* 12 bytes - Pad - (always)&lt;br /&gt;
=== &#039;&#039;&#039;Data block&#039;&#039;&#039;: ===&lt;br /&gt;
* JOBJ, etc. -&amp;gt; These structures are detailed below.&lt;br /&gt;
=== &#039;&#039;&#039;Relocation Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of 4-byte offsets - Offsets of structures in the DB.&lt;br /&gt;
=== &#039;&#039;&#039;Root Nodes (2)&#039;&#039;&#039;: ===&lt;br /&gt;
* Array of size 8 * root0_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
* Array of size 8 * root1_count&lt;br /&gt;
** 4 bytes - root_offset - relative to DB&lt;br /&gt;
** 4 bytes - string_table_offset - relative to StringTable&lt;br /&gt;
=== &#039;&#039;&#039;String Table&#039;&#039;&#039;: ===&lt;br /&gt;
* Series of strings terminated by Null, the number of root0_count + root1_count&lt;br /&gt;
&lt;br /&gt;
== Structures encountered in the DB ==&lt;br /&gt;
Note: The hierarchy is cumulative on transformations for parent-&amp;gt;child relationships&lt;br /&gt;
&lt;br /&gt;
Root Nodes with the name &amp;quot;scene_data&amp;quot; point to an SObj:&lt;br /&gt;
=== &#039;&#039;&#039;SObj&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - JObjDescs_offsets_list_offset&lt;br /&gt;
* 4 bytes - Cameras_list_offset&lt;br /&gt;
* 4 bytes - Lights_list_offset&lt;br /&gt;
* 4 bytes - Fog&lt;br /&gt;
&lt;br /&gt;
&amp;quot;scene_data&amp;quot; == name of the root node&lt;br /&gt;
JObjDescs_offsets_list_offset, cameras... point to a list of offsets terminated by 4 bytes at 0x00.&lt;br /&gt;
lights_list_offset points to pairs (4 bytes - LObj_offset; 4 bytes - light_anim_pointer_offset)&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObjDesc&#039;&#039;&#039;: (0x10 bytes) ===&lt;br /&gt;
* 4 bytes - root_joint_offset - JObj&lt;br /&gt;
* 4 bytes - joint_animations_offset - ?&lt;br /&gt;
* 4 bytes - material_animations_offset - ?&lt;br /&gt;
* 4 bytes - shape_animations_offset - ?&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CObj&#039;&#039;&#039;: (0x38 bytes) ===&lt;br /&gt;
* 4 bytes - flags&lt;br /&gt;
* 4 bytes - projection_type - ProjectionTypeEnum&lt;br /&gt;
* 2 bytes - viewport_left&lt;br /&gt;
* 2 bytes - viewport_right&lt;br /&gt;
* 2 bytes - viewport_top&lt;br /&gt;
* 2 bytes - viewport_bottom&lt;br /&gt;
* 4 bytes - proj_width&lt;br /&gt;
* 4 bytes - proj_height&lt;br /&gt;
* 4 bytes - eye_offset - WObj&lt;br /&gt;
* 4 bytes - target_offset - WObj&lt;br /&gt;
* 4 bytes - roll&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - near_clip&lt;br /&gt;
* 4 bytes - float - far_clip&lt;br /&gt;
* 4 bytes - float - field_of_view&lt;br /&gt;
* 4 bytes - float - aspect&lt;br /&gt;
Camera object. Note: for frustrum or ortho, the structure is different.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ProjectionTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** PERSPECTIVE = 1&lt;br /&gt;
** FRUSTRUM = 2&lt;br /&gt;
** ORTHO = 3&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;WObj&#039;&#039;&#039;: (0x14 bytes) ===&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
* 4 bytes - float - v1&lt;br /&gt;
* 4 bytes - float - v2&lt;br /&gt;
* 4 bytes - float - v3&lt;br /&gt;
* 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
eye / target&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObj&#039;&#039;&#039;: (0x1c bytes) ===&lt;br /&gt;
* 4 bytes - class_name&lt;br /&gt;
* 4 bytes - next_offset&lt;br /&gt;
* 2 bytes - flags - LObjFlagsEnum&lt;br /&gt;
* 2 bytes - attenuation_flags - LObjAttenuationFlagsEnum&lt;br /&gt;
* 1 byte - color_r&lt;br /&gt;
* 1 byte - color_g&lt;br /&gt;
* 1 byte - color_b&lt;br /&gt;
* 1 byte - color_alpha&lt;br /&gt;
* 4 bytes - lobj_point_offset - position&lt;br /&gt;
* 4 bytes - infinite_data&lt;br /&gt;
* 4 bytes - point_spot_data&lt;br /&gt;
light&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_AMBIANT = 00 00&lt;br /&gt;
** LOBJ_INFINITE = 00 01&lt;br /&gt;
** LOBJ_POINT = 00 02&lt;br /&gt;
** LOBJ_SPOT = 00 03&lt;br /&gt;
** LOBJ_DIFFUSE = 00 04&lt;br /&gt;
** LOBJ_SPECULAR = 00 08&lt;br /&gt;
** LOBJ_ALPHA = 00 10&lt;br /&gt;
** LOBJ_HIDDEN = 00 20&lt;br /&gt;
** LOBJ_RAW_PARAM = 00 40&lt;br /&gt;
** LOBJ_DIFF_DIRTY = 00 80&lt;br /&gt;
** LOBJ_SPEC_DIRTY = 01 00&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;LObjAttenuationFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_LIGHT_ATTN_NONE = 00 00&lt;br /&gt;
** LOBJ_LIGHT_ATTN = 00 01&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObjPoint&#039;&#039;&#039; : (0x14 bytes) ===&lt;br /&gt;
4 bytes - class_name&lt;br /&gt;
4 bytes - float - x&lt;br /&gt;
4 bytes - float - y&lt;br /&gt;
4 bytes - float - z&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
=== &#039;&#039;&#039;LightAnimPointer&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
** 4 bytes - next_offset - (LightAnimPointer)&lt;br /&gt;
** 4 bytes - light_anim - ?&lt;br /&gt;
** 4 bytes - position_anim - ?&lt;br /&gt;
** 4 bytes - interst_anim - ?&lt;br /&gt;
Bugs in HSDRaw - to be tested&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObj&#039;&#039;&#039; : (0x40 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - flags&lt;br /&gt;
4 bytes - child_offset (JObj)&lt;br /&gt;
4 bytes - next_offset (JObj)&lt;br /&gt;
4 bytes - dobj_offset (DObj)&lt;br /&gt;
4 bytes [3] - float3 - rotation_xyz&lt;br /&gt;
4 bytes [3] - float3 - scale_xyz&lt;br /&gt;
4 bytes [3] - float3 - translation_xyz&lt;br /&gt;
4 bytes - inverse_world_transform_offset (inverse world transform = 4x3 matrix)&lt;br /&gt;
4 bytes - robj_offset&lt;br /&gt;
Pointed by the lists in Root Node scene_data.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;JObjFlagsEnum&#039;&#039;&#039; : (can be cumulative)&lt;br /&gt;
** NULL = 00 00 00 00&lt;br /&gt;
** SKELETON = 00 00 00 01&lt;br /&gt;
** SKELETON_ROOT = 00 00 00 02&lt;br /&gt;
** ENVELOPE_MODEL = 00 00 00 04&lt;br /&gt;
** CLASSICAL_SCALING = 00 00 00 08&lt;br /&gt;
** HIDDEN = 00 00 00 10&lt;br /&gt;
** PTCL = 00 00 00 20&lt;br /&gt;
** MTX_DIRTY = 00 00 00 40&lt;br /&gt;
** LIGHTING = 00 00 00 80&lt;br /&gt;
** TEXGEN = 00 00 01 00&lt;br /&gt;
** BILLBOARD = 00 00 02 00&lt;br /&gt;
** VBILLBOARD = 00 00 04 00&lt;br /&gt;
** HBILLBOARD = 00 00 06 00&lt;br /&gt;
** RBILLBOARD = 00 00 08 00&lt;br /&gt;
** INSTANCE = 00 00 10 00&lt;br /&gt;
** PBILLBOARD = 00 00 20 00&lt;br /&gt;
** SPLINE = 00 00 40 00&lt;br /&gt;
** FLIP_IK = 00 00 80 00&lt;br /&gt;
** SPECULAR = 00 01 00 00&lt;br /&gt;
** USE_QUATERNION = 00 02 00 00&lt;br /&gt;
** OPA = 00 04 00 00&lt;br /&gt;
** XLU = 00 08 00 00&lt;br /&gt;
** TEXEDGE = 00 10 00 00&lt;br /&gt;
** JOINT1 = 00 20 00 00&lt;br /&gt;
** JOINT2 = 00 40 00 00&lt;br /&gt;
** EFFECTOR = 00 60 00 00&lt;br /&gt;
** USER_DEFINED_MTX = 00 80 00 00&lt;br /&gt;
** MTX_INDEPEND_PARENT = 01 00 00 00&lt;br /&gt;
** MTX_INDEPEND_SRT = 02 00 00 00&lt;br /&gt;
** MTX_SCALE_COMPENSATE = 04 00 00 00&lt;br /&gt;
** ROOT_OPA = 10 00 00 00&lt;br /&gt;
** ROOT_XLU = 20 00 00 00&lt;br /&gt;
** ROOT_TEXEDGE = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;InverseWorldTransform&#039;&#039;&#039; : (0x30 bytes) ===&lt;br /&gt;
4 bytes - float - M11&lt;br /&gt;
4 bytes - float - M12&lt;br /&gt;
4 bytes - float - M13&lt;br /&gt;
4 bytes - float - M14&lt;br /&gt;
4 bytes - float - M21&lt;br /&gt;
4 bytes - float - M22&lt;br /&gt;
4 bytes - float - M23&lt;br /&gt;
4 bytes - float - M24&lt;br /&gt;
4 bytes - float - M31&lt;br /&gt;
4 bytes - float - M32&lt;br /&gt;
4 bytes - float - M33&lt;br /&gt;
4 bytes - float - M34&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;DObj&#039;&#039;&#039; : (0x10 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - next_offset - next DOBJ&lt;br /&gt;
4 bytes - mobj_offset - material offset&lt;br /&gt;
4 bytes - pobj_offset - mesh offset&lt;br /&gt;
Linked list that allows retrieving all materials &amp;amp; meshes for the associated JObj.&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;MObj&#039;&#039;&#039; : (0x18 bytes) ===&lt;br /&gt;
4 bytes - Unknown&lt;br /&gt;
4 bytes - render_flags - RenderFlagsEnum&lt;br /&gt;
4 bytes - tobj_offset - texture offset - may be invalid if there is no texture for the material&lt;br /&gt;
4 bytes - material_offset - material colors?&lt;br /&gt;
8 bytes - PEDesc?&lt;br /&gt;
Contains textures &amp;amp; information about material colors.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;RenderFlagsEnum&#039;&#039;&#039; : (cumulative)&lt;br /&gt;
** USER = 80 00 00 00&lt;br /&gt;
** CONSTANT = 00 00 00 01&lt;br /&gt;
** VERTEX = 00 00 00 02&lt;br /&gt;
** BOTH = 00 00 00 03&lt;br /&gt;
** DIFFUSE = 00 00 00 04&lt;br /&gt;
** SPECULAR = 00 00 00 08&lt;br /&gt;
** TEX0 = 00 00 00 10&lt;br /&gt;
** TEX1 = 00 00 00 20&lt;br /&gt;
** TEX2 = 00 00 00 40&lt;br /&gt;
** TEX3 = 00 00 00 80&lt;br /&gt;
** TEX4 = 00 00 01 00&lt;br /&gt;
** TEX5 = 00 00 02 00&lt;br /&gt;
** TEX6 = 00 00 04 00&lt;br /&gt;
** TEX7 = 00 00 08 00&lt;br /&gt;
** TOON = 00 00 10 00&lt;br /&gt;
** ALPHA_MAT = 00 00 20 00&lt;br /&gt;
** ALPHA_VTX = 00 00 40 00&lt;br /&gt;
** ALPHA_BOTH = 00 00 60 00&lt;br /&gt;
** ZOFST = 01 00 00 00&lt;br /&gt;
** EFFECT = 02 00 00 00&lt;br /&gt;
** SHADOW = 04 00 00 00&lt;br /&gt;
** ZMODE_ALWAYS = 08 00 00 00&lt;br /&gt;
** DF_ALL = 10 00 00 00&lt;br /&gt;
** NO_ZUPDATE = 20 00 00 00&lt;br /&gt;
** XLU = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;TObj&#039;&#039;&#039; : (0x5c octets) ===&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - tex_map_id - TexMapIdEnum&lt;br /&gt;
* 4 bytes - gx_tex_gen_src - GXTexGenSrcEnum&lt;br /&gt;
* 4 bytes - float - rx&lt;br /&gt;
* 4 bytes - float - ry&lt;br /&gt;
* 4 bytes - float - rz&lt;br /&gt;
* 4 bytes - float - sx&lt;br /&gt;
* 4 bytes - float - sy&lt;br /&gt;
* 4 bytes - float - sz&lt;br /&gt;
* 4 bytes - float - tx&lt;br /&gt;
* 4 bytes - float - ty&lt;br /&gt;
* 4 bytes - float - tz&lt;br /&gt;
* 4 bytes - wrap_s - WrapEnum&lt;br /&gt;
* 4 bytes - wrap_t - WrapEnum&lt;br /&gt;
* 1 byte- w_scale&lt;br /&gt;
* 1 byte- h_scale&lt;br /&gt;
* 2 bytes - ?&lt;br /&gt;
1 byte - bump_map - (False = 00 ; True = 01)&lt;br /&gt;
4 bits - alpha_operation - AlphaOperationEnum&lt;br /&gt;
4 bits - color_operation - ColorOperationEnum&lt;br /&gt;
1 byte - shadow_lightmap - (False = 00 ; True = 01) (2 bytes with a lightmap limit Enum)&lt;br /&gt;
1 bit - ext_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - ambient_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - specular_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
1 bit - diffuse_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
4 bits - coord_type - CoordTypeEnum&lt;br /&gt;
4 bytes - float - blending - used when color_operation or alpha_operation == BLEND&lt;br /&gt;
4 bytes - mag_filter - MagFilterEnum&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
* 4 bytes - ?&lt;br /&gt;
Texture Information: The TObj contains information about texture environment parameters used for graphic rendering, as well as the offsets of the image and palette data used for this texture. The most important aspects here are the image offset and the palette/TLUT (Texture Look-Up Table) - if the image is not indexed (RGBA, CMPR, etc.), then the palette/TLUT description structure is not used.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TexMapIdEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TEXMAP0 = 00 00 00 00&lt;br /&gt;
** GX_TEXMAP1 = 00 00 00 01&lt;br /&gt;
** GX_TEXMAP2 = 00 00 00 02&lt;br /&gt;
** GX_TEXMAP3 = 00 00 00 03&lt;br /&gt;
** GX_TEXMAP4 = 00 00 00 04&lt;br /&gt;
** GX_TEXMAP5 = 00 00 00 05&lt;br /&gt;
** GX_TEXMAP6 = 00 00 00 06&lt;br /&gt;
** GX_TEXMAP7 = 00 00 00 07&lt;br /&gt;
** GX_MAX_TEXMAP = 00 00 00 08&lt;br /&gt;
** GX_TEXMAP_NULL = 00 00 00 09&lt;br /&gt;
** GX_TEXMAP_DISABLE = 00 00 00 0A&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GXTexGenSrcEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TG_POS = 00 00 00 00&lt;br /&gt;
** GX_TG_NRM = 00 00 00 01&lt;br /&gt;
** GX_TG_BINRM = 00 00 00 02&lt;br /&gt;
** GX_TG_TANGENT = 00 00 00 03&lt;br /&gt;
** GX_TG_TEX0 = 00 00 00 04&lt;br /&gt;
** GX_TG_TEX1 = 00 00 00 05&lt;br /&gt;
** GX_TG_TEX2 = 00 00 00 06&lt;br /&gt;
** GX_TG_TEX3 = 00 00 00 07&lt;br /&gt;
** GX_TG_TEX4 = 00 00 00 08&lt;br /&gt;
** GX_TG_TEX5 = 00 00 00 09&lt;br /&gt;
** GX_TG_TEX6 = 00 00 00 0A&lt;br /&gt;
** GX_TG_TEX7 = 00 00 00 0B&lt;br /&gt;
** GX_TG_TEXCOORD0 = 00 00 00 0C&lt;br /&gt;
** GX_TG_TEXCOORD1 = 00 00 00 0D&lt;br /&gt;
** GX_TG_TEXCOORD2 = 00 00 00 0E&lt;br /&gt;
** GX_TG_TEXCOORD3 = 00 00 00 0F&lt;br /&gt;
** GX_TG_TEXCOORD4 = 00 00 00 10&lt;br /&gt;
** GX_TG_TEXCOORD5 = 00 00 00 11&lt;br /&gt;
** GX_TG_TEXCOORD6 = 00 00 00 12&lt;br /&gt;
** GX_TG_COLOR0 = 00 00 00 13&lt;br /&gt;
** GX_TG_COLOR1 = 00 00 00 14&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AlphaOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = 0X&lt;br /&gt;
** ALPHAMASK = 1X&lt;br /&gt;
** BLEND = 2X&lt;br /&gt;
** MODULATE = 3X&lt;br /&gt;
** REPLACE = 4X&lt;br /&gt;
** PASS = 5X&lt;br /&gt;
** ADD = 6X&lt;br /&gt;
** SUB = 7X&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ColorOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = X0&lt;br /&gt;
** ALPHA_MASK = X1&lt;br /&gt;
** RGB_MASK = X2&lt;br /&gt;
** BLEND = X3&lt;br /&gt;
** MODULATE = X4&lt;br /&gt;
** REPLACE = X5&lt;br /&gt;
** PASS = X6&lt;br /&gt;
** ADD = X7&lt;br /&gt;
** SUB = X8&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CoordTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** UV = X0&lt;br /&gt;
** REFLECTION = X1&lt;br /&gt;
** HILIGHT = X2&lt;br /&gt;
** SHADOW = X3&lt;br /&gt;
** TOON = X4&lt;br /&gt;
** GRADATION = X5&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MagFilterEnum&#039;&#039;&#039;:&lt;br /&gt;
** GX_NEAR = 00 00 00 00&lt;br /&gt;
** GX_LINEAR = 00 00 00 01&lt;br /&gt;
** GX_NEAR_MIP_NEAR = 00 00 00 02&lt;br /&gt;
** GX_LIN_MIP_NEAR = 00 00 00 03&lt;br /&gt;
** GX_NEAR_MIP_LIN = 00 00 00 04&lt;br /&gt;
** GX_LIN_MIP_LIN = 00 00 00 05&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WrapEnum&#039;&#039;&#039;:&lt;br /&gt;
** CLAMP = 00 00 00 00&lt;br /&gt;
** REPEAT = 00 00 00 01&lt;br /&gt;
** MIRROR = 00 00 00 02&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Material&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 1 byte - AMB_R - (ambient)&lt;br /&gt;
* 1 byte - AMB_G&lt;br /&gt;
* 1 byte - AMB_B&lt;br /&gt;
* 1 byte - AMB_A&lt;br /&gt;
* 1 byte - DIF_R - (diffuse)&lt;br /&gt;
* 1 byte - DIF_G&lt;br /&gt;
* 1 byte - DIF_B&lt;br /&gt;
* 1 byte - DIF_A&lt;br /&gt;
* 1 byte - SPC_R - (specular)&lt;br /&gt;
* 1 byte - SPC_G&lt;br /&gt;
* 1 byte - SPC_B&lt;br /&gt;
* 1 byte - SPC_A&lt;br /&gt;
* 4 bytes - float - alpha&lt;br /&gt;
* 4 bytes - float - shininess&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 bytes - Inconnu&lt;br /&gt;
* 4 bytes - next_offset - pobj&lt;br /&gt;
* 4 bytes - vertex_attr_list_offset&lt;br /&gt;
* 2 bytes  - Flags - PObjFlagsEnum&lt;br /&gt;
* 2 bytes - display_list_size - number of 0x20 (32) byte blocks occupied by display list data&lt;br /&gt;
* 4 bytes - display_list_offset&lt;br /&gt;
4 bytes - weight_list_offset - ? Verify that the envelope_weights array is indeed found at this offset.&lt;br /&gt;
As indicated by next_offset, it is a list of meshes to be displayed for a given material referenced by a dobj. PObj contains the offsets of vertex attributes / display list / joint weight list, which is sufficient and allows interpreting and processing vertex, normal, and texture coordinates.&lt;br /&gt;
&lt;br /&gt;
Vertex attributes are the most important - the specified parameters control everything: from the format to the size of the data for each vertex, normal, and texture coordinates, and how these values are dimensioned (scaled) based on the presence and size of each index value appearing in the display list information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
Unknown0 = 00 01&lt;br /&gt;
Unknown1 = 00 02&lt;br /&gt;
** ANIM = 00 08&lt;br /&gt;
** SHAPE_ANIM = 10 00&lt;br /&gt;
** ENVELOPE = 20 00&lt;br /&gt;
** CULLBACK = 40 00&lt;br /&gt;
** CULLFRONT = 80 00&lt;br /&gt;
&lt;br /&gt;
=== EnvelopeWeights : (0x? octets) ===&lt;br /&gt;
* 4 bytes - envelope_count&lt;br /&gt;
* [envelope_count]:&lt;br /&gt;
** 4 bytes - float - weight&lt;br /&gt;
** 4 bytes - pad ?&lt;br /&gt;
* 4 bytes - jobj_list_offset&lt;br /&gt;
&lt;br /&gt;
=== not verified yet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IMAGE_HEADER&#039;&#039;&#039; :&lt;br /&gt;
** 4 bytes - image_offset - image data&lt;br /&gt;
** 2 bytes - width&lt;br /&gt;
** 2 bytes - height&lt;br /&gt;
** 4 bytes - image_format&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;PALETTE_HEADER&#039;&#039;&#039; : (0x10 bytes)&lt;br /&gt;
** 4 bytes - palette_offset - palette data&lt;br /&gt;
** 4 bytes - palette_format&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 2 bytes - color_count&lt;br /&gt;
** 2 bytes - Unknown&lt;br /&gt;
The image_offset and palette_offset are often shared by several textures. Knowing this allows you to find all the information about the textures&#039; image data (width, height, format), as well as the format and the number of colors in the palette/TLUT.&lt;br /&gt;
&lt;br /&gt;
The image format does not determine the total number of colors in the palette it uses. For example, an 8-bit indexed image would have a maximum of 256 colors, but only 136 or 221 colors may be currently used. In this way, the palette will not use the total size it should use.&lt;br /&gt;
&lt;br /&gt;
Images follow the structure generally used by the GameCube:&lt;br /&gt;
&lt;br /&gt;
IMAGE FORMATS :&lt;br /&gt;
* case 0: //i4&lt;br /&gt;
* case 1: //i8&lt;br /&gt;
* case 2: //i4a4&lt;br /&gt;
* case 3: //i8a8&lt;br /&gt;
* case 4: //r5g6b5&lt;br /&gt;
* case 5: //rgb5a3&lt;br /&gt;
* case 6: //r8g8b8a8&lt;br /&gt;
* case 8: //index4&lt;br /&gt;
* case 9: //index8&lt;br /&gt;
* case 0xa: //index14x2&lt;br /&gt;
* case 0xe: //s3tc1&lt;br /&gt;
&lt;br /&gt;
The indexed formats also use palette/TLUT information, and the data can appear in various formats:&lt;br /&gt;
&lt;br /&gt;
PALETTE FORMATS :&lt;br /&gt;
* case 0: //ia8&lt;br /&gt;
* case 1: //r5g6b5&lt;br /&gt;
* case 2: //rgb5a3&lt;br /&gt;
&lt;br /&gt;
---&amp;gt; &amp;quot;Joint Data - Accessing Geometry, Mesh, and Vertex Attributes&amp;quot; https://smashboards.com/threads/melee-dat-format.292603/&lt;br /&gt;
&lt;br /&gt;
// Declaration of a vertex and attribute information&lt;br /&gt;
// attr, type, cnt, data_type, flags?, file_offset&lt;br /&gt;
* ATTR_DATA&lt;br /&gt;
** 4 bytes - GXAttr     vtx_attr_offset - attr&lt;br /&gt;
** 4 bytes - GXAttrType vtx_attr_type   - index_type&lt;br /&gt;
** 4 bytes - GXCompCnt  comp_cnt        - cnt&lt;br /&gt;
** 4 bytes - GXCompType comp_type       - data_type	&lt;br /&gt;
** 1 bytes - scale&lt;br /&gt;
** 1 bytes - unknown&lt;br /&gt;
** 2 bytes - vtx_stride&lt;br /&gt;
** 2 bytes - data_offset&lt;br /&gt;
&lt;br /&gt;
vertex_attr_offset points to a list of vertex attributes. The number of these attributes is not provided. The data in this structure follows the information and types designed by the GameCube/WII architecture and its API. The list is terminated by a specific value of vtx_attr signaling the end of this list. With access to the SDK documentation, it is strongly recommended to read the section about &amp;quot;vertex attributes and other specifications.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The value of vtx_attr determines the type of data that this attribute represents and can indicate a number of native types used for passing data between software and hardware interfaces.&lt;br /&gt;
&lt;br /&gt;
The possible values are as follows:&lt;br /&gt;
enum GXAttr (4 bytes)&lt;br /&gt;
** GX_VA_PNMTXIDX = 0, // position/normal matrix index&lt;br /&gt;
** GX_VA_TEX0MTXIDX, // texture 0 matrix index&lt;br /&gt;
** GX_VA_TEX1MTXIDX, // texture 1 matrix index&lt;br /&gt;
** GX_VA_TEX2MTXIDX, // texture 2 matrix index&lt;br /&gt;
** GX_VA_TEX3MTXIDX, // texture 3 matrix index&lt;br /&gt;
** GX_VA_TEX4MTXIDX, // texture 4 matrix index&lt;br /&gt;
** GX_VA_TEX5MTXIDX, // texture 5 matrix index&lt;br /&gt;
** GX_VA_TEX6MTXIDX, // texture 6 matrix index&lt;br /&gt;
** GX_VA_TEX7MTXIDX, // texture 7 matrix index&lt;br /&gt;
** GX_VA_POS = 9, // position&lt;br /&gt;
** GX_VA_NRM, // normal&lt;br /&gt;
** GX_VA_CLR0, // color 0&lt;br /&gt;
** GX_VA_CLR1, // color 1&lt;br /&gt;
** GX_VA_TEX0, // input texture coordinate 0&lt;br /&gt;
** GX_VA_TEX1, // input texture coordinate 1&lt;br /&gt;
** GX_VA_TEX2, // input texture coordinate 2&lt;br /&gt;
** GX_VA_TEX3, // input texture coordinate 3&lt;br /&gt;
** GX_VA_TEX4, // input texture coordinate 4&lt;br /&gt;
** GX_VA_TEX5, // input texture coordinate 5&lt;br /&gt;
** GX_VA_TEX6, // input texture coordinate 6&lt;br /&gt;
** GX_VA_TEX7, // input texture coordinate 7&lt;br /&gt;
&lt;br /&gt;
** GX_POS_MTX_ARRAY, // position matrix array pointer&lt;br /&gt;
** GX_NRM_MTX_ARRAY, // normal matrix array pointer&lt;br /&gt;
** GX_TEX_MTX_ARRAY, // texture matrix array pointer&lt;br /&gt;
** GX_LIGHT_ARRAY, // light parameter array pointer&lt;br /&gt;
** GX_VA_NBT, // normal, bi-normal, tangent&lt;br /&gt;
** GX_VA_MAX_ATTR, // maximum number of vertex attributes&lt;br /&gt;
&lt;br /&gt;
** GX_VA_NULL = 0xff // NULL attribute (to mark the end of lists)&lt;br /&gt;
&lt;br /&gt;
All the necessary data to represent a mesh can be specified and indexed in one way or another. Similarly, GX_VA_TEX0MTXIDX, GX_VA_CLR0, and others are also possible - the most frequent values in the SSBM data are: GX_VA_PNMTXIDX, GX_VA_POS, GX_VA_NRM, and GX_VA_TEX0. This is to be expected as joint matrices, vertex positions/normals, and texture coordinates respectively are probably the most basic elements needed to display a textured mesh, whether static or animated.&lt;br /&gt;
&lt;br /&gt;
When the value of vtx_attr == GX_VA_NULL (0xFF), the end of the vertex attribute array has been reached.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The vtx_attr_type values is actually associated with how the value is indexed, and can thus also determine the size of the index value within the display list data.&lt;br /&gt;
&lt;br /&gt;
* 4 bytes - enum GXAttrType&lt;br /&gt;
** GX_NONE    = 0,&lt;br /&gt;
** GX_DIRECT,&lt;br /&gt;
** GX_INDEX8,&lt;br /&gt;
** GX_INDEX16&lt;br /&gt;
&lt;br /&gt;
* Structures COLL_DATA : (collision data)&lt;br /&gt;
** 4 bytes - vertex_offset (2 floats per entry corresponding to probably 2D data)&lt;br /&gt;
** 4 bytes - vertex_count&lt;br /&gt;
** 4 bytes - index_offset&lt;br /&gt;
** 4 bytes - index_count&lt;br /&gt;
** 4 bytes [5] - Unknown&lt;br /&gt;
*** 2 bytes - index_start&lt;br /&gt;
*** 2 bytes - index_count&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
** 4 bytes - Unknown&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=File_formats_reverse_engineering&amp;diff=1319</id>
		<title>File formats reverse engineering</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=File_formats_reverse_engineering&amp;diff=1319"/>
		<updated>2023-09-20T09:18:43Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Reverse of File Formats =&lt;br /&gt;
This page is intended for research on reverse engineering file formats and ongoing experiments.&lt;br /&gt;
== Archives / Compressed Files ==&lt;br /&gt;
The &amp;quot;[http://wiki.xentax.com/index.php/DGTEFF Definitive Guide To Exploring File Formats]&amp;quot; is a good starting point for understanding file organization. We can potentially create a list of possible fields that may appear in the header of the studied file to identify different header elements and their functions.&lt;br /&gt;
&lt;br /&gt;
== Variable Typing ==&lt;br /&gt;
[[File:Typage &amp;amp; compilation.png|800px|center|thumb|thumbnail]]&lt;br /&gt;
When studying files that structure data from a program, it&#039;s important to keep in mind that types are translated by the compiler for a specific architecture. As a result, the same value can be represented in binary in different ways.&lt;br /&gt;
&lt;br /&gt;
== File Sizes ==&lt;br /&gt;
=== GCD and File Size ===&lt;br /&gt;
The idea here is to observe file sizes to identify characteristics of certain archives, such as header size and the possible use of fixed-size &amp;quot;containers&amp;quot; or chunks.&lt;br /&gt;
&lt;br /&gt;
To do this, we take all the file sizes in bytes of each file in the studied format. We calculate the greatest common divisor (GCD) of these sizes, and if the GCD is significant, it indicates a potential header and chunks of size equal to the GCD.&lt;br /&gt;
&lt;br /&gt;
=== GCD and Variable Header Size ===&lt;br /&gt;
In cases where a file has a header size different from the chunk size, we can test GCDs by subtracting an increasing header size.&lt;br /&gt;
&lt;br /&gt;
The structure of the searched file would be as follows:&lt;br /&gt;
&lt;br /&gt;
|---- HEADER ----|------------ CHUNK 1 ------------|------------ CHUNK 2 ------------|------------ CHUNK N ------------|&lt;br /&gt;
&lt;br /&gt;
We will use a threshold above which we will display the header size and GCD.&lt;br /&gt;
&lt;br /&gt;
== Searching for Known Properties ==&lt;br /&gt;
=== Brute-Force of a Fixed Offset ===&lt;br /&gt;
In cases where we can gather a set of properties that can be clearly attributed to a group of files, it may be possible to brute-force to find the location in the file where these properties are stored.&lt;br /&gt;
&lt;br /&gt;
The first step is to search for a set of data to gather them into a CSV file. These data should be associated with a file name. For example, we can scrape this data from fan websites.&lt;br /&gt;
&lt;br /&gt;
The second step is to program the search for many coherent encodings for each property in the CSV. We will search for all these encodings in all files from position 0 to the end of the smallest file in the set. Then we will check if the property appears at the given position. If it is not present, we will move to the next position.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important to note that types are translated differently by compilers. We should test different representations (signed numbers in one&#039;s complement, two&#039;s complement, sign and absolute value, fixed-point, floating-point, with different sign/mantissa/exponent sizes, etc.).&lt;br /&gt;
&lt;br /&gt;
=== Sets and Masks ===&lt;br /&gt;
Here again, we have a dataset with properties related to the studied files. The goal is to group properties by values and study changes in associated files to identify the potential position of a property.&lt;br /&gt;
&lt;br /&gt;
For files:&lt;br /&gt;
&lt;br /&gt;
A = Set(files WITH value &amp;quot;a&amp;quot; for the property)&lt;br /&gt;
B = Set(files WITHOUT value &amp;quot;a&amp;quot; for the property)&lt;br /&gt;
D = Mask file # of the same size as the file; we will put FF or bits set to 1 in places where the bit or byte may represent the property&lt;br /&gt;
For all A, if the byte at the studied offset is identical, we set the byte in D to FF; otherwise, we set it to 00.&lt;br /&gt;
For all B, if there exists a B that is identical to the byte in A, we set the byte in D to 0x00.&lt;br /&gt;
&lt;br /&gt;
We repeat the operation for all values of the property. To add flexibility, we can introduce error tolerance for a dataset that may contain errors or the presence of specially encoded values.&lt;br /&gt;
&lt;br /&gt;
The bit-wise approach poses an issue in comparing A and B. If the byte at position i is identical for A and B, then we remove the byte from the mask. But for bits, we need the exact size of the property&#039;s encoding because if the bit size is smaller, we may find values that are potentially identical for A and B, with the next or previous bit belonging to the property and differing. The same issue applies if the bit size is larger.&lt;br /&gt;
&lt;br /&gt;
This is why it&#039;s necessary to create multiple masks for each bit size. Randomly added similarities or differences with an incorrect bit size of the property&#039;s encoding nullify the mask, so we test by incrementing sizes and keep only the mask that produces a result.&lt;br /&gt;
&lt;br /&gt;
It&#039;s also important to note the overlap of the mask after a shift. For example, if we study bits from 0 to 4 and set the mask to 1111, we will subsequently study bits from 1 to 5 and potentially get 10000, which would erase the previous work. The idea would be to force bits to 1 and not reset them when they are set to 1 in the A and B comparison. We can potentially create two masks A &amp;lt;-&amp;gt; A and A &amp;lt;-&amp;gt; B and then use the logical AND.&lt;br /&gt;
&lt;br /&gt;
== Tools to Test ==&lt;br /&gt;
&lt;br /&gt;
https://hexinator.com/&lt;br /&gt;
&lt;br /&gt;
https://www.sweetscape.com/010editor/&lt;br /&gt;
&lt;br /&gt;
Test entropy with binwalk (1. in Doku).&lt;br /&gt;
&lt;br /&gt;
== Doku ==&lt;br /&gt;
&lt;br /&gt;
[https://archive.fosdem.org/2021/schedule/event/reverse_engineering/attachments/slides/4518/export/events/attachments/reverse_engineering/slides/4518/Reverse_Engineering_of_binary_File_Formats.pdf Reverse Engineering of binary File Formats]&lt;br /&gt;
&lt;br /&gt;
[http://www.iwriteiam.nl/Ha_HTCABFF.html http://www.iwriteiam.nl/Ha_HTCABFF.html] (Tools extraction is pending from the links)&lt;br /&gt;
&lt;br /&gt;
https://github.com/tylerha97/awesome-reversing (A comprehensive list to study, determine what relates to binary reverse engineering - see if there are other &amp;quot;awesome ..&amp;quot; lists)&lt;br /&gt;
&lt;br /&gt;
https://beginners.re/RE4B-FR.pdf (check the detailed table of contents and find sections related to binary reverse engineering)&lt;br /&gt;
&lt;br /&gt;
https://en.wikibooks.org/wiki/Reverse_Engineering/File_Formats&lt;br /&gt;
&lt;br /&gt;
[[Category:File format]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=GameCube_Tooling&amp;diff=1318</id>
		<title>GameCube Tooling</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=GameCube_Tooling&amp;diff=1318"/>
		<updated>2023-09-20T09:11:49Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
== Tools ==&lt;br /&gt;
=== [https://fr.dolphin-emu.org/download/ Dolphin Emulator] ===&lt;br /&gt;
Dolphin allows for the extraction of GameCube ISO files. It can be used in debug mode for stepping through PowerPC instructions, setting breakpoints, memory inspection/dumping, and more.&lt;br /&gt;
==== [https://github.com/aldelaro5/Dolphin-memory-engine Dolphin Memory Engine] ====&lt;br /&gt;
Dolphin Memory Engine utilizes Dolphin dumps (in debug mode: add -d when running Dolphin) to assign names to fixed memory addresses during execution. This enables sharing reverse engineering work on the game&#039;s memory.&lt;br /&gt;
&lt;br /&gt;
Documentation on symbol generation: [https://github.com/sepalani/MHTrIDA/wiki/Symbols Symbols]&lt;br /&gt;
&lt;br /&gt;
==== [https://github.com/Felk/dolphin Python Support for Dolphin Emulator] ====&lt;br /&gt;
Python support for AI/CPU scripting. The API allows reading and writing to memory, among other capabilities.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/Virtual-World-RE/NeoGF/tree/main/gcmtool gcmtool.py] (Virtual World RE) ===&lt;br /&gt;
gcmtool.py allows manipulation of GameCube files (GCM ISO format). It can extract all game files, as well as files related to GCM format operations. Its primary feature is patching the FST and the boot.bin file with a new boot.[[DOL_(File_format)|DOL]] file, a new apploader.img, and added, deleted, or modified game files. It aligns all file offsets according to a specified value, with a default alignment of 4. DVD files are also optimally positioned to minimize the GCM ISO size.&lt;br /&gt;
&lt;br /&gt;
Open-source &amp;amp; MIT license.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/Virtual-World-RE/NeoGF/tree/main/afstool afstool.py] (Virtual World RE) ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
Python3 script for unpacking/packing/rebuilding the [[AFS_(File_format)|AFS]] file format. Reconstruction of the Table of Contents (TOC) and Filename Directory (FD) is possible with control over all possible format parameters.&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
==== User Manual ====&lt;br /&gt;
&#039;&#039;&#039;Unpack source_afs.afs&#039;&#039;&#039; into the new default folder &#039;&#039;source_afs&#039;&#039;. If optional_dest_folder is specified, unpack into &#039;&#039;optional_dest_folder&#039;&#039;. If the AFS has an FD, it will use the OS modification date (mtime) to store the file&#039;s date.&lt;br /&gt;
&lt;br /&gt;
 afstool.py --unpack source_afs.afs optional_dest_folder&lt;br /&gt;
&lt;br /&gt;
Pack &#039;&#039;&#039;source_folder&#039;&#039;&#039; into the new default folder &#039;&#039;source_folder.afs&#039;&#039;. If optional_dest_file.afs is specified, pack into &#039;&#039;optional_dest_file.afs&#039;&#039;. If the AFS has an FD, it will use the OS modification date (mtime) to update the file&#039;s date in the AFS. The maximum size of each file is determined by the next offset in the [[AFS_(File_format)|AFS]] (file or system file). Without an FD, there are no restrictions on the size of the last file in the [[AFS_(File_format)|AFS]]. The names in the FD remain unchanged by this command.&lt;br /&gt;
&lt;br /&gt;
 afstool.py --pack source_folder optional_dest_file.afs&lt;br /&gt;
&lt;br /&gt;
Rebuilds the file system of an unpacked [[AFS_(File_format)|AFS]] folder using the afs_rebuild.conf and afs_rebuild.csv files. See below for more information on afs_rebuild.conf.&lt;br /&gt;
&lt;br /&gt;
 afstool.py --rebuild source_folder&lt;br /&gt;
&lt;br /&gt;
Displays statistics of the [[AFS_(File_format)|AFS]] or the unpacked folder of the [[AFS_(File_format)|AFS]]. Provides information about the header, TOC, FD, the entire memory mapping sorted by offsets (files and system files), information about the address space, and grouped duplicate file names.&lt;br /&gt;
&lt;br /&gt;
 afstool.py --stats path&lt;br /&gt;
&lt;br /&gt;
==== Extracted Files Structure ====&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;root&#039;&#039;&#039; folder contains all files from the [[AFS_(File_format)|AFS]].&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;sys&#039;&#039;&#039; folder contains all system files of the [[AFS_(File_format)|AFS]] and files generated by the program for various [[AFS_(File_format)|AFS]] manipulations:&lt;br /&gt;
    tableofcontent.bin - TOC system file: This file can be directly edited and is managed by the --pack command.&lt;br /&gt;
    filenamedirectory.bin - FD system file: This file is created only if there is an FD in the [[AFS_(File_format)|AFS]].&lt;br /&gt;
    filename_resolver.csv - Created when multiple files have the same name in the FD.&lt;br /&gt;
    afs_rebuild.conf - Modify this file to rebuild the [[AFS_(File_format)|AFS]].&lt;br /&gt;
    afs_rebuild.csv - Modify this file while taking into account the configurations from afs_rebuild.conf to reconstruct the [[AFS_(File_format)|AFS]].&lt;br /&gt;
&lt;br /&gt;
==== filename_resolver.csv ====&lt;br /&gt;
The --pack command does not change the names in the FD. This file is used in the packing process to automatically detect renamed files in the &#039;&#039;&#039;root&#039;&#039;&#039; folder and keep their initial index in the TOC (and FD). This file is generated automatically when:&lt;br /&gt;
* The FD is present and contains duplicates in the names; extracted files are then renamed &amp;quot;filename &#039;&#039;&#039;(N)&#039;&#039;&#039;.ext&amp;quot; with N: Integer,&lt;br /&gt;
* The FD is absent, and files are named by their index, for example: &amp;quot;00000000&amp;quot; for the very first file.&lt;br /&gt;
&lt;br /&gt;
Each line in the CSV contains an &amp;quot;index/unpacked_filename&amp;quot; pair. This CSV can be used to rename files, for example: &amp;quot;0/my_new_filename.ext&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==== afs_rebuild.conf ====&lt;br /&gt;
Each offset or index is written in hexadecimal with the prefix &#039;&#039;&#039;0x&#039;&#039;&#039;: 0xabcdef. The value &#039;&#039;&#039;auto&#039;&#039;&#039; will be used where possible.&lt;br /&gt;
&lt;br /&gt;
===== [Default] section =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;AFS_MAGIC&#039;&#039;&#039; : 0x41465300 or 0x41465320&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;files_rebuild_strategy&#039;&#039;&#039; : auto, index, offset, or mixed&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;files_rebuild_strategy&#039;&#039;&#039; is used to organize files (indexes, offsets, packed filenames if the FD is present) in the AFS. The rebuild strategy uses the automatically generated afs_rebuild.csv file during unpacking. If the root folder&#039;s file is absent from afs_rebuild.csv, all values will be generated automatically. Four strategies are available:&lt;br /&gt;
&lt;br /&gt;
    &#039;&#039;&#039;auto&#039;&#039;&#039; : Automatically rebuild all indexes and offsets of specified files (uses packed_filename to specify the filename in the FD if present). Indexes and offsets in the afs_rebuild.csv file will be ignored.&lt;br /&gt;
    &#039;&#039;&#039;index&#039;&#039;&#039; : Keeps the indexes of specified files (uses packed_filename if the FD is present). Offsets will be ignored.&lt;br /&gt;
    &#039;&#039;&#039;offset&#039;&#039;&#039; : Keeps the offsets of specified files (uses packed_filename if the FD is present). Indexes will be ignored.&lt;br /&gt;
    &#039;&#039;&#039;mixed&#039;&#039;&#039; : Keeps both indexes and offsets of specified files (uses packed_filename if the FD is present).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;filename_directory&#039;&#039;&#039; : True if the FD is present, False otherwise. If the value is True, the [FilenameDirectory] section must be present.&lt;br /&gt;
&lt;br /&gt;
===== [FilenameDirectory] section =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;toc_offset_of_fd_offset&#039;&#039;&#039; : The offset in the TOC of the FD offset is at the end of the TOC. In some AFS, there is padding at the end of the offset/length series. The value &#039;&#039;&#039;auto&#039;&#039;&#039; will be used where possible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;fd_offset&#039;&#039;&#039; : The FD is at the end of the [[AFS_(File_format)|AFS]]. The value &#039;&#039;&#039;auto&#039;&#039;&#039; will be used where possible.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;fd_last_attribute_type&#039;&#039;&#039; : The type of the last 4 bytes of each FD entry. Four values are possible:&lt;br /&gt;
    &#039;&#039;&#039;length&#039;&#039;&#039; : Use the file size.&lt;br /&gt;
    &#039;&#039;&#039;offset-length&#039;&#039;&#039; : Use the &amp;quot;offset/length/offset/length...&amp;quot; series.&lt;br /&gt;
    &#039;&#039;&#039;0xabcdef&#039;&#039;&#039; : Use a hexadecimal constant.&lt;br /&gt;
    &#039;&#039;&#039;unknown&#039;&#039;&#039; : The value is unknown. The Null value will be used.&lt;br /&gt;
&lt;br /&gt;
==== afs_rebuild.csv ====&lt;br /&gt;
&#039;&#039;&#039;afs_rebuild.csv&#039;&#039;&#039; contains entries describing how to pack files from the &#039;&#039;&#039;root&#039;&#039;&#039; folder into the AFS. Each offset or index value is stored in hexadecimal with the prefix &#039;&#039;&#039;0x&#039;&#039;&#039;: 0xabcdef. The value &#039;&#039;&#039;auto&#039;&#039;&#039; will be used for indexes and offsets where possible. Offsets must be aligned to the value 0x800 (2048). One line per selected file is added with constraints for packing using the format: &amp;quot;unpacked_filename/index/offset/packed_filename&amp;quot;, for example: &amp;quot;dummy (5).bin/0x12/0x80000/dummy.bin&amp;quot;. You can use the value &#039;&#039;&#039;auto&#039;&#039;&#039;, for example: &amp;quot;dummy (5).bin/auto/auto/dummy.bin&amp;quot;. For each empty block, only an offset/length pair with values aligned to 0x800 will be added, for example: &amp;quot;0x80000/0x5000&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
When configuring the rebuild, all lines containing files with no constraints from the afs_rebuild.csv file will be removed. Then, the &#039;&#039;&#039;auto&#039;&#039;&#039; value will be added to offsets and indexes with no constraints. During the rebuild, the filename_resolver.csv file is automatically deleted. Changes to file names will be preserved by adding entries with unpacked_filename and index (and packed_filename if the FD is present) in this file.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
Open-source &amp;amp; MIT license.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/Virtual-World-RE/NeoGF/tree/main/doltool doltool.py] ===&lt;br /&gt;
Python 3 script for manipulating the [[DOL_(File_format)|DOL]] file format. It also provides detailed statistics on the [[DOL_(File_format)|DOL]] and its composition, and can patch a [[DOL_(File_format)|DOL]] using an Action Replay Codes file.&lt;br /&gt;
&lt;br /&gt;
Open-source &amp;amp; MIT license.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/MaikelChan/AFSPacker AFSPacker] ===&lt;br /&gt;
AFSPacker is user-friendly and functional. This software allows for extraction and patching of files in the [[AFS_(File_format)|AFS]] format.&lt;br /&gt;
&lt;br /&gt;
* AFSPacker considers the last 4 bytes of FD entries as unknown. These bytes are sometimes used to describe the size of packed files.&lt;br /&gt;
* It is not possible to specify the offset of the FD in the TOC. This offset can be placed directly after the TOC or after padding following the TOC. This can be important if the main executable handles files with a hardcoded file offset relative to the start of the [[AFS_(File_format)|AFS]].&lt;br /&gt;
* Dates are not retained during extraction, resulting in data loss with each repack.&lt;br /&gt;
&lt;br /&gt;
Open-source &amp;amp; MIT license.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.moddingway.com/file/270.html AFS Explorer] ===&lt;br /&gt;
AFS Explorer should be avoided in projects where afstool.py can be used. The terms of use are restrictive, and command-line functionality is absent.&lt;br /&gt;
The source code does not appear to be accessible, which is another limiting factor.&lt;br /&gt;
&lt;br /&gt;
=== [http://www.wiibackupmanager.co.uk/gcit.html GameCube Iso Tools] ===&lt;br /&gt;
Tool for manipulating GameCube ISOs. It allows extraction of the ISO into a GCReEx or DiscEx format folder. It can also repack into an ISO format.&amp;lt;br&amp;gt;&lt;br /&gt;
Note: The repacked ISO is automatically &amp;quot;compressed&amp;quot; on Windows. The destination folder must be created in advance.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Commands:&amp;lt;br&amp;gt;&lt;br /&gt;
 gcit.exe iso.iso -f gcreex -d extract -q&lt;br /&gt;
 gcit.exe extract\Game_folder -f fulliso -d repack.iso -q&lt;br /&gt;
&lt;br /&gt;
Dolphin Emulator may return an error for repack.iso: &amp;quot;repack.iso is not a valid GCM/ISO file, or is not a GC/Wii ISO.&amp;quot;&lt;br /&gt;
In GCReEx format, it is noticed that the padding at the end of the apploader is different from that generated by Dolphin Emulator. Additionally, many files extracted with gcit.exe have padding added to the end compared to the actual size indicated in the DVD&#039;s fst.bin.&lt;br /&gt;
&lt;br /&gt;
=== [https://wit.wiimm.de/ Wiimms ISO Tool] ===&lt;br /&gt;
wit allows manipulation of GameCube ISOs. On Windows, wit can be used without installation by using the bin/wit.exe file.&lt;br /&gt;
&lt;br /&gt;
Extraction of files from an ISO (in [https://wit.wiimm.de/info/composing.html fst] format):&lt;br /&gt;
wit extract mkw.iso --dest=mkw/&lt;br /&gt;
&lt;br /&gt;
Please note that repacking into the ISO via the copy command does not seem to produce the same ISO (over 4 GB file). It needs to be investigated if there are options to reproduce the correct ISO.&lt;br /&gt;
&lt;br /&gt;
https://github.com/Wiimm/wiimms-iso-tools&lt;br /&gt;
&lt;br /&gt;
Open-source &amp;amp; GPL v2+ license.&lt;br /&gt;
&lt;br /&gt;
=== GC Rebuilder 1.1 ===&lt;br /&gt;
Please note that this project is no longer developed, and the size of the main executable is incorrect.&lt;br /&gt;
&lt;br /&gt;
Source code: https://github.com/bsv798/gcrebuilder&lt;br /&gt;
&lt;br /&gt;
The command-line interface is present, but no specific documentation is provided.&lt;br /&gt;
&lt;br /&gt;
=== [https://github.com/sup39/GeckoLoader GeckoLoader] ===&lt;br /&gt;
Gecko Loader allows patching a [[DOL_(File_format)|DOL]] using a list of [https://github.com/dolphin-emu/dolphin/tree/master/docs/ActionReplay Action Replay Codes] or [http://wiigeckocodes.github.io/codetypedocumentation.html GeckoCodes]. The software also allows hooking functions (VI, etc.).&lt;br /&gt;
&lt;br /&gt;
For example, there may be a .bss patch with PowerPC bytecode and values to patch. The EntryPoint is changed to reach this new code, and after loading into memory, the code modifies the values in memory.&lt;br /&gt;
&lt;br /&gt;
This is considered a bad practice because .bss contains uninitialized variables (int a;). Normally, they should be Null / 0. Additionally, for write-only codes, it is preferable to patch the .text or .data sections of the [[DOL_(File_format)|DOL]] directly when possible.&lt;br /&gt;
&lt;br /&gt;
Open-source &amp;amp; GPL v3 license.&lt;br /&gt;
&lt;br /&gt;
[[Category:GameCube]]&lt;br /&gt;
[[Category:Tools]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=GCM_(File_format)&amp;diff=1317</id>
		<title>GCM (File format)</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=GCM_(File_format)&amp;diff=1317"/>
		<updated>2023-09-20T09:07:27Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This article is about the GCM file format.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ The GameCube mini DVD use GCM file format (Gamecube Disc Image with extension gcm or iso) and can be divided in 6 blocks:&lt;br /&gt;
! Block Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| boot.bin || Base Information - Disc Header&lt;br /&gt;
|-&lt;br /&gt;
| bi2.bin || Additional Information - Debug, locales - Disc Header Information&lt;br /&gt;
|-&lt;br /&gt;
| apploader.img || Main Executable Loader&lt;br /&gt;
|-&lt;br /&gt;
| fst.bin || File String Table&lt;br /&gt;
|-&lt;br /&gt;
| boot.dol / elf || Main Executable&lt;br /&gt;
|-&lt;br /&gt;
| Files and Folders Tree || User Space Files and Folders Tree&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The file system is handled by the GameCube and we can see that files are loaded by names no matter in which order they have been stored (Dolphin Emulator).&lt;br /&gt;
&lt;br /&gt;
The dol file and FST are stored after de apploader.img. The dol can be after or before FST. Most of the time dol is before FST. All GCM ROMs have a fixed length (mini DVD length): 1 459 978 240 bytes. Because of that there is often empty spaces between files in the game released containing junk datas or old values partially overridden by new ones during devs. This empty spaces contains unused information. It could be used for mini DVD cyphering hardening. The question could be &amp;quot;does this junks data are the sames in all released mini DVD of the game?&amp;quot; An intersting thing is that burning data at the out border of the DVD increases performances when hardware DVD read head access to it.&lt;br /&gt;
&lt;br /&gt;
== GCM/ISO format Architecture ==&lt;br /&gt;
=== boot.bin ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ boot.bin file is at beginning of the mini DVD and its length is 0x440 bytes. We found on it:&lt;br /&gt;
! Offset (hex) !! Size (bytes) !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 4 || GameCode (ASCII) - A-Za-z0-9&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 2 || MakerCode (ASCII) - A-Za-z0-9&lt;br /&gt;
|-&lt;br /&gt;
| 0x06 || 1 || DiscNumber (0-98)&lt;br /&gt;
|-&lt;br /&gt;
| 0x07 || 1 || Version (0-99)&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || 1 || AudioStreaming Flag (0 or 1)&lt;br /&gt;
|-&lt;br /&gt;
| 0x09 || 1 || StreamBufferSize (0-15)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || DVDMagic (0xc2339f3d)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 64 || GameName (ASCII and possibly Kanji)&lt;br /&gt;
|-&lt;br /&gt;
| 0x420 || 4 || DolOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x424 || 4 || FstOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x428 || 4 || FstLen&lt;br /&gt;
|-&lt;br /&gt;
| 0x42C || 4 || FstMaxLen (often corresponds to FST length but reserved for other mini DVDs)&lt;br /&gt;
|-&lt;br /&gt;
| 0x430 || 4 || FST Memory Address&lt;br /&gt;
|-&lt;br /&gt;
| 0x434 || 4 || UserPosition (Offset on mini DVD where the first game files begin)&lt;br /&gt;
|-&lt;br /&gt;
| 0x438 || 4 || UserLength (Total length where all files are located, may contain empty spaces)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== bi2.bin ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ bi2.bin files has a length of 0x2000 bytes and reside just after boot.bin (offset 0x440 of the GCM). It contains locales informations and debug configurations.&lt;br /&gt;
! Offset (hex) !! Size (bytes) !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00 || 4 || DebugMonitorSize&lt;br /&gt;
|-&lt;br /&gt;
| 0x04 || 4 || SimulatedMemorySize&lt;br /&gt;
|-&lt;br /&gt;
| 0x08 || 4 || ArgumentOffset&lt;br /&gt;
|-&lt;br /&gt;
| 0x0C || 4 || [[#Debug Flags|DebugFlag]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || TrackLocation (or MetroTRK for some documentations)&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || TrackSize (or MetroTRK for some documentations)&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || [[#Country Codes|CountryCode]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || TotalDisc (Total number of discs, &amp;lt;= 99)&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || LongFileNameSupport (1 = supported, 0 = constrained to 8.3 format)&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || PadSpec (Controller version for PADSetSpec)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || DolLimit (Max length of the sum of data and text sections)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Debug Flags&lt;br /&gt;
! Value!! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal Boot&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Devkit Set to 0; MetroTRK Set to AMC DDH hardware&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Devkit Set to 1; MetroTRK Set to GDEV hardware&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Devkit Set to 2; MetroTRK Set to BBA&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Country Codes&lt;br /&gt;
! Value!! Pays&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Japan&lt;br /&gt;
|-&lt;br /&gt;
| 1 || USA&lt;br /&gt;
|-&lt;br /&gt;
| 2 || PAL&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Korea&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== apploader.img ===&lt;br /&gt;
The [https://www.gc-forever.com/wiki/index.php?title=apploader apploader] is a file, loaded by the GameCube BIOS (also called the [https://wiki.dolphin-emu.org/index.php?title=GameCube_Main_Menu Initial Program Loader / IPL]), that creates virtual memory spaces and rebase the dol datas in this areas before starting it. Apploader is at offset 0x2440 just after the bi2.bin. The GCM/iso doesn&#039;t store any name of it so it&#039;s name depend to the software used to extract it: AppLoader.ldr / apploader.img (dolphin Emulator) and so on.&lt;br /&gt;
&lt;br /&gt;
The apploader length is calculated with it&#039;s header informations:&lt;br /&gt;
* Header has a length of 0x20 bytes:&lt;br /&gt;
** 0 - 10 bytes - Version&lt;br /&gt;
** 0x10 - 4 bytes - entry_point&lt;br /&gt;
** 0x14 - 4 bytes - size&lt;br /&gt;
** 0x18 - 4 bytes - trailer_size&lt;br /&gt;
* apploader_size is at offset 0x14 of the apploader so at offset 0x2454 of the GCM/iso.&lt;br /&gt;
* trailer_size is at offset 0x18 of the apploader so at offset 0x2458 of the GCM/iso. The trailer_size is an empty space reserved for further apploader updates.&lt;br /&gt;
&lt;br /&gt;
=== boot.dol ===&lt;br /&gt;
The [[DOL (File format)|dol]] file format is an executable compiled for Gekko powerpc RISC architecture. It&#039;s [http://wiki.tockdom.com/wiki/DOL_(File_Format) header] has a length of 0x100 bytes and we calculate it&#039;s total length by summing the header length with all 18 sections in it. At offset 0x90 we found 18 uint of 4 bytes (big endian) containing the length of the 18 sections.&lt;br /&gt;
&lt;br /&gt;
=== File String Table ===&lt;br /&gt;
The FST allow to pack the files and folders tree of the game and is divided in two blocks:&lt;br /&gt;
* The first one contains FST entries (folders and files) in Big Endian.&lt;br /&gt;
* The second one is the name_block which contains names of folders and files terminated by a NULL byte (0x00) in Little Endian.&lt;br /&gt;
&lt;br /&gt;
In the first block we index every folders and files beginning with the index 1. Every folder or file is translated in a 12 bytes entry. The first entry is the root with index 0.&lt;br /&gt;
&lt;br /&gt;
The 12 bytes for a folder entry:&lt;br /&gt;
* 1 byte for type, folder=0x01.&lt;br /&gt;
* 3 bytes uint - name_block name offset, relative to the start of the name_block.&lt;br /&gt;
* 4 bytes uint - index of the parent folder.&lt;br /&gt;
* 4 bytes uint - index of the next file or folder outside of it.&lt;br /&gt;
&lt;br /&gt;
The 12 bytes for a file entry:&lt;br /&gt;
* 1 byte for type, file=0x00.&lt;br /&gt;
* 3 bytes uint - name_block name offset relative to the start of the name_block.&lt;br /&gt;
* 4 bytes uint - file offset relative to the start of the GCM/iso.&lt;br /&gt;
* 4 bytes uint - file length.&lt;br /&gt;
&lt;br /&gt;
The root node is at the beginning of the FST and has the 3 bytes name_block name offset equal to 0x00 and the 4 bytes of the parent folder id also equal to 0x00. The index of the next file is equal to the total number of files and folders packed in the GCM/iso user space. We can find the name_block offset by multiplying this total by 12 and adding 12 to it (the root node length).&lt;br /&gt;
&lt;br /&gt;
The align is important when building boot.bin and FST and is generaly aligned to 4. If adx/sfd or audio files are packed then it&#039;s often aligned to 0x800 bytes. When unaligned the game could crash or song are not loaded correctly.&lt;br /&gt;
&lt;br /&gt;
JAP mini DVD contains non utf-8 chars like JIS charsets in the name_block. If using the Virtual World RE tool [https://github.com/Virtual-World-RE/NeoGF/tree/main/gcmtool gcmtool.py] then you have to install this charsets in your OS. When Dolphin Emulator extract this JAP files it converts the original charset to utf-8.&lt;br /&gt;
&lt;br /&gt;
The sorting of files in the FST is often case insensitive and special chars are sorted before letters. However some FST are arbitrary sorted and we found sometimes duplicated files like the dol or even the apploader also packed in the user space.&lt;br /&gt;
&lt;br /&gt;
== Extraction formats ==&lt;br /&gt;
&lt;br /&gt;
GCReEx extracted files are as following:&lt;br /&gt;
 sys:&lt;br /&gt;
 |- apploader.img&lt;br /&gt;
 |- boot.bin (Disc Header)&lt;br /&gt;
 |- bi2.bin  (Disc Header Information)&lt;br /&gt;
 |- fst.bin  (FileStringTable)&lt;br /&gt;
 \- main.dol (&amp;quot;Executable&amp;quot; DOL)&lt;br /&gt;
 root:&lt;br /&gt;
 |- banner.bnr&lt;br /&gt;
 \+ ALL GAME DATA (AFS, and so on.)&lt;br /&gt;
&lt;br /&gt;
DiscEx extracted files are as following:&lt;br /&gt;
 sys:&lt;br /&gt;
 |- apploader.img&lt;br /&gt;
 |- boot.bin (Information de base du jeu)&lt;br /&gt;
 \- bi2.bin  (Information supplémentaires)&lt;br /&gt;
 game.iso : Repack copy of original iso.&lt;br /&gt;
&lt;br /&gt;
We find many others formats.&lt;br /&gt;
&lt;br /&gt;
This wiki about the [https://wiki.gbatemp.net/wiki/NKit/Discs#Disc_Header nkit format] offer a very good documentation about the GCM file format.&lt;br /&gt;
&lt;br /&gt;
[[Category:File format]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=DOL_(Gotcha_Force)&amp;diff=1316</id>
		<title>DOL (Gotcha Force)</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=DOL_(Gotcha_Force)&amp;diff=1316"/>
		<updated>2023-09-18T16:05:00Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This article is about Gotcha Force DOL file format and ongoing researchs on it. See [[DOL (File format)]] for DOL file format description.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Research | 3| Research on how functions works and how the dol works is nedded. }}&lt;br /&gt;
&lt;br /&gt;
== Memory map ==&lt;br /&gt;
The dol file is mapped in memory and the free available space remaining is next used to create the Arena containing Heaps. For instance we found Warehouse variables in the EU dol mapped in the interval [80593190:80598044[.&lt;br /&gt;
&lt;br /&gt;
So patching the dol is hard because we have to find unused free space in the memory. The [https://www.gc-forever.com/wiki/index.php?title=Apploader apploader reverse engineering] shows that max dol mapping address in memory are:&lt;br /&gt;
* 0x80700000  // production boards&lt;br /&gt;
* 0x81200000  // development boards&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15);&amp;quot;&amp;gt;&lt;br /&gt;
In production we can override MetroTRK memory areas or even override apploader trailer before the bootrom/IPL area. Further investigations has to be done on the [[GCM (File format)|iso/GCM]] sys to see how debug memory is mapped in debug mode (apploader vars used in the apploader).&lt;br /&gt;
* Is it possible to know where exactly MetroTRK is mapped?&lt;br /&gt;
* Is there any other libs/datas unused in dol?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* It&#039;s perfectly possible and tested to patch the apploader trailer and raise the trailer size with [[GCM (File format)|GCM/iso]] patch. It give us 0x100000 bytes available.&lt;br /&gt;
&lt;br /&gt;
The dol entry_point call the __init_registers procedure which will set the reserved following General Purpose Registers:&lt;br /&gt;
* R1 (stack)&lt;br /&gt;
* R2 (_SDA2_BASE_) - This is the read only _SDA2_.&lt;br /&gt;
* R13 (_SDA_BASE_) - This is the read / write _SDA_.&lt;br /&gt;
&#039;&#039;&#039;S&#039;&#039;&#039;mall &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;A&#039;&#039;&#039;nchors are used with a signed short offset (-0x8000 à +0x7fff).&lt;br /&gt;
* -0x8000(R13) = address of .sdata followed by .sbss&lt;br /&gt;
* -0x8000(R2) = address of .sdata2 followed by .sbss2&lt;br /&gt;
* R1 = often the .sbss2 end address + 0x10000&lt;br /&gt;
&lt;br /&gt;
So often only a part of available SDA negative offsets are used for R2 and R13 using -0x8000 as start.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== USA ===&lt;br /&gt;
Entry point: 80003154&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
 | Section | Offset   | Address  | Length   | Used  |&lt;br /&gt;
 |---------|----------|----------|----------|-------|&lt;br /&gt;
 | text0   | 00000100 | 80003100 | 000024e0 | True  |&lt;br /&gt;
 | text1   | 000025e0 | 800055e0 | 002aab80 | True  |&lt;br /&gt;
 | text2   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text3   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text4   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text5   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text6   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data7   | 002ad160 | 802b0160 | 00000020 | True  |&lt;br /&gt;
 | data8   | 002ad180 | 802b0180 | 00000020 | True  |&lt;br /&gt;
 | data9   | 002ad1a0 | 802b01a0 | 0000acc0 | True  |&lt;br /&gt;
 | data10  | 002b7e60 | 802bae60 | 000f42c0 | True  |&lt;br /&gt;
 | data11  | 003ac120 | 804335a0 | 00002b20 | True  |&lt;br /&gt;
 | data12  | 003aec40 | 80436a20 | 00006ae0 | True  |&lt;br /&gt;
 | data13  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data14  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data15  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data16  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data17  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
&lt;br /&gt;
* bss: address:803af140 length:0008e3e8&lt;br /&gt;
* R1 = 8044d528&lt;br /&gt;
* R2 = 8043ea20&lt;br /&gt;
* R13 = 8043b5a0&lt;br /&gt;
&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
 | Section     | beg_addr | end_addr | length   |&lt;br /&gt;
 |-------------|----------|----------|----------|&lt;br /&gt;
 | system      | 80000000 | 80003100 | 00003100 |&lt;br /&gt;
 | .text0      | 80003100 | 800055e0 | 000024e0 |&lt;br /&gt;
 | .text1      | 800055e0 | 802b0160 | 002aab80 |&lt;br /&gt;
 | .ctors      | 802b0160 | 802b0180 | 00000020 |&lt;br /&gt;
 | .dtors      | 802b0180 | 802b01a0 | 00000020 |&lt;br /&gt;
 | .rodata     | 802b01a0 | 802bae60 | 0000acc0 |&lt;br /&gt;
 | .data       | 802bae60 | 803af120 | 000f42c0 |&lt;br /&gt;
 | empty       | 803af120 | 803af140 | 00000020 |&lt;br /&gt;
 | .bss        | 803af140 | 804335a0 | 00084460 |&lt;br /&gt;
 | .sdata      | 804335a0 | 804360c0 | 00002b20 |&lt;br /&gt;
 | .sbss       | 804360c0 | 80436a20 | 00000960 |&lt;br /&gt;
 | .sdata2     | 80436a20 | 8043d500 | 00006ae0 |&lt;br /&gt;
 | .sbss2      | 8043d500 | 8043d528 | 00000028 |&lt;br /&gt;
 | stack       | 8043d528 | 8044d528 | 00010000 |&lt;br /&gt;
 | empty       | 8044d528 | 8044d540 | 00000018 |&lt;br /&gt;
 | ArenaLo     | 8044d540 |          |          |&lt;br /&gt;
 | apploader   | 81200000 |        ? |        ? |&lt;br /&gt;
 | Bootrom/IPL | 81300000 |        ? |        ? |&lt;br /&gt;
 | ArenaHi     |          | 817fffa0 |          |&lt;br /&gt;
 | FST         | 817fffa0 | 81800000 | 00500000 |&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EU ===&lt;br /&gt;
Entry point: 80003154&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
 | Section | Offset   | Address  | Length   | Used  |&lt;br /&gt;
 |---------|----------|----------|----------|-------|&lt;br /&gt;
 | text0   | 00000100 | 80003100 | 000024e0 | True  |&lt;br /&gt;
 | text1   | 000025e0 | 800055e0 | 002ac800 | True  |&lt;br /&gt;
 | text2   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text3   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text4   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text5   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text6   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data7   | 002aede0 | 802b1de0 | 00000020 | True  |&lt;br /&gt;
 | data8   | 002aee00 | 802b1e00 | 00000020 | True  |&lt;br /&gt;
 | data9   | 002aee20 | 802b1e20 | 0000f060 | True  |&lt;br /&gt;
 | data10  | 002bde80 | 802c0e80 | 000f5d40 | True  |&lt;br /&gt;
 | data11  | 003b3bc0 | 8043cbe0 | 00002b20 | True  |&lt;br /&gt;
 | data12  | 003b66e0 | 80440080 | 00006d20 | True  |&lt;br /&gt;
 | data13  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data14  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data15  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data16  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data17  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
&lt;br /&gt;
* bss: address:803b6bc0 length:00090208&lt;br /&gt;
* R1 = 80456dc8&lt;br /&gt;
* R2 = 80448080&lt;br /&gt;
* R13 = 80444be0&lt;br /&gt;
&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
 | Section     | beg_addr | end_addr | length   |&lt;br /&gt;
 |-------------|----------|----------|----------|&lt;br /&gt;
 | system      | 80000000 | 80003100 | 00003100 |&lt;br /&gt;
 | .text0      | 80003100 | 800055e0 | 000024e0 |&lt;br /&gt;
 | .text1      | 800055e0 | 802b1de0 | 002ac800 |&lt;br /&gt;
 | .ctors      | 802b1de0 | 802b1e00 | 00000020 |&lt;br /&gt;
 | .dtors      | 802b1e00 | 802b1e20 | 00000020 |&lt;br /&gt;
 | .rodata     | 802b1e20 | 802c0e80 | 0000f060 |&lt;br /&gt;
 | .data       | 802c0e80 | 803b6bc0 | 000f5d40 |&lt;br /&gt;
 | .bss        | 803b6bc0 | 8043cbe0 | 00086020 |&lt;br /&gt;
 | .sdata      | 8043cbe0 | 8043f700 | 00002b20 |&lt;br /&gt;
 | .sbss       | 8043f700 | 80440080 | 00000980 |&lt;br /&gt;
 | .sdata2     | 80440080 | 80446da0 | 00006d20 |&lt;br /&gt;
 | .sbss2      | 80446da0 | 80446dc8 | 00000028 |&lt;br /&gt;
 | stack       | 80446dc8 | 80456dc8 | 00010000 |&lt;br /&gt;
 | empty       | 80456dc8 | 80456de0 | 00000018 |&lt;br /&gt;
 | ArenaLo     | 80456de0 |          |          |&lt;br /&gt;
 | apploader   | 81200000 |        ? |        ? |&lt;br /&gt;
 | Bootrom/IPL | 81300000 |        ? |        ? |&lt;br /&gt;
 | ArenaHi     |          | 817fff40 |          |&lt;br /&gt;
 | FST         | 817fff40 | 81800000 | 000000C0 |&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
80593A00 -&amp;gt; 80598040 Wharehouse&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JAP ===&lt;br /&gt;
Entry point: 80003154&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
 | Section | Offset   | Address  | Length   | Used  |&lt;br /&gt;
 |---------|----------|----------|----------|-------|&lt;br /&gt;
 | text0   | 00000100 | 80003100 | 000024e0 | True  |&lt;br /&gt;
 | text1   | 000025e0 | 800055e0 | 002aab20 | True  |&lt;br /&gt;
 | text2   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text3   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text4   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text5   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text6   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data7   | 002ad100 | 802b0100 | 00000020 | True  |&lt;br /&gt;
 | data8   | 002ad120 | 802b0120 | 00000020 | True  |&lt;br /&gt;
 | data9   | 002ad140 | 802b0140 | 0000a2e0 | True  |&lt;br /&gt;
 | data10  | 002b7420 | 802ba420 | 000f3e60 | True  |&lt;br /&gt;
 | data11  | 003ab280 | 804326e0 | 00002b00 | True  |&lt;br /&gt;
 | data12  | 003add80 | 80435b40 | 00006b60 | True  |&lt;br /&gt;
 | data13  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data14  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data15  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data16  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data17  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
&lt;br /&gt;
* bss: address:803ae280 length:0008e448&lt;br /&gt;
* R1 = 8044c6c8&lt;br /&gt;
* R2 = 8043db40&lt;br /&gt;
* R13 = 8043a6e0 &lt;br /&gt;
&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
 | Section     | beg_addr | end_addr | length   |&lt;br /&gt;
 |-------------|----------|----------|----------|&lt;br /&gt;
 | system      | 80000000 | 80003100 | 00003100 |&lt;br /&gt;
 | .text0      | 80003100 | 800055e0 | 000024e0 |&lt;br /&gt;
 | .text1      | 800055e0 | 802b0100 | 002aab20 |&lt;br /&gt;
 | .ctors      | 802b0100 | 802b0120 | 00000020 |&lt;br /&gt;
 | .dtors      | 802b0120 | 802b0140 | 00000020 |&lt;br /&gt;
 | .rodata     | 802b0140 | 802ba420 | 0000a2e0 |&lt;br /&gt;
 | .data       | 802ba420 | 803ae280 | 000f3e60 |&lt;br /&gt;
 | .bss        | 803ae280 | 804326e0 | 00084460 |&lt;br /&gt;
 | .sdata      | 804326e0 | 804351e0 | 00002b00 |&lt;br /&gt;
 | .sbss       | 804351e0 | 80435b40 | 00000960 |&lt;br /&gt;
 | .sdata2     | 80435b40 | 8043c6a0 | 00006b60 |&lt;br /&gt;
 | .sbss2      | 8043c6a0 | 8043c6c8 | 00000028 |&lt;br /&gt;
 | stack       | 8043c6c8 | 8044c6c8 | 00010000 |&lt;br /&gt;
 | empty       | 8044c6c8 | 8044c6e0 | 00000018 |&lt;br /&gt;
 | ArenaLo     | 8044c6e0 |          |          |&lt;br /&gt;
 | apploader   | 81200000 |        ? |        ? |&lt;br /&gt;
 | Bootrom/IPL | 81300000 |        ? |        ? |&lt;br /&gt;
 | ArenaHi     |          | 817fffa0 |          |&lt;br /&gt;
 | FST         | 817fffa0 | 81800000 | 00000060 |&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Symbol map ==&lt;br /&gt;
The symbol map allows to put names on procedures and datas. It can be loaded in dolphin emulator in debug mode with the .map file format.&lt;br /&gt;
&lt;br /&gt;
Symbol map USA : https://github.com/Virtual-World-RE/NeoGF/blob/main/data/GG4E-CSM-20220412.map&lt;br /&gt;
&lt;br /&gt;
== MetroTRK ==&lt;br /&gt;
&lt;br /&gt;
MetroTRK can be activated by patching the bi2.bin DebugFlag and also by patching the following addresses to start the debugger in BBA (&#039;&#039;&#039;B&#039;&#039;&#039;road&#039;&#039;&#039;B&#039;&#039;&#039;and &#039;&#039;&#039;A&#039;&#039;&#039;dapter ?) mode:&lt;br /&gt;
* USA: Put a breakpoint at 80003190 then set r3 to 1&lt;br /&gt;
* EU:  Put a breakpoint at 800031C0 then set r7 to 4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15);&amp;quot;&amp;gt;&lt;br /&gt;
The [https://www.gc-forever.com/wiki/index.php?title=Apploader apploader reverse engineering] shows that there is debug vars in [[GCM (File format)|GCM/iso]] system files. [https://github.com/Virtual-World-RE/NeoGF/tree/main/gcmtool gcmtool.py] allow to patch them.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK &amp;amp; libs ==&lt;br /&gt;
All libs and SDK are staticly linked inside the dol.&lt;br /&gt;
&lt;br /&gt;
We found this libs and SDK:&lt;br /&gt;
* GCN SDK - Base dolphin SDK.&lt;br /&gt;
* Sysdolphin base library: Hal SysDolphin (HSD) Graphic and physic engine - https://github.com/doldecomp/melee/tree/master/src/sysdolphin/baselib&lt;br /&gt;
* MetroTRK: Target Resident Debugging Kernel for embedded systems. It&#039;s an embedded Kernel for debug.&lt;br /&gt;
* Metrowerks CW Runtime library: CodeWarrior: Metrowerks Standard Library and C/C++ Runtime&lt;br /&gt;
* And from ADXT/GC to CRI CFT/GC: It seems to be audio and video codecs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== H and C files ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
All 3 iso contains following .h and .c symbols in the .data, .rodata, .sdata and .sdata2. The EU version contains also the symbol &amp;quot;objalloc.h&amp;quot;.&lt;br /&gt;
 aobj.h&lt;br /&gt;
 cobj.h&lt;br /&gt;
 jobj.h&lt;br /&gt;
 lobj.h&lt;br /&gt;
 object.h&lt;br /&gt;
 &lt;br /&gt;
 GCN_Mem_Alloc.c&lt;br /&gt;
 aobj.c&lt;br /&gt;
 bytecode.c&lt;br /&gt;
 class.c&lt;br /&gt;
 cobj.c&lt;br /&gt;
 displayfunc.c&lt;br /&gt;
 dobj.c&lt;br /&gt;
 dvd.c&lt;br /&gt;
 dvdfs.c&lt;br /&gt;
 fobj.c&lt;br /&gt;
 fog.c&lt;br /&gt;
 hash.c&lt;br /&gt;
 id.c&lt;br /&gt;
 initialize.c&lt;br /&gt;
 jobj.c&lt;br /&gt;
 list.c&lt;br /&gt;
 lobj.c&lt;br /&gt;
 memory.c&lt;br /&gt;
 mobj.c&lt;br /&gt;
 mtx.c&lt;br /&gt;
 objalloc.c&lt;br /&gt;
 perf.c&lt;br /&gt;
 pobj.c&lt;br /&gt;
 robj.c&lt;br /&gt;
 tev.c&lt;br /&gt;
 texp.c&lt;br /&gt;
 texpdag.c&lt;br /&gt;
 tobj.c&lt;br /&gt;
 tpl.c&lt;br /&gt;
 util.c&lt;br /&gt;
 vi.c&lt;br /&gt;
 video.c&lt;br /&gt;
 wobj.c&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== Strings USA ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Strings list found in the dol and allowing to find libs / SDK:&lt;br /&gt;
 MetroTRK for GAMECUBE v2.0&lt;br /&gt;
 Metrowerks CW runtime library&lt;br /&gt;
 ADXT/GC Ver.8.57       Build:Feb 6 2003 18:03:46&lt;br /&gt;
 SKG/GC Ver.0.61        Build:Feb 6 2003 18:03:49&lt;br /&gt;
 ADXGC Ver.1.21         Build:Feb 6 2003 18:04:00&lt;br /&gt;
 ADXGCSDK Ver.05Sep2002 Build:Feb 6 2003 18:04:01&lt;br /&gt;
 ADXF/GC Ver.7.01       Build:Feb 6 2003 18:02:45&lt;br /&gt;
 CVFS/GC Ver.2.33       Build:Feb 6 2003 18:02:35&lt;br /&gt;
 GCCI Ver.1.09          Build:Feb 6 2003 18:02:33&lt;br /&gt;
 LSC/GC Ver.2.10        Build:Feb 6 2003 18:02:32&lt;br /&gt;
 SJ/GC Ver.6.10         Build:Feb 6 2003 18:02:53&lt;br /&gt;
 SVM/GC Ver.1.51        Build:Feb 6 2003 18:02:51&lt;br /&gt;
 MFCI/GC Ver.1.04       Build:Feb 6 2003 18:03:11&lt;br /&gt;
 AXRNA Ver.1.02         Build:Feb 6 2003 18:03:43&lt;br /&gt;
 CRI SUD/GC Ver.0.02    Build:Feb 6 2003 14:30:18&lt;br /&gt;
 CRI SFX/GC Ver.1.22    Build:Feb 6 2003 14:30:16&lt;br /&gt;
 CRI DCT/GC Ver.1.803   Build:Feb 6 2003 14:28:46&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI MPS/GC Ver.1.669   Build:Feb 6 2003 14:28:50&lt;br /&gt;
 CRI MPV/GC Ver.1.840   Build:Feb 6 2003 14:28:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFD/GC Ver.1.842   Build:Feb 6 2003 14:29:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFH/GC Ver.1.12    Build:Feb 6 2003 14:30:00&lt;br /&gt;
 MWSFD/GC Ver.2.62      Build:Feb 6 2003 14:28:42&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI CFT/GC Ver.1.24    Build:Feb 6 2003 14:28:33&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK – OS   release build: Apr 17 2003 12:33:06 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 Dolphin OS Kernel built : %s %s Apr 17 2003 12:33:06&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK – EXI  release build: Apr 17 2003 12:33:17 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - SI   release build: Apr 17 2003 12:33:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DVD  release build: Apr 22 2003 15:49:00 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - VI   release build: Apr 17 2003 12:33:22 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - PAD  release build: Apr 17 2003 12:33:44 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AI   release build: Apr 17 2003 12:33:54 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AR   release build: Apr 17 2003 12:33:55 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - ARQ  release build: Apr 17 2003 12:33:56 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AX   release build: Apr 17 2003 12:33:57 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DSP  release build: Apr 17 2003 12:34:16 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - CARD release build: Apr 17 2003 12:34:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - GX   release build: Apr 21 2003 14:55:46 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 sysdolphin_base_library&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== Strings EU ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Strings list found in the dol and allowing to find libs / SDK:&lt;br /&gt;
 Metrowerks Target Resident Kernel for PowerPC&lt;br /&gt;
 MetroTRK for GAMECUBE v2.0&lt;br /&gt;
 Metrowerks CW runtime library initializing default heap&lt;br /&gt;
 ADXT/GC     Ver.8.57 Build:Feb       6 2003 18:03:46&lt;br /&gt;
 SKG/GC      Ver.0.61 Build:Feb       6 2003 18:03:49&lt;br /&gt;
 ADXGC       Ver.1.21 Build:Feb       6 2003 18:04:00&lt;br /&gt;
 ADXGCSDK    Ver.05Sep2002 Build:Feb  6 2003 18:04:01&lt;br /&gt;
 ADXF/GC     Ver.7.01 Build:Feb       6 2003 18:02:45&lt;br /&gt;
 CVFS/GC     Ver.2.33 Build:Feb       6 2003 18:02:35&lt;br /&gt;
 GCCI        Ver.1.09 Build:Feb       6 2003 18:02:33&lt;br /&gt;
 LSC/GC      Ver.2.10 Build:Feb       6 2003 18:02:32&lt;br /&gt;
 SJ/GC       Ver.6.10 Build:Feb       6 2003 18:02:53&lt;br /&gt;
 SVM/GC      Ver.1.51 Build:Feb       6 2003 18:02:51&lt;br /&gt;
 MFCI/GC     Ver.1.04 Build:Feb       6 2003 18:03:11&lt;br /&gt;
 AXRNA       Ver.1.02 Build:Feb       6 2003 18:03:43&lt;br /&gt;
 CRI SUD/GC  Ver.0.02 Build:Feb       6 2003 14:30:18&lt;br /&gt;
 CRI SFX/GC  Ver.1.22 Build:Feb       6 2003 14:30:16&lt;br /&gt;
 CRI DCT/GC  Ver.1.803 Build:Feb      6 2003 14:28:46&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI MPS/GC  Ver.1.669 Build:Feb      6 2003 14:28:50&lt;br /&gt;
 CRI MPV/GC  Ver.1.840 Build:Feb      6 2003 14:28:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFD/GC  Ver.1.842 Build:Feb      6 2003 14:29:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFH/GC  Ver.1.12 Build:Feb       6 2003 14:30:00&lt;br /&gt;
 MWSFD/GC    Ver.2.62 Build:Feb       6 2003 14:28:42&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI CFT/GC  Ver.1.24 Build:Feb        6 2003 14:28:33&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - OS   release build: Apr 17 2003 12:33:06 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 Dolphin OS Kernel built : Apr 17 2003 12:33:06&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - EXI  release build: Apr 17 2003 12:33:17 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - SI   release build: Apr 17 2003 12:33:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DVD  release build: Apr 22 2003 15:49:00 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - VI   release build: Apr 17 2003 12:33:22 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - PAD  release build: Apr 17 2003 12:33:44 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AI   release build: Apr 17 2003 12:33:54 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AR   release build: Apr 17 2003 12:33:55 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - ARQ  release build: Apr 17 2003 12:33:56 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AX   release build: Apr 17 2003 12:33:57 (0x2301) &amp;gt;&amp;gt; &lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DSP  release build: Apr 17 2003 12:34:16 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 DSPInit(): Build Date: Apr 17 2003 12:34:16&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - CARD release build: Apr 17 2003 12:34:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - GX   release build: Apr 21 2003 14:55:46 (0x2301) &amp;gt;&amp;gt;  &lt;br /&gt;
 sysdolphin_base_library&lt;br /&gt;
 HSD_INIT_HEAP_MAX_NUM    is obsolete since 1.3.0.0.&lt;br /&gt;
 HSD_INIT_AUDIO_HEAP_SIZE is obsolete since 1.3.0.0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== Strings JAP ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Strings list found in the dol and allowing to find libs / SDK:&lt;br /&gt;
 Metrowerks Target Resident Kernel for PowerPC&lt;br /&gt;
 MetroTRK for GAMECUBE v2.0&lt;br /&gt;
 ADXT/GC Ver.8.57       Build:Feb  6 2003 18:03:46&lt;br /&gt;
 SKG/GC Ver.0.61        Build:Feb  6 2003 18:03:49&lt;br /&gt;
 ADXGC Ver.1.21         Build:Feb  6 2003 18:04:00&lt;br /&gt;
 ADXGCSDK Ver.05Sep2002 Build:Feb  6 2003 18:04:01&lt;br /&gt;
 ADXF/GC Ver.7.01       Build:Feb  6 2003 18:02:45&lt;br /&gt;
 CVFS/GC Ver.2.33       Build:Feb  6 2003 18:02:35&lt;br /&gt;
 GCCI Ver.1.09          Build:Feb  6 2003 18:02:33&lt;br /&gt;
 LSC/GC Ver.2.10        Build:Feb  6 2003 18:02:32&lt;br /&gt;
 SJ/GC Ver.6.10         Build:Feb  6 2003 18:02:53&lt;br /&gt;
 SVM/GC Ver.1.51        Build:Feb  6 2003 18:02:51&lt;br /&gt;
 MFCI/GC Ver.1.04       Build:Feb  6 2003 18:03:11&lt;br /&gt;
 AXRNA Ver.1.02         Build:Feb  6 2003 18:03:43&lt;br /&gt;
 CRI SUD/GC Ver.0.02    Build:Feb  6 2003 14:30:18&lt;br /&gt;
 CRI SFX/GC Ver.1.22    Build:Feb  6 2003 14:30:16&lt;br /&gt;
 CRI DCT/GC Ver.1.803   Build:Feb  6 2003 14:28:46&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI MPS/GC Ver.1.669   Build:Feb  6 2003 14:28:50&lt;br /&gt;
 CRI MPV/GC Ver.1.840   Build:Feb  6 2003 14:28:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFD/GC Ver.1.842   Build:Feb  6 2003 14:29:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFH/GC Ver.1.12    Build:Feb  6 2003 14:30:00&lt;br /&gt;
 MWSFD/GC Ver.2.62      Build:Feb  6 2003 14:28:42&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI CFT/GC Ver.1.24    Build:Feb  6 2003 14:28:33&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - OS   release build: Apr 17 2003 12:33:06 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 Dolphin OS Kernel built : Apr 17 2003 12:33:06&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - EXI  release build: Apr 17 2003 12:33:17 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - SI   release build: Apr 17 2003 12:33:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DVD  release build: Apr 22 2003 15:49:00 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - VI   release build: Apr 17 2003 12:33:22 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - PAD  release build: Apr 17 2003 12:33:44 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AI   release build: Apr 17 2003 12:33:54 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AR   release build: Apr 17 2003 12:33:55 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - ARQ  release build: Apr 17 2003 12:33:56 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AX   release build: Apr 17 2003 12:33:57 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DSP  release build: Apr 17 2003 12:34:16 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - CARD release build: Apr 17 2003 12:34:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - GX   release build: Apr 21 2003 14:55:46 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 sysdolphin_base_library&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:File format]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=DOL_(Gotcha_Force)&amp;diff=1295</id>
		<title>DOL (Gotcha Force)</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=DOL_(Gotcha_Force)&amp;diff=1295"/>
		<updated>2023-02-25T15:05:11Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: /* JAP */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This article is about Gotcha Force DOL file format and ongoing researchs on it. See [[DOL (File format)]] for DOL file format description.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15);&amp;quot;&amp;gt;This section is currently being written.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15); text-align: center;&amp;quot;&amp;gt;More research is needed and some paragraphs may be wrong.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Memory map ==&lt;br /&gt;
The dol file is mapped in memory and the free available space remaining is next used to create the Arena containing Heaps. For instance we found Warehouse variables in the EU dol mapped in the interval [80593190:80598044[.&lt;br /&gt;
&lt;br /&gt;
So patching the dol is hard because we have to find unused free space in the memory. The [https://www.gc-forever.com/wiki/index.php?title=Apploader apploader reverse engineering] shows that max dol mapping address in memory are:&lt;br /&gt;
* 0x80700000  // production boards&lt;br /&gt;
* 0x81200000  // development boards&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15);&amp;quot;&amp;gt;&lt;br /&gt;
In production we can override MetroTRK memory areas or even override apploader trailer before the bootrom/IPL area. Further investigations has to be done on the [[GCM (File format)|iso/GCM]] sys to see how debug memory is mapped in debug mode (apploader vars used in the apploader).&lt;br /&gt;
* Is it possible to know where exactly MetroTRK is mapped?&lt;br /&gt;
* Is there any other libs/datas unused in dol?&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* It&#039;s perfectly possible and tested to patch the apploader trailer and raise the trailer size with [[GCM (File format)|GCM/iso]] patch. It give us 0x100000 bytes available.&lt;br /&gt;
&lt;br /&gt;
The dol entry_point call the __init_registers procedure which will set the reserved following General Purpose Registers:&lt;br /&gt;
* R1 (stack)&lt;br /&gt;
* R2 (_SDA2_BASE_) - This is the read only _SDA2_.&lt;br /&gt;
* R13 (_SDA_BASE_) - This is the read / write _SDA_.&lt;br /&gt;
&#039;&#039;&#039;S&#039;&#039;&#039;mall &#039;&#039;&#039;D&#039;&#039;&#039;ata &#039;&#039;&#039;A&#039;&#039;&#039;nchors are used with a signed short offset (-0x8000 à +0x7fff).&lt;br /&gt;
* -0x8000(R13) = address of .sdata followed by .sbss&lt;br /&gt;
* -0x8000(R2) = address of .sdata2 followed by .sbss2&lt;br /&gt;
* R1 = often the .sbss2 end address + 0x10000&lt;br /&gt;
&lt;br /&gt;
So often only a part of available SDA negative offsets are used for R2 and R13 using -0x8000 as start.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== USA ===&lt;br /&gt;
Entry point: 80003154&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
 | Section | Offset   | Address  | Length   | Used  |&lt;br /&gt;
 |---------|----------|----------|----------|-------|&lt;br /&gt;
 | text0   | 00000100 | 80003100 | 000024e0 | True  |&lt;br /&gt;
 | text1   | 000025e0 | 800055e0 | 002aab80 | True  |&lt;br /&gt;
 | text2   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text3   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text4   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text5   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text6   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data7   | 002ad160 | 802b0160 | 00000020 | True  |&lt;br /&gt;
 | data8   | 002ad180 | 802b0180 | 00000020 | True  |&lt;br /&gt;
 | data9   | 002ad1a0 | 802b01a0 | 0000acc0 | True  |&lt;br /&gt;
 | data10  | 002b7e60 | 802bae60 | 000f42c0 | True  |&lt;br /&gt;
 | data11  | 003ac120 | 804335a0 | 00002b20 | True  |&lt;br /&gt;
 | data12  | 003aec40 | 80436a20 | 00006ae0 | True  |&lt;br /&gt;
 | data13  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data14  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data15  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data16  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data17  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
&lt;br /&gt;
* bss: address:803af140 length:0008e3e8&lt;br /&gt;
* R1 = 8044d528&lt;br /&gt;
* R2 = 8043ea20&lt;br /&gt;
* R13 = 8043b5a0&lt;br /&gt;
&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
 | Section     | beg_addr | end_addr | length   |&lt;br /&gt;
 |-------------|----------|----------|----------|&lt;br /&gt;
 | system      | 80000000 | 80003100 | 00003100 |&lt;br /&gt;
 | .text0      | 80003100 | 800055e0 | 000024e0 |&lt;br /&gt;
 | .text1      | 800055e0 | 802b0160 | 002aab80 |&lt;br /&gt;
 | .ctors      | 802b0160 | 802b0180 | 00000020 |&lt;br /&gt;
 | .dtors      | 802b0180 | 802b01a0 | 00000020 |&lt;br /&gt;
 | .rodata     | 802b01a0 | 802bae60 | 0000acc0 |&lt;br /&gt;
 | .data       | 802bae60 | 803af120 | 000f42c0 |&lt;br /&gt;
 | empty       | 803af120 | 803af140 | 00000020 |&lt;br /&gt;
 | .bss        | 803af140 | 804335a0 | 00084460 |&lt;br /&gt;
 | .sdata      | 804335a0 | 804360c0 | 00002b20 |&lt;br /&gt;
 | .sbss       | 804360c0 | 80436a20 | 00000960 |&lt;br /&gt;
 | .sdata2     | 80436a20 | 8043d500 | 00006ae0 |&lt;br /&gt;
 | .sbss2      | 8043d500 | 8043d528 | 00000028 |&lt;br /&gt;
 | stack       | 8043d528 | 8044d528 | 00010000 |&lt;br /&gt;
 | empty       | 8044d528 | 8044d540 | 00000018 |&lt;br /&gt;
 | ArenaLo     | 8044d540 |          |          |&lt;br /&gt;
 | apploader   | 81200000 |        ? |        ? |&lt;br /&gt;
 | Bootrom/IPL | 81300000 |        ? |        ? |&lt;br /&gt;
 | ArenaHi     |          | 817fffa0 |          |&lt;br /&gt;
 | FST         | 817fffa0 | 81800000 | 00500000 |&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EU ===&lt;br /&gt;
Entry point: 80003154&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
 | Section | Offset   | Address  | Length   | Used  |&lt;br /&gt;
 |---------|----------|----------|----------|-------|&lt;br /&gt;
 | text0   | 00000100 | 80003100 | 000024e0 | True  |&lt;br /&gt;
 | text1   | 000025e0 | 800055e0 | 002ac800 | True  |&lt;br /&gt;
 | text2   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text3   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text4   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text5   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text6   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data7   | 002aede0 | 802b1de0 | 00000020 | True  |&lt;br /&gt;
 | data8   | 002aee00 | 802b1e00 | 00000020 | True  |&lt;br /&gt;
 | data9   | 002aee20 | 802b1e20 | 0000f060 | True  |&lt;br /&gt;
 | data10  | 002bde80 | 802c0e80 | 000f5d40 | True  |&lt;br /&gt;
 | data11  | 003b3bc0 | 8043cbe0 | 00002b20 | True  |&lt;br /&gt;
 | data12  | 003b66e0 | 80440080 | 00006d20 | True  |&lt;br /&gt;
 | data13  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data14  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data15  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data16  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data17  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
&lt;br /&gt;
* bss: address:803b6bc0 length:00090208&lt;br /&gt;
* R1 = 80456dc8&lt;br /&gt;
* R2 = 80448080&lt;br /&gt;
* R13 = 80444be0&lt;br /&gt;
&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
 | Section     | beg_addr | end_addr | length   |&lt;br /&gt;
 |-------------|----------|----------|----------|&lt;br /&gt;
 | system      | 80000000 | 80003100 | 00003100 |&lt;br /&gt;
 | .text0      | 80003100 | 800055e0 | 000024e0 |&lt;br /&gt;
 | .text1      | 800055e0 | 802b1de0 | 002ac800 |&lt;br /&gt;
 | .ctors      | 802b1de0 | 802b1e00 | 00000020 |&lt;br /&gt;
 | .dtors      | 802b1e00 | 802b1e20 | 00000020 |&lt;br /&gt;
 | .rodata     | 802b1e20 | 802c0e80 | 0000f060 |&lt;br /&gt;
 | .data       | 802c0e80 | 803b6bc0 | 000f5d40 |&lt;br /&gt;
 | .bss        | 803b6bc0 | 8043cbe0 | 00086020 |&lt;br /&gt;
 | .sdata      | 8043cbe0 | 8043f700 | 00002b20 |&lt;br /&gt;
 | .sbss       | 8043f700 | 80440080 | 00000980 |&lt;br /&gt;
 | .sdata2     | 80440080 | 80446da0 | 00006d20 |&lt;br /&gt;
 | .sbss2      | 80446da0 | 80446dc8 | 00000028 |&lt;br /&gt;
 | stack       | 80446dc8 | 80456dc8 | 00010000 |&lt;br /&gt;
 | empty       | 80456dc8 | 80456de0 | 00000018 |&lt;br /&gt;
 | ArenaLo     | 80456de0 |          |          |&lt;br /&gt;
 | apploader   | 81200000 |        ? |        ? |&lt;br /&gt;
 | Bootrom/IPL | 81300000 |        ? |        ? |&lt;br /&gt;
 | ArenaHi     |          | 817fff40 |          |&lt;br /&gt;
 | FST         | 817fff40 | 81800000 | 000000C0 |&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
80593A00 -&amp;gt; 80598040 Wharehouse&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== JAP ===&lt;br /&gt;
Entry point: 80003154&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
 | Section | Offset   | Address  | Length   | Used  |&lt;br /&gt;
 |---------|----------|----------|----------|-------|&lt;br /&gt;
 | text0   | 00000100 | 80003100 | 000024e0 | True  |&lt;br /&gt;
 | text1   | 000025e0 | 800055e0 | 002aab20 | True  |&lt;br /&gt;
 | text2   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text3   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text4   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text5   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | text6   | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data7   | 002ad100 | 802b0100 | 00000020 | True  |&lt;br /&gt;
 | data8   | 002ad120 | 802b0120 | 00000020 | True  |&lt;br /&gt;
 | data9   | 002ad140 | 802b0140 | 0000a2e0 | True  |&lt;br /&gt;
 | data10  | 002b7420 | 802ba420 | 000f3e60 | True  |&lt;br /&gt;
 | data11  | 003ab280 | 804326e0 | 00002b00 | True  |&lt;br /&gt;
 | data12  | 003add80 | 80435b40 | 00006b60 | True  |&lt;br /&gt;
 | data13  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data14  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data15  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data16  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 | data17  | 00000000 | 00000000 | 00000000 | False |&lt;br /&gt;
 |--------------------------------------------------|&lt;br /&gt;
&lt;br /&gt;
* bss: address:803ae280 length:0008e448&lt;br /&gt;
* R1 = 8044c6c8&lt;br /&gt;
* R2 = 8043db40&lt;br /&gt;
* R13 = 8043a6e0 &lt;br /&gt;
&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
 | Section     | beg_addr | end_addr | length   |&lt;br /&gt;
 |-------------|----------|----------|----------|&lt;br /&gt;
 | system      | 80000000 | 80003100 | 00003100 |&lt;br /&gt;
 | .text0      | 80003100 | 800055e0 | 000024e0 |&lt;br /&gt;
 | .text1      | 800055e0 | 802b0100 | 002aab20 |&lt;br /&gt;
 | .ctors      | 802b0100 | 802b0120 | 00000020 |&lt;br /&gt;
 | .dtors      | 802b0120 | 802b0140 | 00000020 |&lt;br /&gt;
 | .rodata     | 802b0140 | 802ba420 | 0000a2e0 |&lt;br /&gt;
 | .data       | 802ba420 | 803ae280 | 000f3e60 |&lt;br /&gt;
 | .bss        | 803ae280 | 804326e0 | 00084460 |&lt;br /&gt;
 | .sdata      | 804326e0 | 804351e0 | 00002b00 |&lt;br /&gt;
 | .sbss       | 804351e0 | 80435b40 | 00000960 |&lt;br /&gt;
 | .sdata2     | 80435b40 | 8043c6a0 | 00006b60 |&lt;br /&gt;
 | .sbss2      | 8043c6a0 | 8043c6c8 | 00000028 |&lt;br /&gt;
 | stack       | 8043c6c8 | 8044c6c8 | 00010000 |&lt;br /&gt;
 | empty       | 8044c6c8 | 8044c6e0 | 00000018 |&lt;br /&gt;
 | ArenaLo     | 8044c6e0 |          |          |&lt;br /&gt;
 | apploader   | 81200000 |        ? |        ? |&lt;br /&gt;
 | Bootrom/IPL | 81300000 |        ? |        ? |&lt;br /&gt;
 | ArenaHi     |          | 817fffa0 |          |&lt;br /&gt;
 | FST         | 817fffa0 | 81800000 | 00000060 |&lt;br /&gt;
 |----------------------------------------------|&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Symbol map ==&lt;br /&gt;
The symbol map allows to put names on procedures and datas. It can be loaded in dolphin emulator in debug mode with the .map file format.&lt;br /&gt;
&lt;br /&gt;
Symbol map USA : https://github.com/Virtual-World-RE/NeoGF/blob/main/data/GG4E-CSM-20220412.map&lt;br /&gt;
&lt;br /&gt;
== MetroTRK ==&lt;br /&gt;
&lt;br /&gt;
MetroTRK can be activated by patching the bi2.bin DebugFlag and also by patching the following addresses to start the debugger in BBA (&#039;&#039;&#039;B&#039;&#039;&#039;road&#039;&#039;&#039;B&#039;&#039;&#039;and &#039;&#039;&#039;A&#039;&#039;&#039;dapter ?) mode:&lt;br /&gt;
* USA: Put a breakpoint at 80003190 then set r3 to 1&lt;br /&gt;
* EU:  Put a breakpoint at 800031C0 then set r7 to 4&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15);&amp;quot;&amp;gt;&lt;br /&gt;
The [https://www.gc-forever.com/wiki/index.php?title=Apploader apploader reverse engineering] shows that there is debug vars in [[GCM (File format)|GCM/iso]] system files. [https://github.com/Virtual-World-RE/NeoGF/tree/main/gcmtool gcmtool.py] allow to patch them.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SDK &amp;amp; libs ==&lt;br /&gt;
All libs and SDK are staticly linked inside the dol.&lt;br /&gt;
&lt;br /&gt;
We found this libs and SDK:&lt;br /&gt;
* GCN SDK - Base dolphin SDK.&lt;br /&gt;
* Sysdolphin base library: Hal SysDolphin (HSD) Graphic and physic engine - https://github.com/doldecomp/melee/tree/master/src/sysdolphin/baselib&lt;br /&gt;
* MetroTRK: Target Resident Debugging Kernel for embedded systems. It&#039;s an embedded Kernel for debug.&lt;br /&gt;
* Metrowerks CW Runtime library: CodeWarrior: Metrowerks Standard Library and C/C++ Runtime&lt;br /&gt;
* And from ADXT/GC to CRI CFT/GC: It seems to be audio and video codecs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== H and C files ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
All 3 iso contains following .h and .c symbols in the .data, .rodata, .sdata and .sdata2. The EU version contains also the symbol &amp;quot;objalloc.h&amp;quot;.&lt;br /&gt;
 aobj.h&lt;br /&gt;
 cobj.h&lt;br /&gt;
 jobj.h&lt;br /&gt;
 lobj.h&lt;br /&gt;
 object.h&lt;br /&gt;
 &lt;br /&gt;
 GCN_Mem_Alloc.c&lt;br /&gt;
 aobj.c&lt;br /&gt;
 bytecode.c&lt;br /&gt;
 class.c&lt;br /&gt;
 cobj.c&lt;br /&gt;
 displayfunc.c&lt;br /&gt;
 dobj.c&lt;br /&gt;
 dvd.c&lt;br /&gt;
 dvdfs.c&lt;br /&gt;
 fobj.c&lt;br /&gt;
 fog.c&lt;br /&gt;
 hash.c&lt;br /&gt;
 id.c&lt;br /&gt;
 initialize.c&lt;br /&gt;
 jobj.c&lt;br /&gt;
 list.c&lt;br /&gt;
 lobj.c&lt;br /&gt;
 memory.c&lt;br /&gt;
 mobj.c&lt;br /&gt;
 mtx.c&lt;br /&gt;
 objalloc.c&lt;br /&gt;
 perf.c&lt;br /&gt;
 pobj.c&lt;br /&gt;
 robj.c&lt;br /&gt;
 tev.c&lt;br /&gt;
 texp.c&lt;br /&gt;
 texpdag.c&lt;br /&gt;
 tobj.c&lt;br /&gt;
 tpl.c&lt;br /&gt;
 util.c&lt;br /&gt;
 vi.c&lt;br /&gt;
 video.c&lt;br /&gt;
 wobj.c&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== Strings USA ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Strings list found in the dol and allowing to find libs / SDK:&lt;br /&gt;
 MetroTRK for GAMECUBE v2.0&lt;br /&gt;
 Metrowerks CW runtime library&lt;br /&gt;
 ADXT/GC Ver.8.57       Build:Feb 6 2003 18:03:46&lt;br /&gt;
 SKG/GC Ver.0.61        Build:Feb 6 2003 18:03:49&lt;br /&gt;
 ADXGC Ver.1.21         Build:Feb 6 2003 18:04:00&lt;br /&gt;
 ADXGCSDK Ver.05Sep2002 Build:Feb 6 2003 18:04:01&lt;br /&gt;
 ADXF/GC Ver.7.01       Build:Feb 6 2003 18:02:45&lt;br /&gt;
 CVFS/GC Ver.2.33       Build:Feb 6 2003 18:02:35&lt;br /&gt;
 GCCI Ver.1.09          Build:Feb 6 2003 18:02:33&lt;br /&gt;
 LSC/GC Ver.2.10        Build:Feb 6 2003 18:02:32&lt;br /&gt;
 SJ/GC Ver.6.10         Build:Feb 6 2003 18:02:53&lt;br /&gt;
 SVM/GC Ver.1.51        Build:Feb 6 2003 18:02:51&lt;br /&gt;
 MFCI/GC Ver.1.04       Build:Feb 6 2003 18:03:11&lt;br /&gt;
 AXRNA Ver.1.02         Build:Feb 6 2003 18:03:43&lt;br /&gt;
 CRI SUD/GC Ver.0.02    Build:Feb 6 2003 14:30:18&lt;br /&gt;
 CRI SFX/GC Ver.1.22    Build:Feb 6 2003 14:30:16&lt;br /&gt;
 CRI DCT/GC Ver.1.803   Build:Feb 6 2003 14:28:46&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI MPS/GC Ver.1.669   Build:Feb 6 2003 14:28:50&lt;br /&gt;
 CRI MPV/GC Ver.1.840   Build:Feb 6 2003 14:28:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFD/GC Ver.1.842   Build:Feb 6 2003 14:29:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFH/GC Ver.1.12    Build:Feb 6 2003 14:30:00&lt;br /&gt;
 MWSFD/GC Ver.2.62      Build:Feb 6 2003 14:28:42&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI CFT/GC Ver.1.24    Build:Feb 6 2003 14:28:33&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK – OS   release build: Apr 17 2003 12:33:06 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 Dolphin OS Kernel built : %s %s Apr 17 2003 12:33:06&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK – EXI  release build: Apr 17 2003 12:33:17 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - SI   release build: Apr 17 2003 12:33:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DVD  release build: Apr 22 2003 15:49:00 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - VI   release build: Apr 17 2003 12:33:22 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - PAD  release build: Apr 17 2003 12:33:44 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AI   release build: Apr 17 2003 12:33:54 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AR   release build: Apr 17 2003 12:33:55 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - ARQ  release build: Apr 17 2003 12:33:56 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AX   release build: Apr 17 2003 12:33:57 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DSP  release build: Apr 17 2003 12:34:16 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - CARD release build: Apr 17 2003 12:34:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - GX   release build: Apr 21 2003 14:55:46 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 sysdolphin_base_library&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== Strings EU ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Strings list found in the dol and allowing to find libs / SDK:&lt;br /&gt;
 Metrowerks Target Resident Kernel for PowerPC&lt;br /&gt;
 MetroTRK for GAMECUBE v2.0&lt;br /&gt;
 Metrowerks CW runtime library initializing default heap&lt;br /&gt;
 ADXT/GC     Ver.8.57 Build:Feb       6 2003 18:03:46&lt;br /&gt;
 SKG/GC      Ver.0.61 Build:Feb       6 2003 18:03:49&lt;br /&gt;
 ADXGC       Ver.1.21 Build:Feb       6 2003 18:04:00&lt;br /&gt;
 ADXGCSDK    Ver.05Sep2002 Build:Feb  6 2003 18:04:01&lt;br /&gt;
 ADXF/GC     Ver.7.01 Build:Feb       6 2003 18:02:45&lt;br /&gt;
 CVFS/GC     Ver.2.33 Build:Feb       6 2003 18:02:35&lt;br /&gt;
 GCCI        Ver.1.09 Build:Feb       6 2003 18:02:33&lt;br /&gt;
 LSC/GC      Ver.2.10 Build:Feb       6 2003 18:02:32&lt;br /&gt;
 SJ/GC       Ver.6.10 Build:Feb       6 2003 18:02:53&lt;br /&gt;
 SVM/GC      Ver.1.51 Build:Feb       6 2003 18:02:51&lt;br /&gt;
 MFCI/GC     Ver.1.04 Build:Feb       6 2003 18:03:11&lt;br /&gt;
 AXRNA       Ver.1.02 Build:Feb       6 2003 18:03:43&lt;br /&gt;
 CRI SUD/GC  Ver.0.02 Build:Feb       6 2003 14:30:18&lt;br /&gt;
 CRI SFX/GC  Ver.1.22 Build:Feb       6 2003 14:30:16&lt;br /&gt;
 CRI DCT/GC  Ver.1.803 Build:Feb      6 2003 14:28:46&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI MPS/GC  Ver.1.669 Build:Feb      6 2003 14:28:50&lt;br /&gt;
 CRI MPV/GC  Ver.1.840 Build:Feb      6 2003 14:28:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFD/GC  Ver.1.842 Build:Feb      6 2003 14:29:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFH/GC  Ver.1.12 Build:Feb       6 2003 14:30:00&lt;br /&gt;
 MWSFD/GC    Ver.2.62 Build:Feb       6 2003 14:28:42&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI CFT/GC  Ver.1.24 Build:Feb        6 2003 14:28:33&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - OS   release build: Apr 17 2003 12:33:06 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 Dolphin OS Kernel built : Apr 17 2003 12:33:06&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - EXI  release build: Apr 17 2003 12:33:17 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - SI   release build: Apr 17 2003 12:33:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DVD  release build: Apr 22 2003 15:49:00 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - VI   release build: Apr 17 2003 12:33:22 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - PAD  release build: Apr 17 2003 12:33:44 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AI   release build: Apr 17 2003 12:33:54 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AR   release build: Apr 17 2003 12:33:55 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - ARQ  release build: Apr 17 2003 12:33:56 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AX   release build: Apr 17 2003 12:33:57 (0x2301) &amp;gt;&amp;gt; &lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DSP  release build: Apr 17 2003 12:34:16 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 DSPInit(): Build Date: Apr 17 2003 12:34:16&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - CARD release build: Apr 17 2003 12:34:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - GX   release build: Apr 21 2003 14:55:46 (0x2301) &amp;gt;&amp;gt;  &lt;br /&gt;
 sysdolphin_base_library&lt;br /&gt;
 HSD_INIT_HEAP_MAX_NUM    is obsolete since 1.3.0.0.&lt;br /&gt;
 HSD_INIT_AUDIO_HEAP_SIZE is obsolete since 1.3.0.0.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== Strings JAP ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Strings list found in the dol and allowing to find libs / SDK:&lt;br /&gt;
 Metrowerks Target Resident Kernel for PowerPC&lt;br /&gt;
 MetroTRK for GAMECUBE v2.0&lt;br /&gt;
 ADXT/GC Ver.8.57       Build:Feb  6 2003 18:03:46&lt;br /&gt;
 SKG/GC Ver.0.61        Build:Feb  6 2003 18:03:49&lt;br /&gt;
 ADXGC Ver.1.21         Build:Feb  6 2003 18:04:00&lt;br /&gt;
 ADXGCSDK Ver.05Sep2002 Build:Feb  6 2003 18:04:01&lt;br /&gt;
 ADXF/GC Ver.7.01       Build:Feb  6 2003 18:02:45&lt;br /&gt;
 CVFS/GC Ver.2.33       Build:Feb  6 2003 18:02:35&lt;br /&gt;
 GCCI Ver.1.09          Build:Feb  6 2003 18:02:33&lt;br /&gt;
 LSC/GC Ver.2.10        Build:Feb  6 2003 18:02:32&lt;br /&gt;
 SJ/GC Ver.6.10         Build:Feb  6 2003 18:02:53&lt;br /&gt;
 SVM/GC Ver.1.51        Build:Feb  6 2003 18:02:51&lt;br /&gt;
 MFCI/GC Ver.1.04       Build:Feb  6 2003 18:03:11&lt;br /&gt;
 AXRNA Ver.1.02         Build:Feb  6 2003 18:03:43&lt;br /&gt;
 CRI SUD/GC Ver.0.02    Build:Feb  6 2003 14:30:18&lt;br /&gt;
 CRI SFX/GC Ver.1.22    Build:Feb  6 2003 14:30:16&lt;br /&gt;
 CRI DCT/GC Ver.1.803   Build:Feb  6 2003 14:28:46&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI MPS/GC Ver.1.669   Build:Feb  6 2003 14:28:50&lt;br /&gt;
 CRI MPV/GC Ver.1.840   Build:Feb  6 2003 14:28:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFD/GC Ver.1.842   Build:Feb  6 2003 14:29:53&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI SFH/GC Ver.1.12    Build:Feb  6 2003 14:30:00&lt;br /&gt;
 MWSFD/GC Ver.2.62      Build:Feb  6 2003 14:28:42&lt;br /&gt;
 Append: MW2407 GC05Sep2002Patch1&lt;br /&gt;
 CRI CFT/GC Ver.1.24    Build:Feb  6 2003 14:28:33&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - OS   release build: Apr 17 2003 12:33:06 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 Dolphin OS Kernel built : Apr 17 2003 12:33:06&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - EXI  release build: Apr 17 2003 12:33:17 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - SI   release build: Apr 17 2003 12:33:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DVD  release build: Apr 22 2003 15:49:00 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - VI   release build: Apr 17 2003 12:33:22 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - PAD  release build: Apr 17 2003 12:33:44 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AI   release build: Apr 17 2003 12:33:54 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AR   release build: Apr 17 2003 12:33:55 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - ARQ  release build: Apr 17 2003 12:33:56 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - AX   release build: Apr 17 2003 12:33:57 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - DSP  release build: Apr 17 2003 12:34:16 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - CARD release build: Apr 17 2003 12:34:19 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 &amp;lt;&amp;lt; Dolphin SDK - GX   release build: Apr 21 2003 14:55:46 (0x2301) &amp;gt;&amp;gt;&lt;br /&gt;
 sysdolphin_base_library&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:File format]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Gotcha_Force&amp;diff=1294</id>
		<title>Gotcha Force</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Gotcha_Force&amp;diff=1294"/>
		<updated>2023-02-25T14:59:33Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: /* Game file formats */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{GameInfo&lt;br /&gt;
|image               = NoImage.png&lt;br /&gt;
|screenwidth         = 320px&lt;br /&gt;
|title               = Gotcha Force&lt;br /&gt;
|aka                 = Gacha Fōsu (JP)&lt;br /&gt;
|developer           = Capcom&lt;br /&gt;
|publishers          = [[Capcom]]&lt;br /&gt;
|system              = GameCube&lt;br /&gt;
|japan               = November 27, 2003&lt;br /&gt;
|usa                 = December 3, 2003&lt;br /&gt;
|europe              = February 20, 2004&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Games]]&lt;br /&gt;
&#039;&#039;&#039;Gotcha Force&#039;&#039;&#039; is a fighting / third-person shooter video game developped and published by [[Capcom]] for GameCube in 2003.&lt;br /&gt;
&lt;br /&gt;
== GCM versions ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! sha1 !! Game Code&lt;br /&gt;
|-&lt;br /&gt;
| Gotcha Force (Europe) (En,Fr,De).iso || A94DF10304E6A18827C7325169E9ACE117F17A00 || GG4P&lt;br /&gt;
|-&lt;br /&gt;
| Gotcha Force (USA).iso || DFE963E5070B9BEC02BBBEFBA3F038B04DAC953E || GG4E&lt;br /&gt;
|-&lt;br /&gt;
| Gotcha Force (Japan).iso || 1B413F219A47E6B3E862A3F7A469A046E88BE893 || GG4J&lt;br /&gt;
|-&lt;br /&gt;
| GFRB2.2c.iso || E207F2223ACDE7A7FD287FBAB3C2DE59CF7984E6 || GG4P&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
GFRB2.2c.iso is a rebalanced version of the game made by the [https://discord.com/invite/4EtKwtHUw2 team Gotcha Force Rebalanced] to play [https://www.youtube.com/channel/UC_ePVAn2C2CK6ImDSnoaQKQ multiplayer battles]. The modded iso come from EU iso version.&lt;br /&gt;
&lt;br /&gt;
== Game terminology ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Word !! Meaning&lt;br /&gt;
|-&lt;br /&gt;
| Borg || 3D character used in battles.&lt;br /&gt;
|-&lt;br /&gt;
| Stage || 3D map used in battles.&lt;br /&gt;
|-&lt;br /&gt;
| Data Crystal || 3D items looted at battles end that can be combined to earn new Borgs.&lt;br /&gt;
|-&lt;br /&gt;
| NPC || Ally or Ennemy characters seen during battles.&lt;br /&gt;
|-&lt;br /&gt;
| Gotcha Box || Boxes used to store Borgs.&lt;br /&gt;
|-&lt;br /&gt;
| WareHouse || Game element used to store Borgs when the Gotcha Box is filled up. Borgs can&#039;t be selected from WareHouse during battles.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== GameCube DVD Architecture ==&lt;br /&gt;
The page [[GCM (File format)]] describes in details the GCM file format used by GameCube mini DVD.&lt;br /&gt;
&lt;br /&gt;
== GameCube Tooling ==&lt;br /&gt;
The page [[GameCube Tooling]] provides softwares and scripts for handling GameCube games ROM / files.&lt;br /&gt;
&lt;br /&gt;
== Hardware ==&lt;br /&gt;
&lt;br /&gt;
[https://en.wikipedia.org/wiki/GameCube_technical_specifications GameCube technical specifications]&lt;br /&gt;
&lt;br /&gt;
[http://datasheets.chipdb.org/IBM/PowerPC/Gekko/gekko_user_manual.pdf#page=337 Gekko powerpc CPU user manual]: This manual is usefull when reverse engineering executables ([[DOL (File format)|dol]], rel, and so on.). Assembly instructions and Gekko architecture are documented in details.&lt;br /&gt;
&lt;br /&gt;
Another interesting document is the [https://db.hfsplay.fr/files/2019/07/04/Architecture_Guide_SCQNknY.pdf GameCube SDK architecture guide] providing technical acronyms definitions and global SDK internal knowledges.&lt;br /&gt;
&lt;br /&gt;
The DSP (Digital Signal Processor allowing to process audio signals - codecs...) has been [https://www.lse.epita.fr/lse-winter-day-2013/slides/dsp.pdf studied in depht] by one of Dolphin Emulator developers team.&lt;br /&gt;
&lt;br /&gt;
== Game file formats ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Format !! Content&lt;br /&gt;
|-&lt;br /&gt;
| [[ADX (File format)|ADX]] || Audio file ||&lt;br /&gt;
|-&lt;br /&gt;
| [[AFS (File format)|AFS]] || File packing others files ([[AFS (Gotcha Force)|Ongoing researchs]]) ||&lt;br /&gt;
|- &lt;br /&gt;
| [[ARC (Gotcha Force)|ARC]] || HSD Files ||&lt;br /&gt;
|- &lt;br /&gt;
| [[ARZ (Gotcha Force)|ARZ]] || Compressed file ||&lt;br /&gt;
|-&lt;br /&gt;
| [[BIN (Gotcha Force)|BIN]] &lt;br /&gt;
! Unknown ||&lt;br /&gt;
|-&lt;br /&gt;
| [[BNR (File format)|BNR]] || Banner file format ||&lt;br /&gt;
|-&lt;br /&gt;
| [[CHD (Gotcha Force)|CHD]] || DSP assembly files ? ||&lt;br /&gt;
|-&lt;br /&gt;
| [[DOL (File format)|DOL]] || [[SysDolphin]] executable file ([[DOL (Gotcha Force)|Ongoing researchs]]) ||&lt;br /&gt;
|-&lt;br /&gt;
| [[DPK (Gotcha Force)|DPK]] &lt;br /&gt;
! Unknown ||&lt;br /&gt;
|-&lt;br /&gt;
| [[GCM (File format)| IMG]]  || apploader file||&lt;br /&gt;
|- &lt;br /&gt;
| [[MDT (Gotcha Force)|MDT]] &lt;br /&gt;
| Uncompressed packed files which contains dialogs ||&lt;br /&gt;
|- &lt;br /&gt;
| [[PTL (File format)|PTL]] || Particles settings ([[PTL (Gotcha Force)|Ongoing researchs]])  ||&lt;br /&gt;
|-&lt;br /&gt;
| [[PZZ (Gotcha Force)|PZZ]] || Compressed archive ||&lt;br /&gt;
|- &lt;br /&gt;
| [[REF (Gotcha Force)|REF]] &lt;br /&gt;
! Unknown (Related to particles ?) ||&lt;br /&gt;
|-&lt;br /&gt;
| [[SFD (File format)|SFD]] || MPEG Sofdec ||&lt;br /&gt;
|- &lt;br /&gt;
| [[TPL (File format)|TPL]] || Texture Palette Library ||&lt;br /&gt;
|- &lt;br /&gt;
| [[TSB (Gotcha Force)|TSB]] &lt;br /&gt;
! Unknown ||&lt;br /&gt;
|- &lt;br /&gt;
| [[TXG (File format)|TXG]] || Particles images container ([[TXG (Gotcha Force)|Ongoing researchs]]) ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;p class=&amp;quot;mwt-heading&amp;quot; &amp;gt;The page [[File formats reverse engineering|file formats reverse engineering]] is dedicated to methods and researchs ongoing on it.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Files and folders tree ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== USA : ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
 GCM_SYS/&lt;br /&gt;
 ├─ apploader.img&lt;br /&gt;
 └─ boot.dol&lt;br /&gt;
 afs_data.afs&lt;br /&gt;
 ├─ *.adx (2113)&lt;br /&gt;
 ├─ *.arc (1369)&lt;br /&gt;
 ├─ *.arz (184)&lt;br /&gt;
 ├─ *.bin (586)&lt;br /&gt;
 ├─ *.chd (4)&lt;br /&gt;
 ├─ *.dpk (4)&lt;br /&gt;
 ├─ *.mdt (6)&lt;br /&gt;
 ├─ ptcl00.ptl&lt;br /&gt;
 ├─ *.pzz (254)&lt;br /&gt;
 ├─ ptcl00.ref&lt;br /&gt;
 ├─ *.sfd (2)&lt;br /&gt;
 ├─ *.tpl (442)&lt;br /&gt;
 ├─ *.tsb (4)&lt;br /&gt;
 └─ ptcl00.txg&lt;br /&gt;
 opening.bnr&lt;br /&gt;
 poq_adx_usa.afs&lt;br /&gt;
 ├─ *.adx (2115)&lt;br /&gt;
 └─ *.sfd (2)&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== EU : ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
  GCM_SYS/&lt;br /&gt;
 ├─ apploader.img&lt;br /&gt;
 └─ boot.dol&lt;br /&gt;
 afs_data.afs&lt;br /&gt;
 ├─ *.arc (1334)&lt;br /&gt;
 ├─ *.arz (172)&lt;br /&gt;
 ├─ *.bin (586)&lt;br /&gt;
 ├─ *.chd (4)&lt;br /&gt;
 ├─ *.dpk (4)&lt;br /&gt;
 ├─ *.mdt (1)&lt;br /&gt;
 ├─ *.ptl (1)&lt;br /&gt;
 ├─ *.pzz (253)&lt;br /&gt;
 ├─ *.ref (1)&lt;br /&gt;
 ├─ *.tpl (27)&lt;br /&gt;
 ├─ *.tsb (4)&lt;br /&gt;
 └─ *.txg (1)&lt;br /&gt;
 afs_data_a.afs&lt;br /&gt;
 ├─ *.arc (47)&lt;br /&gt;
 ├─ *.arz (12)&lt;br /&gt;
 ├─ *.mdt (5)&lt;br /&gt;
 ├─ *.pzz (2)&lt;br /&gt;
 └─ *.tpl (415)&lt;br /&gt;
 afs_data_f.afs&lt;br /&gt;
 ├─ *.arc (47)&lt;br /&gt;
 ├─ *.arz (12)&lt;br /&gt;
 ├─ *.mdt (5)&lt;br /&gt;
 ├─ *.pzz (2)&lt;br /&gt;
 └─ *.tpl (415)&lt;br /&gt;
 afs_data_g.afs&lt;br /&gt;
 ├─ *.arc (47)&lt;br /&gt;
 ├─ *.arz (12)&lt;br /&gt;
 ├─ *.mdt (5)&lt;br /&gt;
 ├─ *.pzz (2)&lt;br /&gt;
 └─ *.tpl (415)&lt;br /&gt;
 opening.bnr&lt;br /&gt;
 poq_adx_pal.afs&lt;br /&gt;
 ├─ *.adx (2113)&lt;br /&gt;
 └─ *.sfd (4) - pal version&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
=== JAP : ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
  GCM_SYS/&lt;br /&gt;
 ├─ apploader.img&lt;br /&gt;
 └─ boot.dol&lt;br /&gt;
 afs_data.afs&lt;br /&gt;
 ├─ *.arc (1369)&lt;br /&gt;
 ├─ *.arz (184)&lt;br /&gt;
 ├─ *.bin (586)&lt;br /&gt;
 ├─ *.chd (4)&lt;br /&gt;
 ├─ *.dpk (4)&lt;br /&gt;
 ├─ *.mdt (6)&lt;br /&gt;
 ├─ *.ptl (1)&lt;br /&gt;
 ├─ *.pzz (255)&lt;br /&gt;
 ├─ *.ref (1)&lt;br /&gt;
 ├─ *.tpl (442)&lt;br /&gt;
 ├─ *.tsb (4)&lt;br /&gt;
 └─ *.txg (1)&lt;br /&gt;
 opening.bnr&lt;br /&gt;
 poq_adx.afs&lt;br /&gt;
 ├─ *.adx (2113)&lt;br /&gt;
 └─ *.sfd (2)&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== afs_data.afs file naming scheme ==&lt;br /&gt;
&lt;br /&gt;
You can check full description of all file here : [[All Assets File Name Index]]&lt;br /&gt;
&lt;br /&gt;
File naming scheme :&lt;br /&gt;
{| class=&amp;quot;mw-collapsible mw-collapsed wikitable&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | File naming scheme. &amp;amp;nbsp;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| pl####* || Borgs files (&#039;&#039;&#039;Pl&#039;&#039;&#039;ayer Character)&lt;br /&gt;
|-&lt;br /&gt;
| mn####.tpl || Borgs names in &#039;&#039;&#039;M&#039;&#039;&#039;e&#039;&#039;&#039;n&#039;&#039;&#039;us (206)&lt;br /&gt;
|-&lt;br /&gt;
| st## || &#039;&#039;&#039;st&#039;&#039;&#039;age - maps files. We find in position 1,2,3 hitsxx.bin files.&lt;br /&gt;
|-&lt;br /&gt;
| so## || &#039;&#039;&#039;s&#039;&#039;&#039;tage &#039;&#039;&#039;o&#039;&#039;&#039;bject. Building and structures used in battles.&lt;br /&gt;
|-&lt;br /&gt;
| firstld.pzz || Memory card related files (&#039;&#039;&#039;First l&#039;&#039;&#039;oa&#039;&#039;&#039;d&#039;&#039;&#039; - We found the memory card picture in the pzz)&lt;br /&gt;
|-&lt;br /&gt;
| icon.bin || Same than firstld\003C_firstldicon.bin - 3D icon of the memory card&lt;br /&gt;
|-&lt;br /&gt;
| face#### || Describe NPCs and properties used when using Special Moves / Abilities&lt;br /&gt;
|-&lt;br /&gt;
| it####_mdl.arz || (90 files) - &#039;&#039;&#039;It&#039;&#039;&#039;em Data Crystal -&amp;gt; #### Match everytime to a Borg requesting multiple Data Crystals&lt;br /&gt;
|-&lt;br /&gt;
| box00_mdl.arc || Gotcha Box&lt;br /&gt;
|-&lt;br /&gt;
| ckpt* || Graphical user interface elements used in battles.&lt;br /&gt;
|-&lt;br /&gt;
| d###_mdl.arc || Menu collection 002 : Borgs list, 001 : Borg View &lt;br /&gt;
|-&lt;br /&gt;
| deck00_mdl.arc || Edit force menu&lt;br /&gt;
|-&lt;br /&gt;
| entry00_mdl.arc || Interface used to enter player name with characters&lt;br /&gt;
|-&lt;br /&gt;
| optn00_mdl.arc || Option menu&lt;br /&gt;
|-&lt;br /&gt;
| fmg00_mdl.arc || Neo G Red icon used in Story Mode dialogs&lt;br /&gt;
|-&lt;br /&gt;
| rpot##_mdl.arc || Graphical elements used in end of battles&lt;br /&gt;
|-&lt;br /&gt;
| unitall_mdl.arc || Borgs miniatures images used in Edit Force menu, at battle start and so on.&lt;br /&gt;
|-&lt;br /&gt;
| mcmg00_mdl.arc || When loading memory card.&lt;br /&gt;
|-&lt;br /&gt;
| stff* || Main menu&lt;br /&gt;
|-&lt;br /&gt;
| story* || Used in Story Mode progress&lt;br /&gt;
|-&lt;br /&gt;
| trade00_mdl.arc || Used in Trade Menu&lt;br /&gt;
|-&lt;br /&gt;
| set* || Elements to place in the maps (wall, trees and so on.)&lt;br /&gt;
|-&lt;br /&gt;
| tl00_mdl.arc || Used on corners of the main menu.&lt;br /&gt;
|-&lt;br /&gt;
| gets* || Cinematic used when earning a new Borg. (Blue = Crystal); &lt;br /&gt;
|-&lt;br /&gt;
| gets06_mdl.arc || Cinematic when earning Neo G Red and others colors of Neo G Red.&lt;br /&gt;
|-&lt;br /&gt;
| nwld* || Unimplemented.&lt;br /&gt;
|-&lt;br /&gt;
| staff00_mdl.arc || Credits screen.&lt;br /&gt;
|-&lt;br /&gt;
| vsel00_mdl.arc || Multiplayer screen.&lt;br /&gt;
|-&lt;br /&gt;
| vsel01_mdl.arc || Created forces selection screen before start of battles. &lt;br /&gt;
|-&lt;br /&gt;
| st###_mdl.arz || PNJs images&lt;br /&gt;
|-&lt;br /&gt;
| stm## || Dialogs used in story mode.&lt;br /&gt;
|-&lt;br /&gt;
| sts## || Images used when selecting zones in story mode (face your opponent &amp;amp; defeat the boss)&lt;br /&gt;
|-&lt;br /&gt;
| briff00_mdl.arc || Images used for &amp;quot;VS&amp;quot; page start of fight.&lt;br /&gt;
|-&lt;br /&gt;
| cnd* (3) || Unimplemented files or used for animated titles. The text is inclined and distorted. (defeat enemy gotcha borgs! and so on.)&lt;br /&gt;
|-&lt;br /&gt;
| efct* || &#039;&#039;&#039;Ef&#039;&#039;&#039;fe&#039;&#039;&#039;ct&#039;&#039;&#039;s - effects used in battles like Shots or Shock.&lt;br /&gt;
|-&lt;br /&gt;
| name00_mdl.arc || Used in &amp;quot;Enter Name&amp;quot; window with grey alphabet.&lt;br /&gt;
|-&lt;br /&gt;
| arrow_mdl.arc || Used probably with a scale for Ally / Ennemy health bar.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Game assets implementation ==&lt;br /&gt;
The page [[Implementations|implementations]] group technical details about game assets implementations:&lt;br /&gt;
* Borgs&lt;br /&gt;
* Data Crystals&lt;br /&gt;
* and so on.&lt;br /&gt;
&lt;br /&gt;
You might also want to read:&lt;br /&gt;
* [[Models]]&lt;br /&gt;
* [[Animations]]&lt;br /&gt;
* [[Borg - data file]]&lt;br /&gt;
&lt;br /&gt;
See also [https://github.com/Virtual-World-RE/NeoGF/tree/main/doc our documentation] available on github.&lt;br /&gt;
&lt;br /&gt;
== Main executable ==&lt;br /&gt;
Depending of which software is used the name of main executable may change since it&#039;s not stored in the GCM file: boot.[[DOL (File format)|dol]] / Start.[[DOL (File format) |dol]] and so on.&lt;br /&gt;
&lt;br /&gt;
The page [[DOL (Gotcha Force)]] group ongoing reasearchs, technical details and caracteristics of the mains Gotcha Force dols.&lt;br /&gt;
&lt;br /&gt;
The main executable embeds [https://usermanual.wiki/m/f28d717b124185a5deabfe6020cb945538679565e15cad6ec9f93a47e04eabef.pdf MetroTRK], a Target Resident Kernel for embedded systems allowing to remotly debug the game.&lt;br /&gt;
&lt;br /&gt;
We found differents staticly linked librairies in it and in particular HSD engine (HAL Sysdolphin engine). Source files hasn&#039;t been leaked on the internet but we can find an awesome work realized by [https://smashboards.com/search/1402833/?q=hsd&amp;amp;o=relevance &amp;quot;Super Smash Bros. Melee&amp;quot; GameCube community] on which we can refer:&lt;br /&gt;
&lt;br /&gt;
-[https://github.com/UnclePunch/Training-Mode/wiki/HSD-Documentation Global description of HSD elements]&lt;br /&gt;
&lt;br /&gt;
-[https://github.com/PsiLupan/FRAY Reverse engineering of assemblies rewritten in C]&lt;br /&gt;
&lt;br /&gt;
== Beta version ==&lt;br /&gt;
The beta version of the game contains differencies from the final releases. The 3D map is isometric with 3D elements in it and Borgs descriptions was contained in the screen with two sections: one for characteristics and the other one for the Borg story.&lt;br /&gt;
&lt;br /&gt;
[[File:Gfbeta02.jpg|800px|center|thumb|Isometric beta map. [https://www.unseen64.net/2008/04/08/gotcha-force-gc-beta-concept/ Source]]]&lt;br /&gt;
&lt;br /&gt;
[[File:gotchaforcebeta01.jpg|800px|thumb|center|Beta Borg description. [https://www.unseen64.net/2008/04/08/gotcha-force-gc-beta-concept/ Source]]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1293</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1293"/>
		<updated>2023-02-20T12:48:16Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: /* not verified yet */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15);&amp;quot;&amp;gt;Cette section est en cours de rédaction.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15); text-align: center;&amp;quot;&amp;gt;Des recherches sont encore nécessaires et certains paragraphes peuvent être faux.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modèles Gotcha Force ==&lt;br /&gt;
&lt;br /&gt;
Les modèles Gotcha Force fonctionnent comme ceux du jeu Super Smash Bros Melee (SSBM) investigué par sa [https://smashboards.com/threads/melee-dat-format.292603/ communauté].&lt;br /&gt;
&lt;br /&gt;
Un modèle est un format de fichier organisant des objets et des ressources sérialisés pour être utilisés par la librairie &#039;&#039;&#039;H&#039;&#039;&#039;al &#039;&#039;&#039;S&#039;&#039;&#039;ys&#039;&#039;&#039;D&#039;&#039;&#039;olphin (&#039;&#039;&#039;HSD&#039;&#039;&#039;), une librairie utilisée dans plusieurs jeux par Capcom. Ce sont des ressources graphiques structurées de manière hiérarchique. La présence de certaines images dans les modèles montrent à priori l&#039;utilisation de la technique [https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/matcap.html matcap].&lt;br /&gt;
Par ailleurs, la librairie prendrait ses sources sur le SDK Dolphin, tel que GX ou encore MTX.&lt;br /&gt;
&lt;br /&gt;
=== Fichiers concernés ===&lt;br /&gt;
L&#039;ensemble des fichiers ayant dans leur titre &#039;&#039;&#039;_mdl&#039;&#039;&#039; sont des fichiers modèles correspondant au format décrit dans cette page. On notera les fichiers [[ARZ (Gotcha Force)|.arz]] qui sont des modèles compressés. Le fichier collision.arc et les fichiers tdc00.arc à tdc09.arc sont aussi des modèles.&lt;br /&gt;
&lt;br /&gt;
Les fichiers modèles se retrouvent aussi dans les pzz des borgs (plxxxx.pzz) en position 004 à 009.&lt;br /&gt;
&lt;br /&gt;
=== HSDRaw ===&lt;br /&gt;
HSDRaw, un éditeur 3D dotnet de ce format est instable sur mon Windows (algoflash). Il est cependant prouvé qu&#039;un edit des _mdl pour commencer à l&#039;offset 0x100 - après le préambule - permet de visualiser le fichier sur HSDRaw et d&#039;avoir le rendu 3D du Borg (click sur le premier dossier JOBJ - puis le JOBJ dedans et double click sur le nœud en violet). Cela devrait aussi permettre d&#039;éditer certaines propriétés ?&lt;br /&gt;
&lt;br /&gt;
== Structure générale ==&lt;br /&gt;
Le format des modèles se découpe en plusieurs blocks. Le préambule fait 0x100 octets au tout début du fichier. Il est souvent absent. Toutes les valeurs sont en unsigned big endian, et le pad est en Nulls bytes (\x00). Les offsets trouvés après le début du Data Block (DB) sont relatifs au début du DB. La table de relocs est un tableau d&#039;offsets de 4 octets (relatif au DB) permettant de traduire en adressage absolu les offsets des structures lors du chargement mémoire. La table de reloc permet par exemple de délimiter les structures du fait qu&#039;il est peu probable qu&#039;un offset pointe au milieu d&#039;une structure.&lt;br /&gt;
&lt;br /&gt;
L&#039;ensemble des fichiers répondant à ce format on un seul root_node de type SObj (Scene data).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Préambule&#039;&#039;&#039; : (0x100 octets / 0 octets) ===&lt;br /&gt;
* 4 octets - hsd_header_offset=0x100 (toujours)&lt;br /&gt;
* 4 octets - bones_flags_table_offset=0x20 (toujours) - offset de la liste des flags des armatures&lt;br /&gt;
* 4 octets - bones_table_offset=0xC0 (toujours) - offset de la liste des armatures&lt;br /&gt;
* 20 octets - Pad - (toujours)&lt;br /&gt;
* 4 octets [32] - Inconnu (flags des armatures ?) 1 octet par flag ?&lt;br /&gt;
* 32 octets - Pad - (toujours)&lt;br /&gt;
* 32 octets - armatures ?&lt;br /&gt;
* 32 octets - Pad - (toujours)&lt;br /&gt;
=== &#039;&#039;&#039;HSD Header&#039;&#039;&#039; - (0x20 octets) ===&lt;br /&gt;
* 4 octets - Taille totale du fichier&lt;br /&gt;
* 4 octets - Taille du Data block&lt;br /&gt;
* 4 octets - Nombre d&#039;entrée dans la Table de relocs&lt;br /&gt;
* 4 octets - root0_count&lt;br /&gt;
* 4 octets - root1_count&lt;br /&gt;
* 12 octets - Pad - (toujours)&lt;br /&gt;
=== &#039;&#039;&#039;Data block&#039;&#039;&#039; : ===&lt;br /&gt;
* JOBJ, etc. -&amp;gt; Ces structures sont détaillée plus loin ci-dessous.&lt;br /&gt;
=== &#039;&#039;&#039;Relocation Table&#039;&#039;&#039; : ===&lt;br /&gt;
* Tableau d&#039;offsets de 4 octets - Offsets des structures dans le DB.&lt;br /&gt;
=== &#039;&#039;&#039;Root Nodes (2)&#039;&#039;&#039; : ===&lt;br /&gt;
* Tableau de taille 8 * root0_count&lt;br /&gt;
** 4 octets - root_offset - relatif au DB&lt;br /&gt;
** 4 octets - string_table_offset - relatif à la StringTable&lt;br /&gt;
* Tableau de taille 8 * root1_count&lt;br /&gt;
** 4 octets - root_offset - relatif au DB&lt;br /&gt;
** 4 octets - string_table_offset - relatif à la StringTable&lt;br /&gt;
=== &#039;&#039;&#039;String Table&#039;&#039;&#039; : ===&lt;br /&gt;
* Suite de strings terminées par Null au nombre de root0_count + root1_count&lt;br /&gt;
&lt;br /&gt;
== Structures rencontrées dans le DB ==&lt;br /&gt;
Note : l&#039;arborescence est cumulative sur les transformations pour les relations parents-&amp;gt;enfants&lt;br /&gt;
&lt;br /&gt;
Les Noeuds Racine qui ont pour nom &amp;quot;scene_data&amp;quot; pointent sur un SObj :&lt;br /&gt;
=== &#039;&#039;&#039;SObj&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - JObjDescs_offsets_list_offset&lt;br /&gt;
* 4 octets - Cameras_list_offset&lt;br /&gt;
* 4 octets - Lights_list_offset&lt;br /&gt;
* 4 octets - Fog&lt;br /&gt;
&lt;br /&gt;
&amp;quot;scene_data&amp;quot; == nom du nœud racine&lt;br /&gt;
JObjDescs_offsets_list_offset, cameras.. pointent sur une liste d&#039;offsets terminée par 4 octets à 0x00.&lt;br /&gt;
lights_list_offset pointe sur des couples (4 octets - LObj_offset ; 4 octets - light_anim_pointer_offset)&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObjDesc&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - root_joint_offset - JObj&lt;br /&gt;
* 4 octets - joint_animations_offset - ?&lt;br /&gt;
* 4 octets - material_animations_offset - ?&lt;br /&gt;
* 4 octets - shape_animations_offset - ?&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CObj&#039;&#039;&#039; : (0x38 octets) ===&lt;br /&gt;
* 4 octets - flags&lt;br /&gt;
* 4 octets - projection_type - ProjectionTypeEnum&lt;br /&gt;
* 2 octets - viewport_left&lt;br /&gt;
* 2 octets - viewport_right&lt;br /&gt;
* 2 octets - viewport_top&lt;br /&gt;
* 2 octets - viewport_bottom&lt;br /&gt;
* 4 octets - proj_width&lt;br /&gt;
* 4 octets - proj_height&lt;br /&gt;
* 4 octets - eye_offset - WObj&lt;br /&gt;
* 4 octets - target_offset - WObj&lt;br /&gt;
* 4 octets - roll&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - float - near_clip&lt;br /&gt;
* 4 octets - float - far_clip&lt;br /&gt;
* 4 octets - float - field_of_view&lt;br /&gt;
* 4 octets - float - aspect&lt;br /&gt;
Camera object. Note : pour frustrum ou ortho, la structure est différente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ProjectionTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** PERSPECTIVE = 1&lt;br /&gt;
** FRUSTRUM = 2&lt;br /&gt;
** ORTHO = 3&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;WObj&#039;&#039;&#039;: (0x14 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - float - v1&lt;br /&gt;
* 4 octets - float - v2&lt;br /&gt;
* 4 octets - float - v3&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
eye / target&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObj&#039;&#039;&#039; : (0x1c octets) ===&lt;br /&gt;
* 4 octets - class_name&lt;br /&gt;
* 4 octets - next_offset&lt;br /&gt;
* 2 octets - flags - LObjFlagsEnum&lt;br /&gt;
* 2 octets - attenuation_flags - LObjAttenuationFlagsEnum&lt;br /&gt;
* 1 octet - color_r&lt;br /&gt;
* 1 octet - color_g&lt;br /&gt;
* 1 octet - color_b&lt;br /&gt;
* 1 octet - color_alpha&lt;br /&gt;
* 4 octets - lobj_point_offset - position&lt;br /&gt;
* 4 octets - infinite_data&lt;br /&gt;
* 4 octets - point_spot_data&lt;br /&gt;
light&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_AMBIANT = 00 00&lt;br /&gt;
** LOBJ_INFINITE = 00 01&lt;br /&gt;
** LOBJ_POINT = 00 02&lt;br /&gt;
** LOBJ_SPOT = 00 03&lt;br /&gt;
** LOBJ_DIFFUSE = 00 04&lt;br /&gt;
** LOBJ_SPECULAR = 00 08&lt;br /&gt;
** LOBJ_ALPHA = 00 10&lt;br /&gt;
** LOBJ_HIDDEN = 00 20&lt;br /&gt;
** LOBJ_RAW_PARAM = 00 40&lt;br /&gt;
** LOBJ_DIFF_DIRTY = 00 80&lt;br /&gt;
** LOBJ_SPEC_DIRTY = 01 00&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LObjAttenuationFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_LIGHT_ATTN_NONE = 00 00&lt;br /&gt;
** LOBJ_LIGHT_ATTN = 00 01&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObjPoint&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 4 octets - class_name&lt;br /&gt;
* 4 octets - float - x&lt;br /&gt;
* 4 octets - float - y&lt;br /&gt;
* 4 octets - float - z&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LightAnimPointer&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
** 4 octets - next_offset - (LightAnimPointer)&lt;br /&gt;
** 4 octets - light_anim - ?&lt;br /&gt;
** 4 octets - position_anim - ?&lt;br /&gt;
** 4 octets - interst_anim - ?&lt;br /&gt;
Bugs dans HSDRaw - à tester&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObj&#039;&#039;&#039; : (0x40 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - flags&lt;br /&gt;
* 4 octets - child_offset (JObj)&lt;br /&gt;
* 4 octets - next_offset (JObj)&lt;br /&gt;
* 4 octets - dobj_offset (DObj)&lt;br /&gt;
* 4 octets [3] - float3 - rotation_xyz&lt;br /&gt;
* 4 octets [3] - float3 - scale_xyz&lt;br /&gt;
* 4 octets [3] - float3 - translation_xyz&lt;br /&gt;
* 4 octets - inverse_world_transform_offset (inverse world transform = Matrice de 4x3)&lt;br /&gt;
* 4 octets - robj_offset&lt;br /&gt;
&lt;br /&gt;
Pointé par les listes dans Root Node scene_data.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;JObjFlagsEnum&#039;&#039;&#039; : (peuvent se cumuler)&lt;br /&gt;
** NULL = 00 00 00 00&lt;br /&gt;
** SKELETON = 00 00 00 01&lt;br /&gt;
** SKELETON_ROOT = 00 00 00 02&lt;br /&gt;
** ENVELOPE_MODEL = 00 00 00 04&lt;br /&gt;
** CLASSICAL_SCALING = 00 00 00 08&lt;br /&gt;
** HIDDEN = 00 00 00 10&lt;br /&gt;
** PTCL = 00 00 00 20&lt;br /&gt;
** MTX_DIRTY = 00 00 00 40&lt;br /&gt;
** LIGHTING = 00 00 00 80&lt;br /&gt;
** TEXGEN = 00 00 01 00&lt;br /&gt;
** BILLBOARD = 00 00 02 00&lt;br /&gt;
** VBILLBOARD = 00 00 04 00&lt;br /&gt;
** HBILLBOARD = 00 00 06 00&lt;br /&gt;
** RBILLBOARD = 00 00 08 00&lt;br /&gt;
** INSTANCE = 00 00 10 00&lt;br /&gt;
** PBILLBOARD = 00 00 20 00&lt;br /&gt;
** SPLINE = 00 00 40 00&lt;br /&gt;
** FLIP_IK = 00 00 80 00&lt;br /&gt;
** SPECULAR = 00 01 00 00&lt;br /&gt;
** USE_QUATERNION = 00 02 00 00&lt;br /&gt;
** OPA = 00 04 00 00&lt;br /&gt;
** XLU = 00 08 00 00&lt;br /&gt;
** TEXEDGE = 00 10 00 00&lt;br /&gt;
** JOINT1 = 00 20 00 00&lt;br /&gt;
** JOINT2 = 00 40 00 00&lt;br /&gt;
** EFFECTOR = 00 60 00 00&lt;br /&gt;
** USER_DEFINED_MTX = 00 80 00 00&lt;br /&gt;
** MTX_INDEPEND_PARENT = 01 00 00 00&lt;br /&gt;
** MTX_INDEPEND_SRT = 02 00 00 00&lt;br /&gt;
** MTX_SCALE_COMPENSATE = 04 00 00 00&lt;br /&gt;
** ROOT_OPA = 10 00 00 00&lt;br /&gt;
** ROOT_XLU = 20 00 00 00&lt;br /&gt;
** ROOT_TEXEDGE = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;InverseWorldTransform&#039;&#039;&#039; : (0x30 octets) ===&lt;br /&gt;
* 4 octets - float - M11&lt;br /&gt;
* 4 octets - float - M12&lt;br /&gt;
* 4 octets - float - M13&lt;br /&gt;
* 4 octets - float - M14&lt;br /&gt;
* 4 octets - float - M21&lt;br /&gt;
* 4 octets - float - M22&lt;br /&gt;
* 4 octets - float - M23&lt;br /&gt;
* 4 octets - float - M24&lt;br /&gt;
* 4 octets - float - M31&lt;br /&gt;
* 4 octets - float - M32&lt;br /&gt;
* 4 octets - float - M33&lt;br /&gt;
* 4 octets - float - M34&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;DObj&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - next_offset - prochain DOBJ&lt;br /&gt;
* 4 octets - mobj_offset - material offset&lt;br /&gt;
* 4 octets - pobj_offset - mesh offset&lt;br /&gt;
Liste chaînée qui permet de récupérer l&#039;ensemble des materials &amp;amp; mesh pour le JObj auquel il est lié.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;MObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - render_flags - RenderFlagsEnum&lt;br /&gt;
* 4 octets - tobj_offset - offset de texture - peut être invalide s&#039;il n&#039;y a pas de texture pour le material&lt;br /&gt;
* 4 octets - material_offset - couleurs des materials ?&lt;br /&gt;
* 8 octets - PEDesc ?&lt;br /&gt;
&lt;br /&gt;
Contient les textures &amp;amp; informations sur les couleurs des Materials.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RenderFlagsEnum&#039;&#039;&#039; : (se cumulent)&lt;br /&gt;
** USER = 80 00 00 00&lt;br /&gt;
** CONSTANT = 00 00 00 01&lt;br /&gt;
** VERTEX = 00 00 00 02&lt;br /&gt;
** BOTH = 00 00 00 03&lt;br /&gt;
** DIFFUSE = 00 00 00 04&lt;br /&gt;
** SPECULAR = 00 00 00 08&lt;br /&gt;
** TEX0 = 00 00 00 10&lt;br /&gt;
** TEX1 = 00 00 00 20&lt;br /&gt;
** TEX2 = 00 00 00 40&lt;br /&gt;
** TEX3 = 00 00 00 80&lt;br /&gt;
** TEX4 = 00 00 01 00&lt;br /&gt;
** TEX5 = 00 00 02 00&lt;br /&gt;
** TEX6 = 00 00 04 00&lt;br /&gt;
** TEX7 = 00 00 08 00&lt;br /&gt;
** TOON = 00 00 10 00&lt;br /&gt;
** ALPHA_MAT = 00 00 20 00&lt;br /&gt;
** ALPHA_VTX = 00 00 40 00&lt;br /&gt;
** ALPHA_BOTH = 00 00 60 00&lt;br /&gt;
** ZOFST = 01 00 00 00&lt;br /&gt;
** EFFECT = 02 00 00 00&lt;br /&gt;
** SHADOW = 04 00 00 00&lt;br /&gt;
** ZMODE_ALWAYS = 08 00 00 00&lt;br /&gt;
** DF_ALL = 10 00 00 00&lt;br /&gt;
** NO_ZUPDATE = 20 00 00 00&lt;br /&gt;
** XLU = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;TObj&#039;&#039;&#039; : (0x5c octets) ===&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - tex_map_id - TexMapIdEnum&lt;br /&gt;
* 4 octets - gx_tex_gen_src - GXTexGenSrcEnum&lt;br /&gt;
* 4 octets - float - rx&lt;br /&gt;
* 4 octets - float - ry&lt;br /&gt;
* 4 octets - float - rz&lt;br /&gt;
* 4 octets - float - sx&lt;br /&gt;
* 4 octets - float - sy&lt;br /&gt;
* 4 octets - float - sz&lt;br /&gt;
* 4 octets - float - tx&lt;br /&gt;
* 4 octets - float - ty&lt;br /&gt;
* 4 octets - float - tz&lt;br /&gt;
* 4 octets - wrap_s - WrapEnum&lt;br /&gt;
* 4 octets - wrap_t - WrapEnum&lt;br /&gt;
* 1 octet - w_scale&lt;br /&gt;
* 1 octet - h_scale&lt;br /&gt;
* 2 octets - ?&lt;br /&gt;
* 1 octets - bump_map - (False = 00 ; True = 01)&lt;br /&gt;
* 4 bits - alpha_operation - AlphaOperationEnum&lt;br /&gt;
* 4 bits - color_operation - ColorOperationEnum&lt;br /&gt;
* 1 octet - shadow_lightmap - (False = 00 ; True = 01) (2 octets avec une Enum lightmap limite)&lt;br /&gt;
* 1 bit - ext_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
* 1 bit - ambiant_lightmap - (False = 0 ; True = 1) &lt;br /&gt;
* 1 bit - specular_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
* 1 bit - diffuse_lightmap (False = 0 ; True = 1)&lt;br /&gt;
* 4 bits - coord_type - CoordTypeEnum&lt;br /&gt;
* 4 octets - float - blending - utilisé quand color_operation ou alpha_operation == BLEND&lt;br /&gt;
* 4 octets - mag_filter - MagFilterEnum&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
Informations de Textures. Le TObj contient des informations sur les paramètres d&#039;environnement de textures utilisés pour le rendu graphique ainsi que les offset de l&#039;image et des données de la palette utilisés pour cette texture. Le plus important ici, c&#039;est l&#039;offset d&#039;image et la palette/tlut - si l&#039;image n&#039;est pas indexée (RGBA, CMPR, etc.) alors la structure de description palette/tlut n&#039;est pas utilisée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TexMapIdEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TEXMAP0 = 00 00 00 00&lt;br /&gt;
** GX_TEXMAP1 = 00 00 00 01&lt;br /&gt;
** GX_TEXMAP2 = 00 00 00 02&lt;br /&gt;
** GX_TEXMAP3 = 00 00 00 03&lt;br /&gt;
** GX_TEXMAP4 = 00 00 00 04&lt;br /&gt;
** GX_TEXMAP5 = 00 00 00 05&lt;br /&gt;
** GX_TEXMAP6 = 00 00 00 06&lt;br /&gt;
** GX_TEXMAP7 = 00 00 00 07&lt;br /&gt;
** GX_MAX_TEXMAP = 00 00 00 08&lt;br /&gt;
** GX_TEXMAP_NULL = 00 00 00 09&lt;br /&gt;
** GX_TEXMAP_DISABLE = 00 00 00 0A&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GXTexGenSrcEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TG_POS = 00 00 00 00&lt;br /&gt;
** GX_TG_NRM = 00 00 00 01&lt;br /&gt;
** GX_TG_BINRM = 00 00 00 02&lt;br /&gt;
** GX_TG_TANGENT = 00 00 00 03&lt;br /&gt;
** GX_TG_TEX0 = 00 00 00 04&lt;br /&gt;
** GX_TG_TEX1 = 00 00 00 05&lt;br /&gt;
** GX_TG_TEX2 = 00 00 00 06&lt;br /&gt;
** GX_TG_TEX3 = 00 00 00 07&lt;br /&gt;
** GX_TG_TEX4 = 00 00 00 08&lt;br /&gt;
** GX_TG_TEX5 = 00 00 00 09&lt;br /&gt;
** GX_TG_TEX6 = 00 00 00 0A&lt;br /&gt;
** GX_TG_TEX7 = 00 00 00 0B&lt;br /&gt;
** GX_TG_TEXCOORD0 = 00 00 00 0C&lt;br /&gt;
** GX_TG_TEXCOORD1 = 00 00 00 0D&lt;br /&gt;
** GX_TG_TEXCOORD2 = 00 00 00 0E&lt;br /&gt;
** GX_TG_TEXCOORD3 = 00 00 00 0F&lt;br /&gt;
** GX_TG_TEXCOORD4 = 00 00 00 10&lt;br /&gt;
** GX_TG_TEXCOORD5 = 00 00 00 11&lt;br /&gt;
** GX_TG_TEXCOORD6 = 00 00 00 12&lt;br /&gt;
** GX_TG_COLOR0 = 00 00 00 13&lt;br /&gt;
** GX_TG_COLOR1 = 00 00 00 14&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AlphaOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = 0X&lt;br /&gt;
** ALPHAMASK = 1X&lt;br /&gt;
** BLEND = 2X&lt;br /&gt;
** MODULATE = 3X&lt;br /&gt;
** REPLACE = 4X&lt;br /&gt;
** PASS = 5X&lt;br /&gt;
** ADD = 6X&lt;br /&gt;
** SUB = 7X&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ColorOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = X0&lt;br /&gt;
** ALPHA_MASK = X1&lt;br /&gt;
** RGB_MASK = X2&lt;br /&gt;
** BLEND = X3&lt;br /&gt;
** MODULATE = X4&lt;br /&gt;
** REPLACE = X5&lt;br /&gt;
** PASS = X6&lt;br /&gt;
** ADD = X7&lt;br /&gt;
** SUB = X8&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CoordTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** UV = X0&lt;br /&gt;
** REFLECTION = X1&lt;br /&gt;
** HILIGHT = X2&lt;br /&gt;
** SHADOW = X3&lt;br /&gt;
** TOON = X4&lt;br /&gt;
** GRADATION = X5&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MagFilterEnum&#039;&#039;&#039;:&lt;br /&gt;
** GX_NEAR = 00 00 00 00&lt;br /&gt;
** GX_LINEAR = 00 00 00 01&lt;br /&gt;
** GX_NEAR_MIP_NEAR = 00 00 00 02&lt;br /&gt;
** GX_LIN_MIP_NEAR = 00 00 00 03&lt;br /&gt;
** GX_NEAR_MIP_LIN = 00 00 00 04&lt;br /&gt;
** GX_LIN_MIP_LIN = 00 00 00 05&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WrapEnum&#039;&#039;&#039;:&lt;br /&gt;
** CLAMP = 00 00 00 00&lt;br /&gt;
** REPEAT = 00 00 00 01&lt;br /&gt;
** MIRROR = 00 00 00 02&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Material&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 1 octets - AMB_R - (ambient)&lt;br /&gt;
* 1 octets - AMB_G&lt;br /&gt;
* 1 octets - AMB_B&lt;br /&gt;
* 1 octets - AMB_A&lt;br /&gt;
* 1 octets - DIF_R - (diffuse)&lt;br /&gt;
* 1 octets - DIF_G&lt;br /&gt;
* 1 octets - DIF_B&lt;br /&gt;
* 1 octets - DIF_A&lt;br /&gt;
* 1 octets - SPC_R - (specular)&lt;br /&gt;
* 1 octets - SPC_G&lt;br /&gt;
* 1 octets - SPC_B&lt;br /&gt;
* 1 octets - SPC_A&lt;br /&gt;
* 4 octets - float - alpha&lt;br /&gt;
* 4 octets - float - shininess&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - next_offset - pobj&lt;br /&gt;
* 4 octets - vertex_attr_list_offset&lt;br /&gt;
* 2 octets - Flags - PObjFlagsEnum&lt;br /&gt;
* 2 octets - display_list_size - number of 0x20 (32) byte blocks occupied by display list data&lt;br /&gt;
* 4 octets - display_list_offset&lt;br /&gt;
* 4 octets - weight_list_offset - ? verifier qu&#039;on retrouve bien le tableau d&#039;envelope_weights à cet offset&lt;br /&gt;
&lt;br /&gt;
Comme l&#039;indique next_offset, il s&#039;agit d&#039;une liste de meshs à afficher pour un material donné référencé par un dobj. PObj contient les offsets de vertex attributes / display list / joint weight list ce qui suffit et permet d’interpréter et traiter les coordonnées de vertices, normals &amp;amp; textures.&lt;br /&gt;
&lt;br /&gt;
Les attributs vertex sont les plus important - les parametres specifiés contrôlent tout : du format, de la taille des données de chaque vertex, normal et coordonnées de textures et comment ces valeurs sont dimensionnées (scaled) par rapport à la présence et la taille de chaque valeur d&#039;index qui apparaît dans la display list information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** Inconnu0 = 00 01&lt;br /&gt;
** Inconnu1 = 00 02&lt;br /&gt;
** ANIM = 00 08&lt;br /&gt;
** SHAPE_ANIM = 10 00&lt;br /&gt;
** ENVELOPE = 20 00&lt;br /&gt;
** CULLBACK = 40 00&lt;br /&gt;
** CULLFRONT = 80 00&lt;br /&gt;
&lt;br /&gt;
=== EnvelopeWeights : (0x? octets) ===&lt;br /&gt;
* 4 octets - envelope_count&lt;br /&gt;
* [envelope_count]:&lt;br /&gt;
** 4 octets - float - weight&lt;br /&gt;
** 4 octets - pad ?&lt;br /&gt;
* 4 octets - jobj_list_offset&lt;br /&gt;
&lt;br /&gt;
=== not verified yet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IMAGE_HEADER&#039;&#039;&#039; :&lt;br /&gt;
** 4 octets - image_offset - image data&lt;br /&gt;
** 2 octets - width&lt;br /&gt;
** 2 octets - height&lt;br /&gt;
** 4 octets - image_format&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PALETTE_HEADER&#039;&#039;&#039; : (0x10)&lt;br /&gt;
** 4 octets - palette_offset - palette data&lt;br /&gt;
** 4 octets - palette_format&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
** 2 octets - color_count&lt;br /&gt;
** 2 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
image_offset et palette_offset sont souvent partagés par plusieurs textures - savoir ça permet de retrouver toutes les informations sur les images des textures (largeur, hauteur, format), ainsi que le format et le nombre de couleurs de la palette/tlut.&lt;br /&gt;
&lt;br /&gt;
Le format d&#039;image ne détermine pas le nombre total de couleurs de la palette qu&#039;elle utilisent. Par exemple, une image indexée sur 8 bits aurait un maximum de 256 couleurs mais seulement 136 ou 221 couleurs sont actuellement utilisées. De la sorte, la palette n&#039;utilisera pas la taille totale qu&#039;elle devrait utiliser.&lt;br /&gt;
&lt;br /&gt;
Les images suivent la structure généralement utilisée par la GameCube :&lt;br /&gt;
&lt;br /&gt;
IMAGE FORMATS :&lt;br /&gt;
* case 0: //i4&lt;br /&gt;
* case 1: //i8&lt;br /&gt;
* case 2: //i4a4&lt;br /&gt;
* case 3: //i8a8&lt;br /&gt;
* case 4: //r5g6b5&lt;br /&gt;
* case 5: //rgb5a3&lt;br /&gt;
* case 6: //r8g8b8a8&lt;br /&gt;
* case 8: //index4&lt;br /&gt;
* case 9: //index8&lt;br /&gt;
* case 0xa: //index14x2&lt;br /&gt;
* case 0xe: //s3tc1&lt;br /&gt;
&lt;br /&gt;
Les formats indexés utilisent aussi les informations de palettes/tlut et les données peuvent apparaître en plusieurs formats :&lt;br /&gt;
&lt;br /&gt;
PALETTE FORMATS :&lt;br /&gt;
* case 0: //ia8&lt;br /&gt;
* case 1: //r5g6b5&lt;br /&gt;
* case 2: //rgb5a3&lt;br /&gt;
&lt;br /&gt;
---&amp;gt; &amp;quot;Joint Data - Accessing Geometry, Mesh, and Vertex Attributes&amp;quot; https://smashboards.com/threads/melee-dat-format.292603/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
trad a revoir à partir de là, il faut investiguer le rendu 3D sur GameCube pour mieux comprendre&lt;br /&gt;
&lt;br /&gt;
// déclaration d&#039;un vertex et attribute information&lt;br /&gt;
// attr, type, cnt, data_type, flags?, file_offset&lt;br /&gt;
* ATTR_DATA&lt;br /&gt;
** 4 octets - GXAttr     vtx_attr_offset - attr&lt;br /&gt;
** 4 octets - GXAttrType vtx_attr_type   - index_type&lt;br /&gt;
** 4 octets - GXCompCnt  comp_cnt        - cnt&lt;br /&gt;
** 4 octets - GXCompType comp_type       - data_type	&lt;br /&gt;
** 1 octets - scale&lt;br /&gt;
** 1 octets - Inconnu&lt;br /&gt;
** 2 octets - vtx_stride&lt;br /&gt;
** 2 octets - data_offset&lt;br /&gt;
&lt;br /&gt;
vertex_attr_offset pointe sur une liste d&#039;attributs de vertex. Leur nombre n&#039;est pas donné. Les données dans cette structure suivent les informations et les types conçus par l&#039;architecture GameCube/WII et son API. La liste est terminée par une valeur spécifique de vtx_attr qui signale la fin de cette liste. Avec un accès à la doku SDK, il serait fortement conseillé de lire la section à propos des &amp;quot;vertex attributes and other specifications&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La valeur de vtx_attr determine le type de donnée que cet attribut désigne et peut indiquer un nombre de types natifs utilisés utilisés pour passer les données entre les interfaces logicielles et matérielles.&lt;br /&gt;
&lt;br /&gt;
Les valeures possibles sont les suivantes :&lt;br /&gt;
* enum GXAttr (4 octets)&lt;br /&gt;
** GX_VA_PNMTXIDX = 0,    // position/normal matrix index&lt;br /&gt;
** GX_VA_TEX0MTXIDX,      // texture 0 matrix index&lt;br /&gt;
** GX_VA_TEX1MTXIDX,      // texture 1 matrix index&lt;br /&gt;
** GX_VA_TEX2MTXIDX,      // texture 2 matrix index&lt;br /&gt;
** GX_VA_TEX3MTXIDX,      // texture 3 matrix index&lt;br /&gt;
** GX_VA_TEX4MTXIDX,      // texture 4 matrix index&lt;br /&gt;
** GX_VA_TEX5MTXIDX,      // texture 5 matrix index&lt;br /&gt;
** GX_VA_TEX6MTXIDX,      // texture 6 matrix index&lt;br /&gt;
** GX_VA_TEX7MTXIDX,      // texture 7 matrix index&lt;br /&gt;
** GX_VA_POS      = 9,    // position&lt;br /&gt;
** GX_VA_NRM,             // normal&lt;br /&gt;
** GX_VA_CLR0,            // color 0&lt;br /&gt;
** GX_VA_CLR1,            // color 1&lt;br /&gt;
** GX_VA_TEX0,            // input texture coordinate 0&lt;br /&gt;
** GX_VA_TEX1,            // input texture coordinate 1&lt;br /&gt;
** GX_VA_TEX2,            // input texture coordinate 2&lt;br /&gt;
** GX_VA_TEX3,            // input texture coordinate 3&lt;br /&gt;
** GX_VA_TEX4,            // input texture coordinate 4&lt;br /&gt;
** GX_VA_TEX5,            // input texture coordinate 5&lt;br /&gt;
** GX_VA_TEX6,            // input texture coordinate 6&lt;br /&gt;
** GX_VA_TEX7,            // input texture coordinate 7&lt;br /&gt;
&lt;br /&gt;
** GX_POS_MTX_ARRAY,      // position matrix array pointer&lt;br /&gt;
** GX_NRM_MTX_ARRAY,      // normal matrix array pointer&lt;br /&gt;
** GX_TEX_MTX_ARRAY,      // texture matrix array pointer&lt;br /&gt;
** GX_LIGHT_ARRAY,        // light parameter array pointer&lt;br /&gt;
** GX_VA_NBT,             // normal, bi-normal, tangent &lt;br /&gt;
** GX_VA_MAX_ATTR,        // maximum number of vertex attributes&lt;br /&gt;
&lt;br /&gt;
** GX_VA_NULL     = 0xff  // NULL attribute (to mark end of lists)&lt;br /&gt;
&lt;br /&gt;
Toutes les données nécessaires pour représenter un mesh peuvent être spécifiées et indexées d&#039;une manière ou d&#039;une autre. De même, GX_VA_TEX0MTXIDX, GX_VA_CLR0, et autres sont aussi possibles - les valeurs les plus fréquentes dans les données SSBM sont : GX_VA_PNMTXIDX, GX_VA_POS, GX_VA_NRM, et GX_VA_TEX0. Which is to be expected as joint matrices, vertex positions/normals, and texture coordinates respectively are probably the most basic of elements needed to display a texture mesh, whether static or animated.&lt;br /&gt;
&lt;br /&gt;
When the value of vtx_attr == GX_VA_NULL (0xFF), the end of the vertex attribute array has been reached.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The vtx_attr_type values is actually associated with how the value is indexed, and can thus also determine the size of the index value within the display list data.&lt;br /&gt;
&lt;br /&gt;
* 4 octets - enum GXAttrType&lt;br /&gt;
** GX_NONE    = 0,&lt;br /&gt;
** GX_DIRECT,&lt;br /&gt;
** GX_INDEX8,&lt;br /&gt;
** GX_INDEX16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Structures COLL_DATA : (données de collisions)&lt;br /&gt;
** 4 octets - vertex_offset (2 float par entrée correspondant à des données 2D probablement)&lt;br /&gt;
** 4 octets - vertex_count&lt;br /&gt;
** 4 octets - index_offset&lt;br /&gt;
** 4 octets - index_count&lt;br /&gt;
** 4 octets [5] - tableau inconnu&lt;br /&gt;
*** 2 octets - index_start&lt;br /&gt;
*** 2 octets - index_count&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1292</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1292"/>
		<updated>2023-02-20T12:47:53Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: /* EnvelopeWeights : (0x? octets) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15);&amp;quot;&amp;gt;Cette section est en cours de rédaction.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15); text-align: center;&amp;quot;&amp;gt;Des recherches sont encore nécessaires et certains paragraphes peuvent être faux.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modèles Gotcha Force ==&lt;br /&gt;
&lt;br /&gt;
Les modèles Gotcha Force fonctionnent comme ceux du jeu Super Smash Bros Melee (SSBM) investigué par sa [https://smashboards.com/threads/melee-dat-format.292603/ communauté].&lt;br /&gt;
&lt;br /&gt;
Un modèle est un format de fichier organisant des objets et des ressources sérialisés pour être utilisés par la librairie &#039;&#039;&#039;H&#039;&#039;&#039;al &#039;&#039;&#039;S&#039;&#039;&#039;ys&#039;&#039;&#039;D&#039;&#039;&#039;olphin (&#039;&#039;&#039;HSD&#039;&#039;&#039;), une librairie utilisée dans plusieurs jeux par Capcom. Ce sont des ressources graphiques structurées de manière hiérarchique. La présence de certaines images dans les modèles montrent à priori l&#039;utilisation de la technique [https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/matcap.html matcap].&lt;br /&gt;
Par ailleurs, la librairie prendrait ses sources sur le SDK Dolphin, tel que GX ou encore MTX.&lt;br /&gt;
&lt;br /&gt;
=== Fichiers concernés ===&lt;br /&gt;
L&#039;ensemble des fichiers ayant dans leur titre &#039;&#039;&#039;_mdl&#039;&#039;&#039; sont des fichiers modèles correspondant au format décrit dans cette page. On notera les fichiers [[ARZ (Gotcha Force)|.arz]] qui sont des modèles compressés. Le fichier collision.arc et les fichiers tdc00.arc à tdc09.arc sont aussi des modèles.&lt;br /&gt;
&lt;br /&gt;
Les fichiers modèles se retrouvent aussi dans les pzz des borgs (plxxxx.pzz) en position 004 à 009.&lt;br /&gt;
&lt;br /&gt;
=== HSDRaw ===&lt;br /&gt;
HSDRaw, un éditeur 3D dotnet de ce format est instable sur mon Windows (algoflash). Il est cependant prouvé qu&#039;un edit des _mdl pour commencer à l&#039;offset 0x100 - après le préambule - permet de visualiser le fichier sur HSDRaw et d&#039;avoir le rendu 3D du Borg (click sur le premier dossier JOBJ - puis le JOBJ dedans et double click sur le nœud en violet). Cela devrait aussi permettre d&#039;éditer certaines propriétés ?&lt;br /&gt;
&lt;br /&gt;
== Structure générale ==&lt;br /&gt;
Le format des modèles se découpe en plusieurs blocks. Le préambule fait 0x100 octets au tout début du fichier. Il est souvent absent. Toutes les valeurs sont en unsigned big endian, et le pad est en Nulls bytes (\x00). Les offsets trouvés après le début du Data Block (DB) sont relatifs au début du DB. La table de relocs est un tableau d&#039;offsets de 4 octets (relatif au DB) permettant de traduire en adressage absolu les offsets des structures lors du chargement mémoire. La table de reloc permet par exemple de délimiter les structures du fait qu&#039;il est peu probable qu&#039;un offset pointe au milieu d&#039;une structure.&lt;br /&gt;
&lt;br /&gt;
L&#039;ensemble des fichiers répondant à ce format on un seul root_node de type SObj (Scene data).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Préambule&#039;&#039;&#039; : (0x100 octets / 0 octets) ===&lt;br /&gt;
* 4 octets - hsd_header_offset=0x100 (toujours)&lt;br /&gt;
* 4 octets - bones_flags_table_offset=0x20 (toujours) - offset de la liste des flags des armatures&lt;br /&gt;
* 4 octets - bones_table_offset=0xC0 (toujours) - offset de la liste des armatures&lt;br /&gt;
* 20 octets - Pad - (toujours)&lt;br /&gt;
* 4 octets [32] - Inconnu (flags des armatures ?) 1 octet par flag ?&lt;br /&gt;
* 32 octets - Pad - (toujours)&lt;br /&gt;
* 32 octets - armatures ?&lt;br /&gt;
* 32 octets - Pad - (toujours)&lt;br /&gt;
=== &#039;&#039;&#039;HSD Header&#039;&#039;&#039; - (0x20 octets) ===&lt;br /&gt;
* 4 octets - Taille totale du fichier&lt;br /&gt;
* 4 octets - Taille du Data block&lt;br /&gt;
* 4 octets - Nombre d&#039;entrée dans la Table de relocs&lt;br /&gt;
* 4 octets - root0_count&lt;br /&gt;
* 4 octets - root1_count&lt;br /&gt;
* 12 octets - Pad - (toujours)&lt;br /&gt;
=== &#039;&#039;&#039;Data block&#039;&#039;&#039; : ===&lt;br /&gt;
* JOBJ, etc. -&amp;gt; Ces structures sont détaillée plus loin ci-dessous.&lt;br /&gt;
=== &#039;&#039;&#039;Relocation Table&#039;&#039;&#039; : ===&lt;br /&gt;
* Tableau d&#039;offsets de 4 octets - Offsets des structures dans le DB.&lt;br /&gt;
=== &#039;&#039;&#039;Root Nodes (2)&#039;&#039;&#039; : ===&lt;br /&gt;
* Tableau de taille 8 * root0_count&lt;br /&gt;
** 4 octets - root_offset - relatif au DB&lt;br /&gt;
** 4 octets - string_table_offset - relatif à la StringTable&lt;br /&gt;
* Tableau de taille 8 * root1_count&lt;br /&gt;
** 4 octets - root_offset - relatif au DB&lt;br /&gt;
** 4 octets - string_table_offset - relatif à la StringTable&lt;br /&gt;
=== &#039;&#039;&#039;String Table&#039;&#039;&#039; : ===&lt;br /&gt;
* Suite de strings terminées par Null au nombre de root0_count + root1_count&lt;br /&gt;
&lt;br /&gt;
== Structures rencontrées dans le DB ==&lt;br /&gt;
Note : l&#039;arborescence est cumulative sur les transformations pour les relations parents-&amp;gt;enfants&lt;br /&gt;
&lt;br /&gt;
Les Noeuds Racine qui ont pour nom &amp;quot;scene_data&amp;quot; pointent sur un SObj :&lt;br /&gt;
=== &#039;&#039;&#039;SObj&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - JObjDescs_offsets_list_offset&lt;br /&gt;
* 4 octets - Cameras_list_offset&lt;br /&gt;
* 4 octets - Lights_list_offset&lt;br /&gt;
* 4 octets - Fog&lt;br /&gt;
&lt;br /&gt;
&amp;quot;scene_data&amp;quot; == nom du nœud racine&lt;br /&gt;
JObjDescs_offsets_list_offset, cameras.. pointent sur une liste d&#039;offsets terminée par 4 octets à 0x00.&lt;br /&gt;
lights_list_offset pointe sur des couples (4 octets - LObj_offset ; 4 octets - light_anim_pointer_offset)&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObjDesc&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - root_joint_offset - JObj&lt;br /&gt;
* 4 octets - joint_animations_offset - ?&lt;br /&gt;
* 4 octets - material_animations_offset - ?&lt;br /&gt;
* 4 octets - shape_animations_offset - ?&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CObj&#039;&#039;&#039; : (0x38 octets) ===&lt;br /&gt;
* 4 octets - flags&lt;br /&gt;
* 4 octets - projection_type - ProjectionTypeEnum&lt;br /&gt;
* 2 octets - viewport_left&lt;br /&gt;
* 2 octets - viewport_right&lt;br /&gt;
* 2 octets - viewport_top&lt;br /&gt;
* 2 octets - viewport_bottom&lt;br /&gt;
* 4 octets - proj_width&lt;br /&gt;
* 4 octets - proj_height&lt;br /&gt;
* 4 octets - eye_offset - WObj&lt;br /&gt;
* 4 octets - target_offset - WObj&lt;br /&gt;
* 4 octets - roll&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - float - near_clip&lt;br /&gt;
* 4 octets - float - far_clip&lt;br /&gt;
* 4 octets - float - field_of_view&lt;br /&gt;
* 4 octets - float - aspect&lt;br /&gt;
Camera object. Note : pour frustrum ou ortho, la structure est différente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ProjectionTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** PERSPECTIVE = 1&lt;br /&gt;
** FRUSTRUM = 2&lt;br /&gt;
** ORTHO = 3&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;WObj&#039;&#039;&#039;: (0x14 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - float - v1&lt;br /&gt;
* 4 octets - float - v2&lt;br /&gt;
* 4 octets - float - v3&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
eye / target&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObj&#039;&#039;&#039; : (0x1c octets) ===&lt;br /&gt;
* 4 octets - class_name&lt;br /&gt;
* 4 octets - next_offset&lt;br /&gt;
* 2 octets - flags - LObjFlagsEnum&lt;br /&gt;
* 2 octets - attenuation_flags - LObjAttenuationFlagsEnum&lt;br /&gt;
* 1 octet - color_r&lt;br /&gt;
* 1 octet - color_g&lt;br /&gt;
* 1 octet - color_b&lt;br /&gt;
* 1 octet - color_alpha&lt;br /&gt;
* 4 octets - lobj_point_offset - position&lt;br /&gt;
* 4 octets - infinite_data&lt;br /&gt;
* 4 octets - point_spot_data&lt;br /&gt;
light&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_AMBIANT = 00 00&lt;br /&gt;
** LOBJ_INFINITE = 00 01&lt;br /&gt;
** LOBJ_POINT = 00 02&lt;br /&gt;
** LOBJ_SPOT = 00 03&lt;br /&gt;
** LOBJ_DIFFUSE = 00 04&lt;br /&gt;
** LOBJ_SPECULAR = 00 08&lt;br /&gt;
** LOBJ_ALPHA = 00 10&lt;br /&gt;
** LOBJ_HIDDEN = 00 20&lt;br /&gt;
** LOBJ_RAW_PARAM = 00 40&lt;br /&gt;
** LOBJ_DIFF_DIRTY = 00 80&lt;br /&gt;
** LOBJ_SPEC_DIRTY = 01 00&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LObjAttenuationFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_LIGHT_ATTN_NONE = 00 00&lt;br /&gt;
** LOBJ_LIGHT_ATTN = 00 01&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObjPoint&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 4 octets - class_name&lt;br /&gt;
* 4 octets - float - x&lt;br /&gt;
* 4 octets - float - y&lt;br /&gt;
* 4 octets - float - z&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LightAnimPointer&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
** 4 octets - next_offset - (LightAnimPointer)&lt;br /&gt;
** 4 octets - light_anim - ?&lt;br /&gt;
** 4 octets - position_anim - ?&lt;br /&gt;
** 4 octets - interst_anim - ?&lt;br /&gt;
Bugs dans HSDRaw - à tester&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObj&#039;&#039;&#039; : (0x40 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - flags&lt;br /&gt;
* 4 octets - child_offset (JObj)&lt;br /&gt;
* 4 octets - next_offset (JObj)&lt;br /&gt;
* 4 octets - dobj_offset (DObj)&lt;br /&gt;
* 4 octets [3] - float3 - rotation_xyz&lt;br /&gt;
* 4 octets [3] - float3 - scale_xyz&lt;br /&gt;
* 4 octets [3] - float3 - translation_xyz&lt;br /&gt;
* 4 octets - inverse_world_transform_offset (inverse world transform = Matrice de 4x3)&lt;br /&gt;
* 4 octets - robj_offset&lt;br /&gt;
&lt;br /&gt;
Pointé par les listes dans Root Node scene_data.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;JObjFlagsEnum&#039;&#039;&#039; : (peuvent se cumuler)&lt;br /&gt;
** NULL = 00 00 00 00&lt;br /&gt;
** SKELETON = 00 00 00 01&lt;br /&gt;
** SKELETON_ROOT = 00 00 00 02&lt;br /&gt;
** ENVELOPE_MODEL = 00 00 00 04&lt;br /&gt;
** CLASSICAL_SCALING = 00 00 00 08&lt;br /&gt;
** HIDDEN = 00 00 00 10&lt;br /&gt;
** PTCL = 00 00 00 20&lt;br /&gt;
** MTX_DIRTY = 00 00 00 40&lt;br /&gt;
** LIGHTING = 00 00 00 80&lt;br /&gt;
** TEXGEN = 00 00 01 00&lt;br /&gt;
** BILLBOARD = 00 00 02 00&lt;br /&gt;
** VBILLBOARD = 00 00 04 00&lt;br /&gt;
** HBILLBOARD = 00 00 06 00&lt;br /&gt;
** RBILLBOARD = 00 00 08 00&lt;br /&gt;
** INSTANCE = 00 00 10 00&lt;br /&gt;
** PBILLBOARD = 00 00 20 00&lt;br /&gt;
** SPLINE = 00 00 40 00&lt;br /&gt;
** FLIP_IK = 00 00 80 00&lt;br /&gt;
** SPECULAR = 00 01 00 00&lt;br /&gt;
** USE_QUATERNION = 00 02 00 00&lt;br /&gt;
** OPA = 00 04 00 00&lt;br /&gt;
** XLU = 00 08 00 00&lt;br /&gt;
** TEXEDGE = 00 10 00 00&lt;br /&gt;
** JOINT1 = 00 20 00 00&lt;br /&gt;
** JOINT2 = 00 40 00 00&lt;br /&gt;
** EFFECTOR = 00 60 00 00&lt;br /&gt;
** USER_DEFINED_MTX = 00 80 00 00&lt;br /&gt;
** MTX_INDEPEND_PARENT = 01 00 00 00&lt;br /&gt;
** MTX_INDEPEND_SRT = 02 00 00 00&lt;br /&gt;
** MTX_SCALE_COMPENSATE = 04 00 00 00&lt;br /&gt;
** ROOT_OPA = 10 00 00 00&lt;br /&gt;
** ROOT_XLU = 20 00 00 00&lt;br /&gt;
** ROOT_TEXEDGE = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;InverseWorldTransform&#039;&#039;&#039; : (0x30 octets) ===&lt;br /&gt;
* 4 octets - float - M11&lt;br /&gt;
* 4 octets - float - M12&lt;br /&gt;
* 4 octets - float - M13&lt;br /&gt;
* 4 octets - float - M14&lt;br /&gt;
* 4 octets - float - M21&lt;br /&gt;
* 4 octets - float - M22&lt;br /&gt;
* 4 octets - float - M23&lt;br /&gt;
* 4 octets - float - M24&lt;br /&gt;
* 4 octets - float - M31&lt;br /&gt;
* 4 octets - float - M32&lt;br /&gt;
* 4 octets - float - M33&lt;br /&gt;
* 4 octets - float - M34&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;DObj&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - next_offset - prochain DOBJ&lt;br /&gt;
* 4 octets - mobj_offset - material offset&lt;br /&gt;
* 4 octets - pobj_offset - mesh offset&lt;br /&gt;
Liste chaînée qui permet de récupérer l&#039;ensemble des materials &amp;amp; mesh pour le JObj auquel il est lié.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;MObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - render_flags - RenderFlagsEnum&lt;br /&gt;
* 4 octets - tobj_offset - offset de texture - peut être invalide s&#039;il n&#039;y a pas de texture pour le material&lt;br /&gt;
* 4 octets - material_offset - couleurs des materials ?&lt;br /&gt;
* 8 octets - PEDesc ?&lt;br /&gt;
&lt;br /&gt;
Contient les textures &amp;amp; informations sur les couleurs des Materials.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RenderFlagsEnum&#039;&#039;&#039; : (se cumulent)&lt;br /&gt;
** USER = 80 00 00 00&lt;br /&gt;
** CONSTANT = 00 00 00 01&lt;br /&gt;
** VERTEX = 00 00 00 02&lt;br /&gt;
** BOTH = 00 00 00 03&lt;br /&gt;
** DIFFUSE = 00 00 00 04&lt;br /&gt;
** SPECULAR = 00 00 00 08&lt;br /&gt;
** TEX0 = 00 00 00 10&lt;br /&gt;
** TEX1 = 00 00 00 20&lt;br /&gt;
** TEX2 = 00 00 00 40&lt;br /&gt;
** TEX3 = 00 00 00 80&lt;br /&gt;
** TEX4 = 00 00 01 00&lt;br /&gt;
** TEX5 = 00 00 02 00&lt;br /&gt;
** TEX6 = 00 00 04 00&lt;br /&gt;
** TEX7 = 00 00 08 00&lt;br /&gt;
** TOON = 00 00 10 00&lt;br /&gt;
** ALPHA_MAT = 00 00 20 00&lt;br /&gt;
** ALPHA_VTX = 00 00 40 00&lt;br /&gt;
** ALPHA_BOTH = 00 00 60 00&lt;br /&gt;
** ZOFST = 01 00 00 00&lt;br /&gt;
** EFFECT = 02 00 00 00&lt;br /&gt;
** SHADOW = 04 00 00 00&lt;br /&gt;
** ZMODE_ALWAYS = 08 00 00 00&lt;br /&gt;
** DF_ALL = 10 00 00 00&lt;br /&gt;
** NO_ZUPDATE = 20 00 00 00&lt;br /&gt;
** XLU = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;TObj&#039;&#039;&#039; : (0x5c octets) ===&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - tex_map_id - TexMapIdEnum&lt;br /&gt;
* 4 octets - gx_tex_gen_src - GXTexGenSrcEnum&lt;br /&gt;
* 4 octets - float - rx&lt;br /&gt;
* 4 octets - float - ry&lt;br /&gt;
* 4 octets - float - rz&lt;br /&gt;
* 4 octets - float - sx&lt;br /&gt;
* 4 octets - float - sy&lt;br /&gt;
* 4 octets - float - sz&lt;br /&gt;
* 4 octets - float - tx&lt;br /&gt;
* 4 octets - float - ty&lt;br /&gt;
* 4 octets - float - tz&lt;br /&gt;
* 4 octets - wrap_s - WrapEnum&lt;br /&gt;
* 4 octets - wrap_t - WrapEnum&lt;br /&gt;
* 1 octet - w_scale&lt;br /&gt;
* 1 octet - h_scale&lt;br /&gt;
* 2 octets - ?&lt;br /&gt;
* 1 octets - bump_map - (False = 00 ; True = 01)&lt;br /&gt;
* 4 bits - alpha_operation - AlphaOperationEnum&lt;br /&gt;
* 4 bits - color_operation - ColorOperationEnum&lt;br /&gt;
* 1 octet - shadow_lightmap - (False = 00 ; True = 01) (2 octets avec une Enum lightmap limite)&lt;br /&gt;
* 1 bit - ext_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
* 1 bit - ambiant_lightmap - (False = 0 ; True = 1) &lt;br /&gt;
* 1 bit - specular_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
* 1 bit - diffuse_lightmap (False = 0 ; True = 1)&lt;br /&gt;
* 4 bits - coord_type - CoordTypeEnum&lt;br /&gt;
* 4 octets - float - blending - utilisé quand color_operation ou alpha_operation == BLEND&lt;br /&gt;
* 4 octets - mag_filter - MagFilterEnum&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
Informations de Textures. Le TObj contient des informations sur les paramètres d&#039;environnement de textures utilisés pour le rendu graphique ainsi que les offset de l&#039;image et des données de la palette utilisés pour cette texture. Le plus important ici, c&#039;est l&#039;offset d&#039;image et la palette/tlut - si l&#039;image n&#039;est pas indexée (RGBA, CMPR, etc.) alors la structure de description palette/tlut n&#039;est pas utilisée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TexMapIdEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TEXMAP0 = 00 00 00 00&lt;br /&gt;
** GX_TEXMAP1 = 00 00 00 01&lt;br /&gt;
** GX_TEXMAP2 = 00 00 00 02&lt;br /&gt;
** GX_TEXMAP3 = 00 00 00 03&lt;br /&gt;
** GX_TEXMAP4 = 00 00 00 04&lt;br /&gt;
** GX_TEXMAP5 = 00 00 00 05&lt;br /&gt;
** GX_TEXMAP6 = 00 00 00 06&lt;br /&gt;
** GX_TEXMAP7 = 00 00 00 07&lt;br /&gt;
** GX_MAX_TEXMAP = 00 00 00 08&lt;br /&gt;
** GX_TEXMAP_NULL = 00 00 00 09&lt;br /&gt;
** GX_TEXMAP_DISABLE = 00 00 00 0A&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GXTexGenSrcEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TG_POS = 00 00 00 00&lt;br /&gt;
** GX_TG_NRM = 00 00 00 01&lt;br /&gt;
** GX_TG_BINRM = 00 00 00 02&lt;br /&gt;
** GX_TG_TANGENT = 00 00 00 03&lt;br /&gt;
** GX_TG_TEX0 = 00 00 00 04&lt;br /&gt;
** GX_TG_TEX1 = 00 00 00 05&lt;br /&gt;
** GX_TG_TEX2 = 00 00 00 06&lt;br /&gt;
** GX_TG_TEX3 = 00 00 00 07&lt;br /&gt;
** GX_TG_TEX4 = 00 00 00 08&lt;br /&gt;
** GX_TG_TEX5 = 00 00 00 09&lt;br /&gt;
** GX_TG_TEX6 = 00 00 00 0A&lt;br /&gt;
** GX_TG_TEX7 = 00 00 00 0B&lt;br /&gt;
** GX_TG_TEXCOORD0 = 00 00 00 0C&lt;br /&gt;
** GX_TG_TEXCOORD1 = 00 00 00 0D&lt;br /&gt;
** GX_TG_TEXCOORD2 = 00 00 00 0E&lt;br /&gt;
** GX_TG_TEXCOORD3 = 00 00 00 0F&lt;br /&gt;
** GX_TG_TEXCOORD4 = 00 00 00 10&lt;br /&gt;
** GX_TG_TEXCOORD5 = 00 00 00 11&lt;br /&gt;
** GX_TG_TEXCOORD6 = 00 00 00 12&lt;br /&gt;
** GX_TG_COLOR0 = 00 00 00 13&lt;br /&gt;
** GX_TG_COLOR1 = 00 00 00 14&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AlphaOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = 0X&lt;br /&gt;
** ALPHAMASK = 1X&lt;br /&gt;
** BLEND = 2X&lt;br /&gt;
** MODULATE = 3X&lt;br /&gt;
** REPLACE = 4X&lt;br /&gt;
** PASS = 5X&lt;br /&gt;
** ADD = 6X&lt;br /&gt;
** SUB = 7X&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ColorOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = X0&lt;br /&gt;
** ALPHA_MASK = X1&lt;br /&gt;
** RGB_MASK = X2&lt;br /&gt;
** BLEND = X3&lt;br /&gt;
** MODULATE = X4&lt;br /&gt;
** REPLACE = X5&lt;br /&gt;
** PASS = X6&lt;br /&gt;
** ADD = X7&lt;br /&gt;
** SUB = X8&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CoordTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** UV = X0&lt;br /&gt;
** REFLECTION = X1&lt;br /&gt;
** HILIGHT = X2&lt;br /&gt;
** SHADOW = X3&lt;br /&gt;
** TOON = X4&lt;br /&gt;
** GRADATION = X5&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MagFilterEnum&#039;&#039;&#039;:&lt;br /&gt;
** GX_NEAR = 00 00 00 00&lt;br /&gt;
** GX_LINEAR = 00 00 00 01&lt;br /&gt;
** GX_NEAR_MIP_NEAR = 00 00 00 02&lt;br /&gt;
** GX_LIN_MIP_NEAR = 00 00 00 03&lt;br /&gt;
** GX_NEAR_MIP_LIN = 00 00 00 04&lt;br /&gt;
** GX_LIN_MIP_LIN = 00 00 00 05&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WrapEnum&#039;&#039;&#039;:&lt;br /&gt;
** CLAMP = 00 00 00 00&lt;br /&gt;
** REPEAT = 00 00 00 01&lt;br /&gt;
** MIRROR = 00 00 00 02&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Material&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 1 octets - AMB_R - (ambient)&lt;br /&gt;
* 1 octets - AMB_G&lt;br /&gt;
* 1 octets - AMB_B&lt;br /&gt;
* 1 octets - AMB_A&lt;br /&gt;
* 1 octets - DIF_R - (diffuse)&lt;br /&gt;
* 1 octets - DIF_G&lt;br /&gt;
* 1 octets - DIF_B&lt;br /&gt;
* 1 octets - DIF_A&lt;br /&gt;
* 1 octets - SPC_R - (specular)&lt;br /&gt;
* 1 octets - SPC_G&lt;br /&gt;
* 1 octets - SPC_B&lt;br /&gt;
* 1 octets - SPC_A&lt;br /&gt;
* 4 octets - float - alpha&lt;br /&gt;
* 4 octets - float - shininess&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - next_offset - pobj&lt;br /&gt;
* 4 octets - vertex_attr_list_offset&lt;br /&gt;
* 2 octets - Flags - PObjFlagsEnum&lt;br /&gt;
* 2 octets - display_list_size - number of 0x20 (32) byte blocks occupied by display list data&lt;br /&gt;
* 4 octets - display_list_offset&lt;br /&gt;
* 4 octets - weight_list_offset - ? verifier qu&#039;on retrouve bien le tableau d&#039;envelope_weights à cet offset&lt;br /&gt;
&lt;br /&gt;
Comme l&#039;indique next_offset, il s&#039;agit d&#039;une liste de meshs à afficher pour un material donné référencé par un dobj. PObj contient les offsets de vertex attributes / display list / joint weight list ce qui suffit et permet d’interpréter et traiter les coordonnées de vertices, normals &amp;amp; textures.&lt;br /&gt;
&lt;br /&gt;
Les attributs vertex sont les plus important - les parametres specifiés contrôlent tout : du format, de la taille des données de chaque vertex, normal et coordonnées de textures et comment ces valeurs sont dimensionnées (scaled) par rapport à la présence et la taille de chaque valeur d&#039;index qui apparaît dans la display list information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** Inconnu0 = 00 01&lt;br /&gt;
** Inconnu1 = 00 02&lt;br /&gt;
** ANIM = 00 08&lt;br /&gt;
** SHAPE_ANIM = 10 00&lt;br /&gt;
** ENVELOPE = 20 00&lt;br /&gt;
** CULLBACK = 40 00&lt;br /&gt;
** CULLFRONT = 80 00&lt;br /&gt;
&lt;br /&gt;
=== EnvelopeWeights : (0x? octets) ===&lt;br /&gt;
* 4 octets - envelope_count&lt;br /&gt;
* [envelope_count]:&lt;br /&gt;
** 4 octets - float - weight&lt;br /&gt;
** 4 octets - pad ?&lt;br /&gt;
* 4 octets - jobj_list_offset&lt;br /&gt;
&lt;br /&gt;
=== not verified yet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IMAGE_HEADER&#039;&#039;&#039; :&lt;br /&gt;
** 4 octets - image_offset - image data&lt;br /&gt;
** 2 octets - width&lt;br /&gt;
** 2 octets - height&lt;br /&gt;
** 4 octets - image_format&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PALETTE_HEADER&#039;&#039;&#039; : (0x10)&lt;br /&gt;
** 4 octets - palette_offset - palette data&lt;br /&gt;
** 4 octets - palette_format&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
** 2 octets - color_count&lt;br /&gt;
** 2 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
image_offset et palette_offset sont souvent partagés par plusieurs textures - savoir ça permet de retrouver toutes les informations sur les images des textures (largeur, hauteur, format), ainsi que le format et le nombre de couleurs de la palette/tlut.&lt;br /&gt;
&lt;br /&gt;
Le format d&#039;image ne détermine pas le nombre total de couleurs de la palette qu&#039;elle utilisent. Par exemple, une image indexée sur 8 bits aurait un maximum de 256 couleurs mais seulement 136 ou 221 couleurs sont actuellement utilisées. De la sorte, la palette n&#039;utilisera pas la taille totale qu&#039;elle devrait utiliser.&lt;br /&gt;
&lt;br /&gt;
Les images suivent la structure généralement utilisée par la GameCube :&lt;br /&gt;
&lt;br /&gt;
IMAGE FORMATS :&lt;br /&gt;
* case 0: //i4&lt;br /&gt;
* case 1: //i8&lt;br /&gt;
* case 2: //i4a4&lt;br /&gt;
* case 3: //i8a8&lt;br /&gt;
* case 4: //r5g6b5&lt;br /&gt;
* case 5: //rgb5a3&lt;br /&gt;
* case 6: //r8g8b8a8&lt;br /&gt;
* case 8: //index4&lt;br /&gt;
* case 9: //index8&lt;br /&gt;
* case 0xa: //index14x2&lt;br /&gt;
* case 0xe: //s3tc1&lt;br /&gt;
&lt;br /&gt;
Les formats indexés utilisent aussi les informations de palettes/tlut et les données peuvent apparaître en plusieurs formats :&lt;br /&gt;
&lt;br /&gt;
PALETTE FORMATS :&lt;br /&gt;
* case 0: //ia8&lt;br /&gt;
* case 1: //r5g6b5&lt;br /&gt;
* case 2: //rgb5a3&lt;br /&gt;
&lt;br /&gt;
---&amp;gt; &amp;quot;Joint Data - Accessing Geometry, Mesh, and Vertex Attributes&amp;quot; https://smashboards.com/threads/melee-dat-format.292603/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
trad a revoir à partir de là, il faut investiguer le rendu 3D sur GameCube pour mieux comprendre&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// déclaration d&#039;un vertex et attribute information&lt;br /&gt;
// attr, type, cnt, data_type, flags?, file_offset&lt;br /&gt;
* ATTR_DATA&lt;br /&gt;
** 4 octets - GXAttr     vtx_attr_offset - attr&lt;br /&gt;
** 4 octets - GXAttrType vtx_attr_type   - index_type&lt;br /&gt;
** 4 octets - GXCompCnt  comp_cnt        - cnt&lt;br /&gt;
** 4 octets - GXCompType comp_type       - data_type	&lt;br /&gt;
** 1 octets - scale&lt;br /&gt;
** 1 octets - Inconnu&lt;br /&gt;
** 2 octets - vtx_stride&lt;br /&gt;
** 2 octets - data_offset&lt;br /&gt;
&lt;br /&gt;
vertex_attr_offset pointe sur une liste d&#039;attributs de vertex. Leur nombre n&#039;est pas donné. Les données dans cette structure suivent les informations et les types conçus par l&#039;architecture GameCube/WII et son API. La liste est terminée par une valeur spécifique de vtx_attr qui signale la fin de cette liste. Avec un accès à la doku SDK, il serait fortement conseillé de lire la section à propos des &amp;quot;vertex attributes and other specifications&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La valeur de vtx_attr determine le type de donnée que cet attribut désigne et peut indiquer un nombre de types natifs utilisés utilisés pour passer les données entre les interfaces logicielles et matérielles.&lt;br /&gt;
&lt;br /&gt;
Les valeures possibles sont les suivantes :&lt;br /&gt;
* enum GXAttr (4 octets)&lt;br /&gt;
** GX_VA_PNMTXIDX = 0,    // position/normal matrix index&lt;br /&gt;
** GX_VA_TEX0MTXIDX,      // texture 0 matrix index&lt;br /&gt;
** GX_VA_TEX1MTXIDX,      // texture 1 matrix index&lt;br /&gt;
** GX_VA_TEX2MTXIDX,      // texture 2 matrix index&lt;br /&gt;
** GX_VA_TEX3MTXIDX,      // texture 3 matrix index&lt;br /&gt;
** GX_VA_TEX4MTXIDX,      // texture 4 matrix index&lt;br /&gt;
** GX_VA_TEX5MTXIDX,      // texture 5 matrix index&lt;br /&gt;
** GX_VA_TEX6MTXIDX,      // texture 6 matrix index&lt;br /&gt;
** GX_VA_TEX7MTXIDX,      // texture 7 matrix index&lt;br /&gt;
** GX_VA_POS      = 9,    // position&lt;br /&gt;
** GX_VA_NRM,             // normal&lt;br /&gt;
** GX_VA_CLR0,            // color 0&lt;br /&gt;
** GX_VA_CLR1,            // color 1&lt;br /&gt;
** GX_VA_TEX0,            // input texture coordinate 0&lt;br /&gt;
** GX_VA_TEX1,            // input texture coordinate 1&lt;br /&gt;
** GX_VA_TEX2,            // input texture coordinate 2&lt;br /&gt;
** GX_VA_TEX3,            // input texture coordinate 3&lt;br /&gt;
** GX_VA_TEX4,            // input texture coordinate 4&lt;br /&gt;
** GX_VA_TEX5,            // input texture coordinate 5&lt;br /&gt;
** GX_VA_TEX6,            // input texture coordinate 6&lt;br /&gt;
** GX_VA_TEX7,            // input texture coordinate 7&lt;br /&gt;
&lt;br /&gt;
** GX_POS_MTX_ARRAY,      // position matrix array pointer&lt;br /&gt;
** GX_NRM_MTX_ARRAY,      // normal matrix array pointer&lt;br /&gt;
** GX_TEX_MTX_ARRAY,      // texture matrix array pointer&lt;br /&gt;
** GX_LIGHT_ARRAY,        // light parameter array pointer&lt;br /&gt;
** GX_VA_NBT,             // normal, bi-normal, tangent &lt;br /&gt;
** GX_VA_MAX_ATTR,        // maximum number of vertex attributes&lt;br /&gt;
&lt;br /&gt;
** GX_VA_NULL     = 0xff  // NULL attribute (to mark end of lists)&lt;br /&gt;
&lt;br /&gt;
Toutes les données nécessaires pour représenter un mesh peuvent être spécifiées et indexées d&#039;une manière ou d&#039;une autre. De même, GX_VA_TEX0MTXIDX, GX_VA_CLR0, et autres sont aussi possibles - les valeurs les plus fréquentes dans les données SSBM sont : GX_VA_PNMTXIDX, GX_VA_POS, GX_VA_NRM, et GX_VA_TEX0. Which is to be expected as joint matrices, vertex positions/normals, and texture coordinates respectively are probably the most basic of elements needed to display a texture mesh, whether static or animated.&lt;br /&gt;
&lt;br /&gt;
When the value of vtx_attr == GX_VA_NULL (0xFF), the end of the vertex attribute array has been reached.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The vtx_attr_type values is actually associated with how the value is indexed, and can thus also determine the size of the index value within the display list data.&lt;br /&gt;
&lt;br /&gt;
* 4 octets - enum GXAttrType&lt;br /&gt;
** GX_NONE    = 0,&lt;br /&gt;
** GX_DIRECT,&lt;br /&gt;
** GX_INDEX8,&lt;br /&gt;
** GX_INDEX16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Structures COLL_DATA : (données de collisions)&lt;br /&gt;
** 4 octets - vertex_offset (2 float par entrée correspondant à des données 2D probablement)&lt;br /&gt;
** 4 octets - vertex_count&lt;br /&gt;
** 4 octets - index_offset&lt;br /&gt;
** 4 octets - index_count&lt;br /&gt;
** 4 octets [5] - tableau inconnu&lt;br /&gt;
*** 2 octets - index_start&lt;br /&gt;
*** 2 octets - index_count&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1291</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1291"/>
		<updated>2023-02-20T12:45:35Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer a.external {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .online a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .online a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light #footer-places-privacy a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark #footer-places-privacy a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light #footer-places-about a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark #footer-places-about a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light #footer-places-disclaimer a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark #footer-places-disclaimer a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light #footer-info-0 {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark #footer-info-0 {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1290</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1290"/>
		<updated>2023-02-20T12:44:53Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer a.external {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .online a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .online a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light #footer-places-privacy a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark #footer-places-privacy a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light #footer-places-about a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark #footer-places-about a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light #footer-places-disclaimer a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark #footer-places-disclaimer a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1289</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1289"/>
		<updated>2023-02-20T12:44:03Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer a.external {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .online a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .online a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light #footer-places-privacy a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark #footer-places-privacy a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1288</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1288"/>
		<updated>2023-02-20T12:43:13Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer a.external {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .online a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .online a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .footer-places-privacy a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .footer-places-privacy a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Citizen-footer-desc&amp;diff=1287</id>
		<title>MediaWiki:Citizen-footer-desc</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Citizen-footer-desc&amp;diff=1287"/>
		<updated>2023-02-20T12:41:20Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__notoc__&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: block&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Join us on social medias !&amp;lt;/h4&amp;gt;&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: 0px&amp;quot;&lt;br /&gt;
| [https://github.com/Virtual-World-RE/ {{#fab:github}} GitHub] || [https://discord.gg/UTVkc98p7P {{#fab:discord}} Discord] || [https://twitch.tv/thegglinnk {{#fab:twitch}} Twitch]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;The team !&amp;lt;/h3&amp;gt;&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: -10px&amp;quot;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Admins&amp;lt;/h4&amp;gt;&lt;br /&gt;
| [[ Rigodron ]] || [[ Algoflash ]] || [[ GGLinnk ]]&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: -10px&amp;quot;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Redactors and Devs&amp;lt;/h4&amp;gt;&lt;br /&gt;
| [[ T045 ]] || [[ CrystalPixel ]] &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Online users&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;online&amp;quot; style=&amp;quot;display: inline; padding: 2px;&amp;quot;&amp;gt;&lt;br /&gt;
{{:Special:WhosOnline/20/shownav}}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Citizen-footer-desc&amp;diff=1286</id>
		<title>MediaWiki:Citizen-footer-desc</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Citizen-footer-desc&amp;diff=1286"/>
		<updated>2023-02-20T12:40:45Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__notoc__&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: block&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Join us on social medias !&amp;lt;/h4&amp;gt;&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: 0px&amp;quot;&lt;br /&gt;
| [https://github.com/Virtual-World-RE/ {{#fab:github}} GitHub] || [https://discord.gg/UTVkc98p7P {{#fab:discord}} Discord] || [https://twitch.tv/thegglinnk {{#fab:twitch}} Twitch]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;The team !&amp;lt;/h3&amp;gt;&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: -10px&amp;quot;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Admins&amp;lt;/h4&amp;gt;&lt;br /&gt;
| [[ Rigodron ]] || [[ Algoflash ]] || [[ GGLinnk ]]&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: -10px&amp;quot;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Redactors and Devs&amp;lt;/h4&amp;gt;&lt;br /&gt;
| [[ T045 ]] || [[ CrystalPixel ]] &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Online users&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;span id=&amp;quot;online&amp;quot; style=&amp;quot;display: inline; padding: 2px;&amp;quot;&amp;gt;&lt;br /&gt;
{{:Special:WhosOnline/20/shownav}}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1285</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1285"/>
		<updated>2023-02-20T12:40:01Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer a.external {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .online a {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .online a {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1284</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1284"/>
		<updated>2023-02-20T12:38:54Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .mw-footer a.external {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .online {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .online  {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Citizen-footer-desc&amp;diff=1283</id>
		<title>MediaWiki:Citizen-footer-desc</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Citizen-footer-desc&amp;diff=1283"/>
		<updated>2023-02-20T12:38:19Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__notoc__&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: block&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Join us on social medias !&amp;lt;/h4&amp;gt;&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: 0px&amp;quot;&lt;br /&gt;
| [https://github.com/Virtual-World-RE/ {{#fab:github}} GitHub] || [https://discord.gg/UTVkc98p7P {{#fab:discord}} Discord] || [https://twitch.tv/thegglinnk {{#fab:twitch}} Twitch]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;The team !&amp;lt;/h3&amp;gt;&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: -10px&amp;quot;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Admins&amp;lt;/h4&amp;gt;&lt;br /&gt;
| [[ Rigodron ]] || [[ Algoflash ]] || [[ GGLinnk ]]&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: -10px&amp;quot;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Redactors and Devs&amp;lt;/h4&amp;gt;&lt;br /&gt;
| [[ T045 ]] || [[ CrystalPixel ]] &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Online users&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;Online&amp;quot; style=&amp;quot;display: inline; padding: 2px;&amp;quot;&amp;gt;&lt;br /&gt;
{{:Special:WhosOnline/20/shownav}}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1282</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1282"/>
		<updated>2023-02-20T12:36:23Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .mw-footer a.external {&lt;br /&gt;
color: #cfdee8;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1281</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1281"/>
		<updated>2023-02-20T12:35:44Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .mw-footer a.external {&lt;br /&gt;
color: #ffffff;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1280</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1280"/>
		<updated>2023-02-20T12:34:47Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer a, .mw-footer a.external {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer a, .mw-footer a.external {&lt;br /&gt;
color: #ffffff;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1279</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1279"/>
		<updated>2023-02-20T12:33:58Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .external .text {&lt;br /&gt;
color: #000000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .external .text {&lt;br /&gt;
color: #ffffff;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Citizen-footer-desc&amp;diff=1278</id>
		<title>MediaWiki:Citizen-footer-desc</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Citizen-footer-desc&amp;diff=1278"/>
		<updated>2023-02-20T12:32:11Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__notoc__&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: block&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Join us on social medias !&amp;lt;/h4&amp;gt;&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: 0px&amp;quot;&lt;br /&gt;
| [https://github.com/Virtual-World-RE/ {{#fab:github}} GitHub] || [https://discord.gg/UTVkc98p7P {{#fab:discord}} Discord] || [https://twitch.tv/thegglinnk {{#fab:twitch}} Twitch]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h3 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;The team !&amp;lt;/h3&amp;gt;&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: -10px&amp;quot;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Admins&amp;lt;/h4&amp;gt;&lt;br /&gt;
| [[ Rigodron ]] || [[ Algoflash ]] || [[ GGLinnk ]]&lt;br /&gt;
|}&lt;br /&gt;
{| style=&amp;quot;vertical-align:middle;&amp;quot; cellspacing=10 style=&amp;quot;margin-top: -10px&amp;quot;&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Redactors and Devs&amp;lt;/h4&amp;gt;&lt;br /&gt;
| [[ T045 ]] || [[ CrystalPixel ]] &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h4 style=&amp;quot;margin-bottom: 0px&amp;quot;&amp;gt;Online users&amp;lt;/h4&amp;gt;&lt;br /&gt;
&amp;lt;span class=&amp;quot;external text&amp;quot; style=&amp;quot;display: inline; padding: 2px;&amp;quot;&amp;gt;&lt;br /&gt;
{{:Special:WhosOnline/20/shownav}}&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1277</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1277"/>
		<updated>2023-02-20T12:30:14Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1276</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1276"/>
		<updated>2023-02-20T12:29:25Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark  .last-modified-bar-content {&lt;br /&gt;
background: #131a21;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .last-modified-bar-content {&lt;br /&gt;
background: #f8f9fa;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1275</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1275"/>
		<updated>2023-02-20T12:25:45Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background: #131a21&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1274</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1274"/>
		<updated>2023-02-20T12:25:32Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .mw-footer {&lt;br /&gt;
background: #ffffffff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .mw-footer {&lt;br /&gt;
background:  #131a21&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1273</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1273"/>
		<updated>2023-02-20T12:23:57Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.mw-footer {&lt;br /&gt;
background: var(--background-color-dp-00);&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1272</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1272"/>
		<updated>2023-02-20T12:23:01Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.mw-footer {&lt;br /&gt;
background: var(--background-color-dp-00) !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1271</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1271"/>
		<updated>2023-02-20T12:21:59Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.mw-footer {&lt;br /&gt;
background: --background-color-dp-00 !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1270</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1270"/>
		<updated>2023-02-20T12:21:18Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.mw-footer {&lt;br /&gt;
background: --background-color-dp-00&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1269</id>
		<title>Models</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Models&amp;diff=1269"/>
		<updated>2022-12-30T10:26:49Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15);&amp;quot;&amp;gt;Cette section est en cours de rédaction.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;color: rgb(241, 196, 15); text-align: center;&amp;quot;&amp;gt;Des recherches sont encore nécessaires et certains paragraphes peuvent être faux.&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modèles Gotcha Force ==&lt;br /&gt;
&lt;br /&gt;
Les modèles Gotcha Force fonctionnent comme ceux du jeu Super Smash Bros Melee (SSBM) investigué par sa [https://smashboards.com/threads/melee-dat-format.292603/ communauté].&lt;br /&gt;
&lt;br /&gt;
Un modèle est un format de fichier organisant des objets et des ressources sérialisés pour être utilisés par la librairie &#039;&#039;&#039;H&#039;&#039;&#039;al &#039;&#039;&#039;S&#039;&#039;&#039;ys&#039;&#039;&#039;D&#039;&#039;&#039;olphin (&#039;&#039;&#039;HSD&#039;&#039;&#039;), une librairie utilisée dans plusieurs jeux par Capcom. Ce sont des ressources graphiques structurées de manière hiérarchique. La présence de certaines images dans les modèles montrent à priori l&#039;utilisation de la technique [https://learn.foundry.com/modo/901/content/help/pages/shading_lighting/shader_items/matcap.html matcap].&lt;br /&gt;
Par ailleurs, la librairie prendrait ses sources sur le SDK Dolphin, tel que GX ou encore MTX.&lt;br /&gt;
&lt;br /&gt;
=== Fichiers concernés ===&lt;br /&gt;
L&#039;ensemble des fichiers ayant dans leur titre &#039;&#039;&#039;_mdl&#039;&#039;&#039; sont des fichiers modèles correspondant au format décrit dans cette page. On notera les fichiers [[ARZ (Gotcha Force)|.arz]] qui sont des modèles compressés. Le fichier collision.arc et les fichiers tdc00.arc à tdc09.arc sont aussi des modèles.&lt;br /&gt;
&lt;br /&gt;
Les fichiers modèles se retrouvent aussi dans les pzz des borgs (plxxxx.pzz) en position 004 à 009.&lt;br /&gt;
&lt;br /&gt;
=== HSDRaw ===&lt;br /&gt;
HSDRaw, un éditeur 3D dotnet de ce format est instable sur mon Windows (algoflash). Il est cependant prouvé qu&#039;un edit des _mdl pour commencer à l&#039;offset 0x100 - après le préambule - permet de visualiser le fichier sur HSDRaw et d&#039;avoir le rendu 3D du Borg (click sur le premier dossier JOBJ - puis le JOBJ dedans et double click sur le nœud en violet). Cela devrait aussi permettre d&#039;éditer certaines propriétés ?&lt;br /&gt;
&lt;br /&gt;
== Structure générale ==&lt;br /&gt;
Le format des modèles se découpe en plusieurs blocks. Le préambule fait 0x100 octets au tout début du fichier. Il est souvent absent. Toutes les valeurs sont en unsigned big endian, et le pad est en Nulls bytes (\x00). Les offsets trouvés après le début du Data Block (DB) sont relatifs au début du DB. La table de relocs est un tableau d&#039;offsets de 4 octets (relatif au DB) permettant de traduire en adressage absolu les offsets des structures lors du chargement mémoire. La table de reloc permet par exemple de délimiter les structures du fait qu&#039;il est peu probable qu&#039;un offset pointe au milieu d&#039;une structure.&lt;br /&gt;
&lt;br /&gt;
L&#039;ensemble des fichiers répondant à ce format on un seul root_node de type SObj (Scene data).&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Préambule&#039;&#039;&#039; : (0x100 octets / 0 octets) ===&lt;br /&gt;
* 4 octets - hsd_header_offset=0x100 (toujours)&lt;br /&gt;
* 4 octets - bones_flags_table_offset=0x20 (toujours) - offset de la liste des flags des armatures&lt;br /&gt;
* 4 octets - bones_table_offset=0xC0 (toujours) - offset de la liste des armatures&lt;br /&gt;
* 20 octets - Pad - (toujours)&lt;br /&gt;
* 4 octets [32] - Inconnu (flags des armatures ?) 1 octet par flag ?&lt;br /&gt;
* 32 octets - Pad - (toujours)&lt;br /&gt;
* 32 octets - armatures ?&lt;br /&gt;
* 32 octets - Pad - (toujours)&lt;br /&gt;
=== &#039;&#039;&#039;HSD Header&#039;&#039;&#039; - (0x20 octets) ===&lt;br /&gt;
* 4 octets - Taille totale du fichier&lt;br /&gt;
* 4 octets - Taille du Data block&lt;br /&gt;
* 4 octets - Nombre d&#039;entrée dans la Table de relocs&lt;br /&gt;
* 4 octets - root0_count&lt;br /&gt;
* 4 octets - root1_count&lt;br /&gt;
* 12 octets - Pad - (toujours)&lt;br /&gt;
=== &#039;&#039;&#039;Data block&#039;&#039;&#039; : ===&lt;br /&gt;
* JOBJ, etc. -&amp;gt; Ces structures sont détaillée plus loin ci-dessous.&lt;br /&gt;
=== &#039;&#039;&#039;Relocation Table&#039;&#039;&#039; : ===&lt;br /&gt;
* Tableau d&#039;offsets de 4 octets - Offsets des structures dans le DB.&lt;br /&gt;
=== &#039;&#039;&#039;Root Nodes (2)&#039;&#039;&#039; : ===&lt;br /&gt;
* Tableau de taille 8 * root0_count&lt;br /&gt;
** 4 octets - root_offset - relatif au DB&lt;br /&gt;
** 4 octets - string_table_offset - relatif à la StringTable&lt;br /&gt;
* Tableau de taille 8 * root1_count&lt;br /&gt;
** 4 octets - root_offset - relatif au DB&lt;br /&gt;
** 4 octets - string_table_offset - relatif à la StringTable&lt;br /&gt;
=== &#039;&#039;&#039;String Table&#039;&#039;&#039; : ===&lt;br /&gt;
* Suite de strings terminées par Null au nombre de root0_count + root1_count&lt;br /&gt;
&lt;br /&gt;
== Structures rencontrées dans le DB ==&lt;br /&gt;
Note : l&#039;arborescence est cumulative sur les transformations pour les relations parents-&amp;gt;enfants&lt;br /&gt;
&lt;br /&gt;
Les Noeuds Racine qui ont pour nom &amp;quot;scene_data&amp;quot; pointent sur un SObj :&lt;br /&gt;
=== &#039;&#039;&#039;SObj&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - JObjDescs_offsets_list_offset&lt;br /&gt;
* 4 octets - Cameras_list_offset&lt;br /&gt;
* 4 octets - Lights_list_offset&lt;br /&gt;
* 4 octets - Fog&lt;br /&gt;
&lt;br /&gt;
&amp;quot;scene_data&amp;quot; == nom du nœud racine&lt;br /&gt;
JObjDescs_offsets_list_offset, cameras.. pointent sur une liste d&#039;offsets terminée par 4 octets à 0x00.&lt;br /&gt;
lights_list_offset pointe sur des couples (4 octets - LObj_offset ; 4 octets - light_anim_pointer_offset)&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObjDesc&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - root_joint_offset - JObj&lt;br /&gt;
* 4 octets - joint_animations_offset - ?&lt;br /&gt;
* 4 octets - material_animations_offset - ?&lt;br /&gt;
* 4 octets - shape_animations_offset - ?&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;CObj&#039;&#039;&#039; : (0x38 octets) ===&lt;br /&gt;
* 4 octets - flags&lt;br /&gt;
* 4 octets - projection_type - ProjectionTypeEnum&lt;br /&gt;
* 2 octets - viewport_left&lt;br /&gt;
* 2 octets - viewport_right&lt;br /&gt;
* 2 octets - viewport_top&lt;br /&gt;
* 2 octets - viewport_bottom&lt;br /&gt;
* 4 octets - proj_width&lt;br /&gt;
* 4 octets - proj_height&lt;br /&gt;
* 4 octets - eye_offset - WObj&lt;br /&gt;
* 4 octets - target_offset - WObj&lt;br /&gt;
* 4 octets - roll&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - float - near_clip&lt;br /&gt;
* 4 octets - float - far_clip&lt;br /&gt;
* 4 octets - float - field_of_view&lt;br /&gt;
* 4 octets - float - aspect&lt;br /&gt;
Camera object. Note : pour frustrum ou ortho, la structure est différente.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ProjectionTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** PERSPECTIVE = 1&lt;br /&gt;
** FRUSTRUM = 2&lt;br /&gt;
** ORTHO = 3&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;WObj&#039;&#039;&#039;: (0x14 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - float - v1&lt;br /&gt;
* 4 octets - float - v2&lt;br /&gt;
* 4 octets - float - v3&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
eye / target&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObj&#039;&#039;&#039; : (0x1c octets) ===&lt;br /&gt;
* 4 octets - class_name&lt;br /&gt;
* 4 octets - next_offset&lt;br /&gt;
* 2 octets - flags - LObjFlagsEnum&lt;br /&gt;
* 2 octets - attenuation_flags - LObjAttenuationFlagsEnum&lt;br /&gt;
* 1 octet - color_r&lt;br /&gt;
* 1 octet - color_g&lt;br /&gt;
* 1 octet - color_b&lt;br /&gt;
* 1 octet - color_alpha&lt;br /&gt;
* 4 octets - lobj_point_offset - position&lt;br /&gt;
* 4 octets - infinite_data&lt;br /&gt;
* 4 octets - point_spot_data&lt;br /&gt;
light&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_AMBIANT = 00 00&lt;br /&gt;
** LOBJ_INFINITE = 00 01&lt;br /&gt;
** LOBJ_POINT = 00 02&lt;br /&gt;
** LOBJ_SPOT = 00 03&lt;br /&gt;
** LOBJ_DIFFUSE = 00 04&lt;br /&gt;
** LOBJ_SPECULAR = 00 08&lt;br /&gt;
** LOBJ_ALPHA = 00 10&lt;br /&gt;
** LOBJ_HIDDEN = 00 20&lt;br /&gt;
** LOBJ_RAW_PARAM = 00 40&lt;br /&gt;
** LOBJ_DIFF_DIRTY = 00 80&lt;br /&gt;
** LOBJ_SPEC_DIRTY = 01 00&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LObjAttenuationFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** LOBJ_LIGHT_ATTN_NONE = 00 00&lt;br /&gt;
** LOBJ_LIGHT_ATTN = 00 01&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LObjPoint&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 4 octets - class_name&lt;br /&gt;
* 4 octets - float - x&lt;br /&gt;
* 4 octets - float - y&lt;br /&gt;
* 4 octets - float - z&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;LightAnimPointer&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
** 4 octets - next_offset - (LightAnimPointer)&lt;br /&gt;
** 4 octets - light_anim - ?&lt;br /&gt;
** 4 octets - position_anim - ?&lt;br /&gt;
** 4 octets - interst_anim - ?&lt;br /&gt;
Bugs dans HSDRaw - à tester&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;JObj&#039;&#039;&#039; : (0x40 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - flags&lt;br /&gt;
* 4 octets - child_offset (JObj)&lt;br /&gt;
* 4 octets - next_offset (JObj)&lt;br /&gt;
* 4 octets - dobj_offset (DObj)&lt;br /&gt;
* 4 octets [3] - float3 - rotation_xyz&lt;br /&gt;
* 4 octets [3] - float3 - scale_xyz&lt;br /&gt;
* 4 octets [3] - float3 - translation_xyz&lt;br /&gt;
* 4 octets - inverse_world_transform_offset (inverse world transform = Matrice de 4x3)&lt;br /&gt;
* 4 octets - robj_offset&lt;br /&gt;
&lt;br /&gt;
Pointé par les listes dans Root Node scene_data.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;JObjFlagsEnum&#039;&#039;&#039; : (peuvent se cumuler)&lt;br /&gt;
** NULL = 00 00 00 00&lt;br /&gt;
** SKELETON = 00 00 00 01&lt;br /&gt;
** SKELETON_ROOT = 00 00 00 02&lt;br /&gt;
** ENVELOPE_MODEL = 00 00 00 04&lt;br /&gt;
** CLASSICAL_SCALING = 00 00 00 08&lt;br /&gt;
** HIDDEN = 00 00 00 10&lt;br /&gt;
** PTCL = 00 00 00 20&lt;br /&gt;
** MTX_DIRTY = 00 00 00 40&lt;br /&gt;
** LIGHTING = 00 00 00 80&lt;br /&gt;
** TEXGEN = 00 00 01 00&lt;br /&gt;
** BILLBOARD = 00 00 02 00&lt;br /&gt;
** VBILLBOARD = 00 00 04 00&lt;br /&gt;
** HBILLBOARD = 00 00 06 00&lt;br /&gt;
** RBILLBOARD = 00 00 08 00&lt;br /&gt;
** INSTANCE = 00 00 10 00&lt;br /&gt;
** PBILLBOARD = 00 00 20 00&lt;br /&gt;
** SPLINE = 00 00 40 00&lt;br /&gt;
** FLIP_IK = 00 00 80 00&lt;br /&gt;
** SPECULAR = 00 01 00 00&lt;br /&gt;
** USE_QUATERNION = 00 02 00 00&lt;br /&gt;
** OPA = 00 04 00 00&lt;br /&gt;
** XLU = 00 08 00 00&lt;br /&gt;
** TEXEDGE = 00 10 00 00&lt;br /&gt;
** JOINT1 = 00 20 00 00&lt;br /&gt;
** JOINT2 = 00 40 00 00&lt;br /&gt;
** EFFECTOR = 00 60 00 00&lt;br /&gt;
** USER_DEFINED_MTX = 00 80 00 00&lt;br /&gt;
** MTX_INDEPEND_PARENT = 01 00 00 00&lt;br /&gt;
** MTX_INDEPEND_SRT = 02 00 00 00&lt;br /&gt;
** MTX_SCALE_COMPENSATE = 04 00 00 00&lt;br /&gt;
** ROOT_OPA = 10 00 00 00&lt;br /&gt;
** ROOT_XLU = 20 00 00 00&lt;br /&gt;
** ROOT_TEXEDGE = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;InverseWorldTransform&#039;&#039;&#039; : (0x30 octets) ===&lt;br /&gt;
* 4 octets - float - M11&lt;br /&gt;
* 4 octets - float - M12&lt;br /&gt;
* 4 octets - float - M13&lt;br /&gt;
* 4 octets - float - M14&lt;br /&gt;
* 4 octets - float - M21&lt;br /&gt;
* 4 octets - float - M22&lt;br /&gt;
* 4 octets - float - M23&lt;br /&gt;
* 4 octets - float - M24&lt;br /&gt;
* 4 octets - float - M31&lt;br /&gt;
* 4 octets - float - M32&lt;br /&gt;
* 4 octets - float - M33&lt;br /&gt;
* 4 octets - float - M34&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;DObj&#039;&#039;&#039; : (0x10 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - next_offset - prochain DOBJ&lt;br /&gt;
* 4 octets - mobj_offset - material offset&lt;br /&gt;
* 4 octets - pobj_offset - mesh offset&lt;br /&gt;
Liste chaînée qui permet de récupérer l&#039;ensemble des materials &amp;amp; mesh pour le JObj auquel il est lié.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;MObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - render_flags - RenderFlagsEnum&lt;br /&gt;
* 4 octets - tobj_offset - offset de texture - peut être invalide s&#039;il n&#039;y a pas de texture pour le material&lt;br /&gt;
* 4 octets - material_offset - couleurs des materials ?&lt;br /&gt;
* 8 octets - PEDesc ?&lt;br /&gt;
&lt;br /&gt;
Contient les textures &amp;amp; informations sur les couleurs des Materials.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RenderFlagsEnum&#039;&#039;&#039; : (se cumulent)&lt;br /&gt;
** USER = 80 00 00 00&lt;br /&gt;
** CONSTANT = 00 00 00 01&lt;br /&gt;
** VERTEX = 00 00 00 02&lt;br /&gt;
** BOTH = 00 00 00 03&lt;br /&gt;
** DIFFUSE = 00 00 00 04&lt;br /&gt;
** SPECULAR = 00 00 00 08&lt;br /&gt;
** TEX0 = 00 00 00 10&lt;br /&gt;
** TEX1 = 00 00 00 20&lt;br /&gt;
** TEX2 = 00 00 00 40&lt;br /&gt;
** TEX3 = 00 00 00 80&lt;br /&gt;
** TEX4 = 00 00 01 00&lt;br /&gt;
** TEX5 = 00 00 02 00&lt;br /&gt;
** TEX6 = 00 00 04 00&lt;br /&gt;
** TEX7 = 00 00 08 00&lt;br /&gt;
** TOON = 00 00 10 00&lt;br /&gt;
** ALPHA_MAT = 00 00 20 00&lt;br /&gt;
** ALPHA_VTX = 00 00 40 00&lt;br /&gt;
** ALPHA_BOTH = 00 00 60 00&lt;br /&gt;
** ZOFST = 01 00 00 00&lt;br /&gt;
** EFFECT = 02 00 00 00&lt;br /&gt;
** SHADOW = 04 00 00 00&lt;br /&gt;
** ZMODE_ALWAYS = 08 00 00 00&lt;br /&gt;
** DF_ALL = 10 00 00 00&lt;br /&gt;
** NO_ZUPDATE = 20 00 00 00&lt;br /&gt;
** XLU = 40 00 00 00&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;TObj&#039;&#039;&#039; : (0x5c octets) ===&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - tex_map_id - TexMapIdEnum&lt;br /&gt;
* 4 octets - gx_tex_gen_src - GXTexGenSrcEnum&lt;br /&gt;
* 4 octets - float - rx&lt;br /&gt;
* 4 octets - float - ry&lt;br /&gt;
* 4 octets - float - rz&lt;br /&gt;
* 4 octets - float - sx&lt;br /&gt;
* 4 octets - float - sy&lt;br /&gt;
* 4 octets - float - sz&lt;br /&gt;
* 4 octets - float - tx&lt;br /&gt;
* 4 octets - float - ty&lt;br /&gt;
* 4 octets - float - tz&lt;br /&gt;
* 4 octets - wrap_s - WrapEnum&lt;br /&gt;
* 4 octets - wrap_t - WrapEnum&lt;br /&gt;
* 1 octet - w_scale&lt;br /&gt;
* 1 octet - h_scale&lt;br /&gt;
* 2 octets - ?&lt;br /&gt;
* 1 octets - bump_map - (False = 00 ; True = 01)&lt;br /&gt;
* 4 bits - alpha_operation - AlphaOperationEnum&lt;br /&gt;
* 4 bits - color_operation - ColorOperationEnum&lt;br /&gt;
* 1 octet - shadow_lightmap - (False = 00 ; True = 01) (2 octets avec une Enum lightmap limite)&lt;br /&gt;
* 1 bit - ext_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
* 1 bit - ambiant_lightmap - (False = 0 ; True = 1) &lt;br /&gt;
* 1 bit - specular_lightmap - (False = 0 ; True = 1)&lt;br /&gt;
* 1 bit - diffuse_lightmap (False = 0 ; True = 1)&lt;br /&gt;
* 4 bits - coord_type - CoordTypeEnum&lt;br /&gt;
* 4 octets - float - blending - utilisé quand color_operation ou alpha_operation == BLEND&lt;br /&gt;
* 4 octets - mag_filter - MagFilterEnum&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
* 4 octets - ?&lt;br /&gt;
Informations de Textures. Le TObj contient des informations sur les paramètres d&#039;environnement de textures utilisés pour le rendu graphique ainsi que les offset de l&#039;image et des données de la palette utilisés pour cette texture. Le plus important ici, c&#039;est l&#039;offset d&#039;image et la palette/tlut - si l&#039;image n&#039;est pas indexée (RGBA, CMPR, etc.) alors la structure de description palette/tlut n&#039;est pas utilisée.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;TexMapIdEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TEXMAP0 = 00 00 00 00&lt;br /&gt;
** GX_TEXMAP1 = 00 00 00 01&lt;br /&gt;
** GX_TEXMAP2 = 00 00 00 02&lt;br /&gt;
** GX_TEXMAP3 = 00 00 00 03&lt;br /&gt;
** GX_TEXMAP4 = 00 00 00 04&lt;br /&gt;
** GX_TEXMAP5 = 00 00 00 05&lt;br /&gt;
** GX_TEXMAP6 = 00 00 00 06&lt;br /&gt;
** GX_TEXMAP7 = 00 00 00 07&lt;br /&gt;
** GX_MAX_TEXMAP = 00 00 00 08&lt;br /&gt;
** GX_TEXMAP_NULL = 00 00 00 09&lt;br /&gt;
** GX_TEXMAP_DISABLE = 00 00 00 0A&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GXTexGenSrcEnum&#039;&#039;&#039; :&lt;br /&gt;
** GX_TG_POS = 00 00 00 00&lt;br /&gt;
** GX_TG_NRM = 00 00 00 01&lt;br /&gt;
** GX_TG_BINRM = 00 00 00 02&lt;br /&gt;
** GX_TG_TANGENT = 00 00 00 03&lt;br /&gt;
** GX_TG_TEX0 = 00 00 00 04&lt;br /&gt;
** GX_TG_TEX1 = 00 00 00 05&lt;br /&gt;
** GX_TG_TEX2 = 00 00 00 06&lt;br /&gt;
** GX_TG_TEX3 = 00 00 00 07&lt;br /&gt;
** GX_TG_TEX4 = 00 00 00 08&lt;br /&gt;
** GX_TG_TEX5 = 00 00 00 09&lt;br /&gt;
** GX_TG_TEX6 = 00 00 00 0A&lt;br /&gt;
** GX_TG_TEX7 = 00 00 00 0B&lt;br /&gt;
** GX_TG_TEXCOORD0 = 00 00 00 0C&lt;br /&gt;
** GX_TG_TEXCOORD1 = 00 00 00 0D&lt;br /&gt;
** GX_TG_TEXCOORD2 = 00 00 00 0E&lt;br /&gt;
** GX_TG_TEXCOORD3 = 00 00 00 0F&lt;br /&gt;
** GX_TG_TEXCOORD4 = 00 00 00 10&lt;br /&gt;
** GX_TG_TEXCOORD5 = 00 00 00 11&lt;br /&gt;
** GX_TG_TEXCOORD6 = 00 00 00 12&lt;br /&gt;
** GX_TG_COLOR0 = 00 00 00 13&lt;br /&gt;
** GX_TG_COLOR1 = 00 00 00 14&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;AlphaOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = 0X&lt;br /&gt;
** ALPHAMASK = 1X&lt;br /&gt;
** BLEND = 2X&lt;br /&gt;
** MODULATE = 3X&lt;br /&gt;
** REPLACE = 4X&lt;br /&gt;
** PASS = 5X&lt;br /&gt;
** ADD = 6X&lt;br /&gt;
** SUB = 7X&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;ColorOperationEnum&#039;&#039;&#039;:&lt;br /&gt;
** NONE = X0&lt;br /&gt;
** ALPHA_MASK = X1&lt;br /&gt;
** RGB_MASK = X2&lt;br /&gt;
** BLEND = X3&lt;br /&gt;
** MODULATE = X4&lt;br /&gt;
** REPLACE = X5&lt;br /&gt;
** PASS = X6&lt;br /&gt;
** ADD = X7&lt;br /&gt;
** SUB = X8&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CoordTypeEnum&#039;&#039;&#039;:&lt;br /&gt;
** UV = X0&lt;br /&gt;
** REFLECTION = X1&lt;br /&gt;
** HILIGHT = X2&lt;br /&gt;
** SHADOW = X3&lt;br /&gt;
** TOON = X4&lt;br /&gt;
** GRADATION = X5&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;MagFilterEnum&#039;&#039;&#039;:&lt;br /&gt;
** GX_NEAR = 00 00 00 00&lt;br /&gt;
** GX_LINEAR = 00 00 00 01&lt;br /&gt;
** GX_NEAR_MIP_NEAR = 00 00 00 02&lt;br /&gt;
** GX_LIN_MIP_NEAR = 00 00 00 03&lt;br /&gt;
** GX_NEAR_MIP_LIN = 00 00 00 04&lt;br /&gt;
** GX_LIN_MIP_LIN = 00 00 00 05&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;WrapEnum&#039;&#039;&#039;:&lt;br /&gt;
** CLAMP = 00 00 00 00&lt;br /&gt;
** REPEAT = 00 00 00 01&lt;br /&gt;
** MIRROR = 00 00 00 02&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;Material&#039;&#039;&#039; : (0x14 octets) ===&lt;br /&gt;
* 1 octets - AMB_R - (ambient)&lt;br /&gt;
* 1 octets - AMB_G&lt;br /&gt;
* 1 octets - AMB_B&lt;br /&gt;
* 1 octets - AMB_A&lt;br /&gt;
* 1 octets - DIF_R - (diffuse)&lt;br /&gt;
* 1 octets - DIF_G&lt;br /&gt;
* 1 octets - DIF_B&lt;br /&gt;
* 1 octets - DIF_A&lt;br /&gt;
* 1 octets - SPC_R - (specular)&lt;br /&gt;
* 1 octets - SPC_G&lt;br /&gt;
* 1 octets - SPC_B&lt;br /&gt;
* 1 octets - SPC_A&lt;br /&gt;
* 4 octets - float - alpha&lt;br /&gt;
* 4 octets - float - shininess&lt;br /&gt;
&lt;br /&gt;
=== &#039;&#039;&#039;PObj&#039;&#039;&#039; : (0x18 octets) ===&lt;br /&gt;
* 4 octets - Inconnu&lt;br /&gt;
* 4 octets - next_offset - pobj&lt;br /&gt;
* 4 octets - vertex_attr_list_offset&lt;br /&gt;
* 2 octets - Flags - PObjFlagsEnum&lt;br /&gt;
* 2 octets - display_list_size - number of 0x20 (32) byte blocks occupied by display list data&lt;br /&gt;
* 4 octets - display_list_offset&lt;br /&gt;
* 4 octets - weight_list_offset - ? verifier qu&#039;on retrouve bien le tableau d&#039;envelope_weights à cet offset&lt;br /&gt;
&lt;br /&gt;
Comme l&#039;indique next_offset, il s&#039;agit d&#039;une liste de meshs à afficher pour un material donné référencé par un dobj. PObj contient les offsets de vertex attributes / display list / joint weight list ce qui suffit et permet d’interpréter et traiter les coordonnées de vertices, normals &amp;amp; textures.&lt;br /&gt;
&lt;br /&gt;
Les attributs vertex sont les plus important - les parametres specifiés contrôlent tout : du format, de la taille des données de chaque vertex, normal et coordonnées de textures et comment ces valeurs sont dimensionnées (scaled) par rapport à la présence et la taille de chaque valeur d&#039;index qui apparaît dans la display list information.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PObjFlagsEnum&#039;&#039;&#039; :&lt;br /&gt;
** Inconnu0 = 00 01&lt;br /&gt;
** Inconnu1 = 00 02&lt;br /&gt;
** ANIM = 00 08&lt;br /&gt;
** SHAPE_ANIM = 10 00&lt;br /&gt;
** ENVELOPE = 20 00&lt;br /&gt;
** CULLBACK = 40 00&lt;br /&gt;
** CULLFRONT = 80 00&lt;br /&gt;
&lt;br /&gt;
=== EnvelopeWeights : (0x? octets) ===&lt;br /&gt;
* 4 octets - envelope_count&lt;br /&gt;
* [envelope_count]:&lt;br /&gt;
** 4 octets - float - weight&lt;br /&gt;
** 4 octets - pad ?&lt;br /&gt;
* 4 octets - jobj_list_offset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== not verified yet ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;IMAGE_HEADER&#039;&#039;&#039; :&lt;br /&gt;
** 4 octets - image_offset - image data&lt;br /&gt;
** 2 octets - width&lt;br /&gt;
** 2 octets - height&lt;br /&gt;
** 4 octets - image_format&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;PALETTE_HEADER&#039;&#039;&#039; : (0x10)&lt;br /&gt;
** 4 octets - palette_offset - palette data&lt;br /&gt;
** 4 octets - palette_format&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
** 2 octets - color_count&lt;br /&gt;
** 2 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
image_offset et palette_offset sont souvent partagés par plusieurs textures - savoir ça permet de retrouver toutes les informations sur les images des textures (largeur, hauteur, format), ainsi que le format et le nombre de couleurs de la palette/tlut.&lt;br /&gt;
&lt;br /&gt;
Le format d&#039;image ne détermine pas le nombre total de couleurs de la palette qu&#039;elle utilisent. Par exemple, une image indexée sur 8 bits aurait un maximum de 256 couleurs mais seulement 136 ou 221 couleurs sont actuellement utilisées. De la sorte, la palette n&#039;utilisera pas la taille totale qu&#039;elle devrait utiliser.&lt;br /&gt;
&lt;br /&gt;
Les images suivent la structure généralement utilisée par la GameCube :&lt;br /&gt;
&lt;br /&gt;
IMAGE FORMATS :&lt;br /&gt;
* case 0: //i4&lt;br /&gt;
* case 1: //i8&lt;br /&gt;
* case 2: //i4a4&lt;br /&gt;
* case 3: //i8a8&lt;br /&gt;
* case 4: //r5g6b5&lt;br /&gt;
* case 5: //rgb5a3&lt;br /&gt;
* case 6: //r8g8b8a8&lt;br /&gt;
* case 8: //index4&lt;br /&gt;
* case 9: //index8&lt;br /&gt;
* case 0xa: //index14x2&lt;br /&gt;
* case 0xe: //s3tc1&lt;br /&gt;
&lt;br /&gt;
Les formats indexés utilisent aussi les informations de palettes/tlut et les données peuvent apparaître en plusieurs formats :&lt;br /&gt;
&lt;br /&gt;
PALETTE FORMATS :&lt;br /&gt;
* case 0: //ia8&lt;br /&gt;
* case 1: //r5g6b5&lt;br /&gt;
* case 2: //rgb5a3&lt;br /&gt;
&lt;br /&gt;
---&amp;gt; &amp;quot;Joint Data - Accessing Geometry, Mesh, and Vertex Attributes&amp;quot; https://smashboards.com/threads/melee-dat-format.292603/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
trad a revoir à partir de là, il faut investiguer le rendu 3D sur GameCube pour mieux comprendre&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// déclaration d&#039;un vertex et attribute information&lt;br /&gt;
// attr, type, cnt, data_type, flags?, file_offset&lt;br /&gt;
* ATTR_DATA&lt;br /&gt;
** 4 octets - GXAttr     vtx_attr_offset - attr&lt;br /&gt;
** 4 octets - GXAttrType vtx_attr_type   - index_type&lt;br /&gt;
** 4 octets - GXCompCnt  comp_cnt        - cnt&lt;br /&gt;
** 4 octets - GXCompType comp_type       - data_type	&lt;br /&gt;
** 1 octets - scale&lt;br /&gt;
** 1 octets - Inconnu&lt;br /&gt;
** 2 octets - vtx_stride&lt;br /&gt;
** 2 octets - data_offset&lt;br /&gt;
&lt;br /&gt;
vertex_attr_offset pointe sur une liste d&#039;attributs de vertex. Leur nombre n&#039;est pas donné. Les données dans cette structure suivent les informations et les types conçus par l&#039;architecture GameCube/WII et son API. La liste est terminée par une valeur spécifique de vtx_attr qui signale la fin de cette liste. Avec un accès à la doku SDK, il serait fortement conseillé de lire la section à propos des &amp;quot;vertex attributes and other specifications&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
La valeur de vtx_attr determine le type de donnée que cet attribut désigne et peut indiquer un nombre de types natifs utilisés utilisés pour passer les données entre les interfaces logicielles et matérielles.&lt;br /&gt;
&lt;br /&gt;
Les valeures possibles sont les suivantes :&lt;br /&gt;
* enum GXAttr (4 octets)&lt;br /&gt;
** GX_VA_PNMTXIDX = 0,    // position/normal matrix index&lt;br /&gt;
** GX_VA_TEX0MTXIDX,      // texture 0 matrix index&lt;br /&gt;
** GX_VA_TEX1MTXIDX,      // texture 1 matrix index&lt;br /&gt;
** GX_VA_TEX2MTXIDX,      // texture 2 matrix index&lt;br /&gt;
** GX_VA_TEX3MTXIDX,      // texture 3 matrix index&lt;br /&gt;
** GX_VA_TEX4MTXIDX,      // texture 4 matrix index&lt;br /&gt;
** GX_VA_TEX5MTXIDX,      // texture 5 matrix index&lt;br /&gt;
** GX_VA_TEX6MTXIDX,      // texture 6 matrix index&lt;br /&gt;
** GX_VA_TEX7MTXIDX,      // texture 7 matrix index&lt;br /&gt;
** GX_VA_POS      = 9,    // position&lt;br /&gt;
** GX_VA_NRM,             // normal&lt;br /&gt;
** GX_VA_CLR0,            // color 0&lt;br /&gt;
** GX_VA_CLR1,            // color 1&lt;br /&gt;
** GX_VA_TEX0,            // input texture coordinate 0&lt;br /&gt;
** GX_VA_TEX1,            // input texture coordinate 1&lt;br /&gt;
** GX_VA_TEX2,            // input texture coordinate 2&lt;br /&gt;
** GX_VA_TEX3,            // input texture coordinate 3&lt;br /&gt;
** GX_VA_TEX4,            // input texture coordinate 4&lt;br /&gt;
** GX_VA_TEX5,            // input texture coordinate 5&lt;br /&gt;
** GX_VA_TEX6,            // input texture coordinate 6&lt;br /&gt;
** GX_VA_TEX7,            // input texture coordinate 7&lt;br /&gt;
&lt;br /&gt;
** GX_POS_MTX_ARRAY,      // position matrix array pointer&lt;br /&gt;
** GX_NRM_MTX_ARRAY,      // normal matrix array pointer&lt;br /&gt;
** GX_TEX_MTX_ARRAY,      // texture matrix array pointer&lt;br /&gt;
** GX_LIGHT_ARRAY,        // light parameter array pointer&lt;br /&gt;
** GX_VA_NBT,             // normal, bi-normal, tangent &lt;br /&gt;
** GX_VA_MAX_ATTR,        // maximum number of vertex attributes&lt;br /&gt;
&lt;br /&gt;
** GX_VA_NULL     = 0xff  // NULL attribute (to mark end of lists)&lt;br /&gt;
&lt;br /&gt;
Toutes les données nécessaires pour représenter un mesh peuvent être spécifiées et indexées d&#039;une manière ou d&#039;une autre. De même, GX_VA_TEX0MTXIDX, GX_VA_CLR0, et autres sont aussi possibles - les valeurs les plus fréquentes dans les données SSBM sont : GX_VA_PNMTXIDX, GX_VA_POS, GX_VA_NRM, et GX_VA_TEX0. Which is to be expected as joint matrices, vertex positions/normals, and texture coordinates respectively are probably the most basic of elements needed to display a texture mesh, whether static or animated.&lt;br /&gt;
&lt;br /&gt;
When the value of vtx_attr == GX_VA_NULL (0xFF), the end of the vertex attribute array has been reached.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The vtx_attr_type values is actually associated with how the value is indexed, and can thus also determine the size of the index value within the display list data.&lt;br /&gt;
&lt;br /&gt;
* 4 octets - enum GXAttrType&lt;br /&gt;
** GX_NONE    = 0,&lt;br /&gt;
** GX_DIRECT,&lt;br /&gt;
** GX_INDEX8,&lt;br /&gt;
** GX_INDEX16&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Structures COLL_DATA : (données de collisions)&lt;br /&gt;
** 4 octets - vertex_offset (2 float par entrée correspondant à des données 2D probablement)&lt;br /&gt;
** 4 octets - vertex_count&lt;br /&gt;
** 4 octets - index_offset&lt;br /&gt;
** 4 octets - index_count&lt;br /&gt;
** 4 octets [5] - tableau inconnu&lt;br /&gt;
*** 2 octets - index_start&lt;br /&gt;
*** 2 octets - index_count&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
** 4 octets - Inconnu&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1267</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1267"/>
		<updated>2022-11-29T14:21:31Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 893px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1266</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1266"/>
		<updated>2022-11-29T14:21:13Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 894px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1265</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1265"/>
		<updated>2022-11-29T14:21:01Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 890px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1264</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1264"/>
		<updated>2022-11-29T14:20:37Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 850px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1263</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1263"/>
		<updated>2022-11-29T14:20:16Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 900px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1262</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1262"/>
		<updated>2022-11-29T14:19:33Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media screen and (max-width: 600px) {&lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1261</id>
		<title>MediaWiki:Common.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=MediaWiki:Common.css&amp;diff=1261"/>
		<updated>2022-11-29T14:17:36Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* Le CSS placé ici sera appliqué à tous les habillages. */&lt;br /&gt;
.breakout {&lt;br /&gt;
  float: right;&lt;br /&gt;
  border: 1px solid #888;&lt;br /&gt;
  background: var(--color-surface-0);&lt;br /&gt;
  padding: 0.2em;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
@media (min-width: 500px) { &lt;br /&gt;
 .breakout {&lt;br /&gt;
   display: none;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
.research {&lt;br /&gt;
  background: var(--background-color-framed);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-dark .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #1a252d;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
.skin-citizen-light .breakouttitle {&lt;br /&gt;
  text-align: center;&lt;br /&gt;
  background: #eaecf0;&lt;br /&gt;
  border-top: 1px solid #6a6;&lt;br /&gt;
  border-bottom: 1px solid #6a6;&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Borg_-_data_file&amp;diff=1260</id>
		<title>Borg - data file</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Borg_-_data_file&amp;diff=1260"/>
		<updated>2022-10-12T08:32:43Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
{{Box&lt;br /&gt;
| image=File:Moderate_research.png | text=&#039;&#039;&#039;This section needs more research&#039;&#039;&#039; &amp;lt;/br&amp;gt; There are some values undefined or undescriptible.}}&lt;br /&gt;
&lt;br /&gt;
Le fichier data des borgs est un fichier de 432 octets présent à l&#039;identique à deux endroits :&lt;br /&gt;
* afs_data/&#039;&#039;&#039;plxxxxdata.bin&#039;&#039;&#039; (ou plxxxxdata2.bin, ou plxxxxdata3.bin)&lt;br /&gt;
* afs_data/plxxxx.pzz -&amp;gt; &#039;&#039;&#039;000C_plxxxxdata.bin&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ce fichier contient différentes valeurs relatives à l&#039;implémentation du Borg dans le jeu tels que les valeurs dans menu -&amp;gt; collection -&amp;gt; nom_borg, ou encore dans l&#039;utilisation du borg dans une carte.&lt;br /&gt;
&lt;br /&gt;
On utilisera la liste de bookmarks HexWorkshop suivante pour regrouper tous les types et leurs significations :&lt;br /&gt;
&lt;br /&gt;
https://github.com/Virtual-World-RE/NeoGF/blob/main/data/GF_NTSC-plxxxxdata.bin.hbk&lt;br /&gt;
&lt;br /&gt;
Voici ce que les travaux en cours révèlent (offset : nom propriété - enums) :&lt;br /&gt;
* 44:0x2C : 4 octets - float - &#039;&#039;&#039;move speed&#039;&#039;&#039;&lt;br /&gt;
* 108:0x6c : 4 octets - float - &#039;&#039;&#039;falling acceleration&#039;&#039;&#039;&lt;br /&gt;
* 120:0x78 : 4 octets - float - &#039;&#039;&#039;jetpack_distance&#039;&#039;&#039; - max 100&lt;br /&gt;
* 124:0x7C : 4 octets - float - &#039;&#039;&#039;falling_speed&#039;&#039;&#039; - &amp;quot;-30.0&amp;quot;&lt;br /&gt;
* 184:0xB8 : 4 octets - float - &#039;&#039;&#039;camera_focus_z&#039;&#039;&#039; - généralement la hauteur de la tête du Borg&lt;br /&gt;
* 188:0xBC : 4 octets - float - &#039;&#039;&#039;camera_focus_z_after_shoot&#039;&#039;&#039;&lt;br /&gt;
* 192:0xC0 : 4 octets - float - &#039;&#039;&#039;camera_distance&#039;&#039;&#039; - distance du Borg&lt;br /&gt;
* 196:0xC4 : 4 octets - float - &#039;&#039;&#039;camera_initial_distance&#039;&#039;&#039; - distance au lancement de la scene&lt;br /&gt;
* 200:0xC8 : 4 octets - float - &#039;&#039;&#039;camera_distance_after_shoot&#039;&#039;&#039;&lt;br /&gt;
* 204:0xCC : 4 octets - float - &#039;&#039;&#039;camera_z_after_kill&#039;&#039;&#039; - distance qui ne doit pas être alignée avec le z focus du Borg (le jeu oscille pour montrer l&#039;ennemie focus en toute circonstance)&lt;br /&gt;
* 240:0xF0 : 4 octets - float - &#039;&#039;&#039;camera_move_delta_distance&#039;&#039;&#039; - on laisse avancer un peu le Borg pour dézoomer puis on le suit&lt;br /&gt;
* 416 : &#039;&#039;&#039;Type&#039;&#039;&#039; (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement) : &lt;br /&gt;
    00 -&amp;gt; Long range type&lt;br /&gt;
    01 -&amp;gt; Short range type&lt;br /&gt;
    02 -&amp;gt; Speed type&lt;br /&gt;
    03 -&amp;gt; Almighty type&lt;br /&gt;
    04 -&amp;gt; Support type&lt;br /&gt;
* 419 : &#039;&#039;&#039;Jump type&#039;&#039;&#039; (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement) :&lt;br /&gt;
    00 -&amp;gt; boost jump&lt;br /&gt;
    01 -&amp;gt; Air jump level 1&lt;br /&gt;
    02 -&amp;gt; Air jump level 2&lt;br /&gt;
    03 -&amp;gt; Air jump level 3&lt;br /&gt;
    04 -&amp;gt; Air jump level 4&lt;br /&gt;
    ff -&amp;gt; N/A&lt;br /&gt;
* 420 : &#039;&#039;&#039;Defense&#039;&#039;&#039; (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
* 421 : &#039;&#039;&#039;Shot&#039;&#039;&#039;    (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
* 422 : &#039;&#039;&#039;Attack&#039;&#039;&#039;  (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
* 423 : &#039;&#039;&#039;Speed&#039;&#039;&#039;   (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
* 424 : &#039;&#039;&#039;Shot icon&#039;&#039;&#039; (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
    00 -&amp;gt; Shuriken&lt;br /&gt;
    01 -&amp;gt; Ammo&lt;br /&gt;
    02 -&amp;gt; Sword&lt;br /&gt;
    03 -&amp;gt; double sword&lt;br /&gt;
    04 -&amp;gt; Fist&lt;br /&gt;
    05 -&amp;gt; &amp;quot;Boule à pointes&amp;quot;&lt;br /&gt;
    06 -&amp;gt; Rocket&lt;br /&gt;
    07 -&amp;gt; Flame&lt;br /&gt;
    0a -&amp;gt; Cannonball&lt;br /&gt;
    0b -&amp;gt; Electricity&lt;br /&gt;
    0d -&amp;gt; &lt;br /&gt;
    0e -&amp;gt; &lt;br /&gt;
    0f -&amp;gt; &lt;br /&gt;
    14 -&amp;gt; &lt;br /&gt;
    16 -&amp;gt; &lt;br /&gt;
    18 -&amp;gt; &lt;br /&gt;
    ff -&amp;gt; No &amp;quot;Shot&amp;quot; field&lt;br /&gt;
* 425 : &#039;&#039;&#039;Attack icon&#039;&#039;&#039; (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
    00 -&amp;gt; Shutiken&lt;br /&gt;
    01 -&amp;gt; Ammo&lt;br /&gt;
    02 -&amp;gt; Sword&lt;br /&gt;
    03 -&amp;gt; Double sword&lt;br /&gt;
    04 -&amp;gt; Fist&lt;br /&gt;
    05 -&amp;gt; &amp;quot;Boule à pointe&amp;quot;&lt;br /&gt;
    06 -&amp;gt; Rocket&lt;br /&gt;
    07 -&amp;gt; Flame&lt;br /&gt;
    0d -&amp;gt; &lt;br /&gt;
    13 -&amp;gt; &lt;br /&gt;
    14 -&amp;gt; &lt;br /&gt;
    15 -&amp;gt; &lt;br /&gt;
    16 -&amp;gt; &lt;br /&gt;
    1a -&amp;gt; &amp;quot;scie circulaire&amp;quot;&lt;br /&gt;
    ff -&amp;gt; No &amp;quot;attack&amp;quot; field&lt;br /&gt;
* 426 : &#039;&#039;&#039;Charge atk icon&#039;&#039;&#039; (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
    00 -&amp;gt; Shuriken&lt;br /&gt;
    01 -&amp;gt; Ammo&lt;br /&gt;
    02 -&amp;gt; Sword&lt;br /&gt;
    03 -&amp;gt; Double sword&lt;br /&gt;
    04 -&amp;gt; Fist&lt;br /&gt;
    05 -&amp;gt; &amp;quot;Boule à pointe&amp;quot;&lt;br /&gt;
    07 -&amp;gt; Flame&lt;br /&gt;
    08 -&amp;gt; &lt;br /&gt;
    0b -&amp;gt; &lt;br /&gt;
    0f -&amp;gt; &lt;br /&gt;
    10 -&amp;gt; &lt;br /&gt;
    14 -&amp;gt; &lt;br /&gt;
    15 -&amp;gt; &lt;br /&gt;
    16 -&amp;gt; &lt;br /&gt;
    18 -&amp;gt; Blue laser&lt;br /&gt;
    ff -&amp;gt; No &amp;quot;Charge atk&amp;quot; field&lt;br /&gt;
* 427 : &#039;&#039;&#039;First &amp;quot;x&amp;quot; icon&#039;&#039;&#039; (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
    00 -&amp;gt; Shuriken&lt;br /&gt;
    01 -&amp;gt; Ammo&lt;br /&gt;
    02 -&amp;gt; Sword&lt;br /&gt;
    03 -&amp;gt; Double sword&lt;br /&gt;
    04 -&amp;gt; Fist&lt;br /&gt;
    05 -&amp;gt; &amp;quot;Boule à pointe&amp;quot;&lt;br /&gt;
    06 -&amp;gt; &lt;br /&gt;
    07 -&amp;gt; &lt;br /&gt;
    08 -&amp;gt; &lt;br /&gt;
    09 -&amp;gt; &lt;br /&gt;
    0a -&amp;gt; &lt;br /&gt;
    0b -&amp;gt; &lt;br /&gt;
    0c -&amp;gt; &lt;br /&gt;
    0d -&amp;gt; &lt;br /&gt;
    0e -&amp;gt; &lt;br /&gt;
    0f -&amp;gt; &lt;br /&gt;
    10 -&amp;gt; &lt;br /&gt;
    11 -&amp;gt; &lt;br /&gt;
    12 -&amp;gt; &lt;br /&gt;
    15 -&amp;gt; &lt;br /&gt;
    16 -&amp;gt; &lt;br /&gt;
    18 -&amp;gt; &lt;br /&gt;
    19 -&amp;gt; &lt;br /&gt;
    1a -&amp;gt; &amp;quot;scie circulaire&amp;quot;&lt;br /&gt;
    ff -&amp;gt; No &amp;quot;First x&amp;quot; field&lt;br /&gt;
* 428 : &#039;&#039;&#039;Second &amp;quot;x&amp;quot; icon&#039;&#039;&#039; (valeur du menu -&amp;gt; collection -&amp;gt; vue borg uniquement)&lt;br /&gt;
    00 -&amp;gt; Shuriken&lt;br /&gt;
    01 -&amp;gt; Ammo&lt;br /&gt;
    02 -&amp;gt; Sword&lt;br /&gt;
    03 -&amp;gt; Double sword&lt;br /&gt;
    0b -&amp;gt; Electricity&lt;br /&gt;
    11 -&amp;gt; &amp;quot;blue human&amp;quot;&lt;br /&gt;
    17 -&amp;gt; &lt;br /&gt;
    18 -&amp;gt; &lt;br /&gt;
    ff -&amp;gt; No &amp;quot;Second x&amp;quot; field&lt;br /&gt;
* 429 : ?&lt;br /&gt;
    01 -&amp;gt; &lt;br /&gt;
    02 -&amp;gt; ?&lt;br /&gt;
    03 -&amp;gt; &lt;br /&gt;
    04 -&amp;gt; &lt;br /&gt;
    05 -&amp;gt; &lt;br /&gt;
    06 -&amp;gt; &lt;br /&gt;
    07 -&amp;gt; &lt;br /&gt;
    08 -&amp;gt; &lt;br /&gt;
    09 -&amp;gt; &lt;br /&gt;
    0a -&amp;gt; &lt;br /&gt;
    0b -&amp;gt; &lt;br /&gt;
    0c -&amp;gt; &lt;br /&gt;
    0d -&amp;gt; &lt;br /&gt;
    0e -&amp;gt; &lt;br /&gt;
    0f -&amp;gt; &lt;br /&gt;
    10 -&amp;gt; &lt;br /&gt;
    11 -&amp;gt; &lt;br /&gt;
    12 -&amp;gt; &lt;br /&gt;
    13 -&amp;gt; ?&lt;br /&gt;
    14 -&amp;gt; ?&lt;br /&gt;
&lt;br /&gt;
[[Category:Implementations]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Borg_Setup_Observation&amp;diff=1259</id>
		<title>Borg Setup Observation</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Borg_Setup_Observation&amp;diff=1259"/>
		<updated>2022-10-12T08:30:24Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Box&lt;br /&gt;
| image=File:Major_research.png | text=&#039;&#039;&#039;This section needs a lot of research&#039;&#039;&#039; &amp;lt;/br&amp;gt; This area is undergoing research, except this page to change a lot}}&lt;br /&gt;
&lt;br /&gt;
Each Borg has a set of fields which are responsible for certain properties and behaviours.&lt;br /&gt;
&amp;lt;br&amp;gt;These are as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Address &lt;br /&gt;
! Type&lt;br /&gt;
! Observations &lt;br /&gt;
|+ Properties&lt;br /&gt;
|-&lt;br /&gt;
| 0x27c || (4 bytes) || Attack Values Pointer&lt;br /&gt;
|-&lt;br /&gt;
| 0x4ac || (4 bytes) || [[Borg - data file | Set File Pointer]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b0 || (4 bytes) || Borg/Attack Data? (includes knockdown function index and seemingly attack data)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b4 || (4 bytes) || Attack Controller&lt;br /&gt;
|-&lt;br /&gt;
| 0x4b8 || (4 bytes) || Prop Load Function?&lt;br /&gt;
|-&lt;br /&gt;
| 0x4bc || (4 bytes) || Idle Before Function&lt;br /&gt;
|-&lt;br /&gt;
| 0x4c0 || (4 bytes) || Idle After Function&lt;br /&gt;
|-&lt;br /&gt;
| 0x4c4 || (4 bytes) || ? (empty function?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4c8 || (4 bytes) || ? (empty function?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4cc || (4 bytes) || ? (empty function?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4d0 || (4 bytes) || ? (empty function?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4d4 || (4 bytes) || ? (empty DAT?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4d8 || (4 bytes) || ? (function)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4dc || (4 bytes) || ? (empty DAT?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4e0 || (4 bytes) || ? (empty DAT?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4e4 || (4 bytes) || ? (function)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4e8 || (4 bytes) || Sound Data Pointer&lt;br /&gt;
|-&lt;br /&gt;
| 0x4ec || (4 bytes) || Direction DAT? (need better name/research)&lt;br /&gt;
|-&lt;br /&gt;
| 0x4f0 || (4 bytes) || Action Functions?&lt;br /&gt;
|-&lt;br /&gt;
| 0x1d80 || (4 bytes) || ? (DAT, affects animations?)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1d84 || (4 bytes) || ? (DAT)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1d88 || (4 bytes) || ? (DAT)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1d8c || (4 bytes) || ? (DAT)&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=Template:Box&amp;diff=1237</id>
		<title>Template:Box</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=Template:Box&amp;diff=1237"/>
		<updated>2022-09-27T00:35:35Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| cellpadding=&amp;quot;5&amp;quot; cellspacing=&amp;quot;3&amp;quot; class=&amp;quot;research&amp;quot; align=&amp;quot;center&amp;quot; style=&amp;quot;border:4px solid #4D4D4D; border-radius: 40px; /* Standard syntax */&amp;quot; ! width=&amp;quot;65%&amp;quot; &lt;br /&gt;
| style=&amp;quot;width: 10%; padding-left: 20px;&amp;quot; |{{#if:{{{image|}}}|[[{{{image}}}|x40px|link=]]}}&lt;br /&gt;
|{{{text|}}}&lt;br /&gt;
|}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Usage===&lt;br /&gt;
This is a basic template which can be modified to create a variety of simple [[:Category:Notice Templates|Notice Templates]]. In most cases, it should be used in lieu of wikitext for uniformity.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
{{Box&lt;br /&gt;
|image=&lt;br /&gt;
|text=&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;image:&#039;&#039; Filepath for the image, ex: File:ImageName.png&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;&#039;text:&#039;&#039; Text to be displayed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Notice Templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=AFS_(File_format)&amp;diff=1236</id>
		<title>AFS (File format)</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=AFS_(File_format)&amp;diff=1236"/>
		<updated>2022-09-26T11:28:41Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This article is about the AFS file format. See [[AFS (Gotcha Force)]] for current research on Gotcha Force AFS.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The AFS file format allow to [http://wiki.xentax.com/index.php/GRAF:AFS_AFS pack a group of files sometimes in folders in one unique file]. There is no compression. Each element (packed files or AFS system files) are aligned to block of 0x800 bytes. Except for packed files AFS system files are in Little Endian.&lt;br /&gt;
&lt;br /&gt;
An AFS file can be diveded in &#039;&#039;&#039;4 parts&#039;&#039;&#039;:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Header&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Value !! Observation&lt;br /&gt;
|-&lt;br /&gt;
| 0x0||u32||  Magic number = &amp;quot;AFS\x00&amp;quot; or &amp;quot;AFS\x20&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 0x4||u32|| Total number of packed files&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
# The &#039;&#039;&#039;Table Of Content&#039;&#039;&#039; (TOC):&lt;br /&gt;
#* It&#039;s an array of couples:&lt;br /&gt;
#** 4 bytes: file offset&lt;br /&gt;
#** 4 bytes: file length&lt;br /&gt;
#* After this array we can found 3 configurations:&lt;br /&gt;
#** We find the offset of the Filename Directory (FD) (4 bytes) and it&#039;s length (4 bytes).&lt;br /&gt;
#** We find a padding (NULL bytes) and then the offset of the FD (4 bytes) and it&#039;s length (4 bytes).&lt;br /&gt;
#** There is no FD (no offset nor length).&lt;br /&gt;
# The files area &#039;&#039;&#039;containing all packed files&#039;&#039;&#039;&lt;br /&gt;
# Le &#039;&#039;&#039;Filename Directory&#039;&#039;&#039; (FD) where we found for each file:&lt;br /&gt;
#* 32 bytes: file name or path padded with NULL bytes&lt;br /&gt;
#* 2 bytes: years&lt;br /&gt;
#* 2 bytes: months&lt;br /&gt;
#* 2 bytes: days&lt;br /&gt;
#* 2 bytes: hours&lt;br /&gt;
#* 2 bytes: minutes&lt;br /&gt;
#* 2 bytes: secondes&lt;br /&gt;
#* 4 bytes: in some AFS we found the length of the file, in some others we found file_offset, file_len, file_offset, file_len ... for every file entry of the FD taking TOC entries in the order. And finaly in some AFS this field has a fixed value or random values.&lt;br /&gt;
&lt;br /&gt;
The FD is not present in all AFS. When present we can find multiple files with same names and sharing sames datas areas or not. The filename can also contains relative or absolutes file paths &amp;quot;../data/file&amp;quot; like found in the game &amp;quot;Kidou Senshi Gundam - Gundam vs. Z Gundam (Japan)&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The AFS is handled by the main executable (boot.dol). So in theory files could be retrieved by 3 differents ways that could also be mixed:&lt;br /&gt;
* Get the file by index: the index of the offset/length in the TOC.&lt;br /&gt;
* Get the file by name in the FD.&lt;br /&gt;
* Get the file by a relative offset from start of the AFS / somewhere in memory / DVD. This method is conceivable since align is the same for multiple file format packed in the DVD: [[MDT (Gotcha Force)|MDT]]/[[PZZ (Gotcha Force)|PZZ]] and AFS (0x800). The retrievial of the length would be easy using different methods (headers and so on.).&lt;br /&gt;
&lt;br /&gt;
The Virtual World RE [https://github.com/Virtual-World-RE/NeoGF/tree/main/afstool afstool.py] allow rebuilding the AFS by adding a folder tree and changing every parameters with 4 rebuild strategies: auto, index, offset, mixed.&lt;br /&gt;
&lt;br /&gt;
[[Category:File format]]&lt;br /&gt;
[[Category:Gotcha Force]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=DOL_(File_format)&amp;diff=1233</id>
		<title>DOL (File format)</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=DOL_(File_format)&amp;diff=1233"/>
		<updated>2022-09-13T13:45:04Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This article is for the DOL file format. See [[DOL (Gotcha Force)]] for current research on Gotcha Force DOL.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{ToDo| 1 | Better description sections. }}&lt;br /&gt;
{{Research | 3 | We need to fix bug with bad align.}}&lt;br /&gt;
{{Box | image=File:Gfbeta02.jpg | text=We can add anything}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DOL&#039;&#039;&#039; files (from the GameCube codename &#039;&#039;&#039;dol&#039;&#039;&#039;phin) are files found in [[GCM (File format)|iso/GCM]] GameCube and Wii files. Observations below concern only GameCube dol. Before being a dol the file was in ELF file format compiled from C sources with the GameCube SDK. All libs are staticly linked but in some dols we found some kind of external code loaded in the REL format.&lt;br /&gt;
&lt;br /&gt;
== Boot Info 2 (BI2) dol configuration ==&lt;br /&gt;
&lt;br /&gt;
For performances optimizations it is advisable to keep a max loaded length of 4Mb. This restriction is enabled by default with the DolLimit setting set to 4Mb in the BI2. This limit is often disabled by developpers. Code in .rel can be dynamically relocated and loaded by SDK OS lib (OSSetBootDol).&lt;br /&gt;
* In developpement boards we can map sections in virtual memory up to 0x81200000.&lt;br /&gt;
* In production boards we can map sections in virtual memory up to 0x80700000.&lt;br /&gt;
After this limits the apploader will raise an error.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
The dol is a [[GCM (File format)|iso/GCM]] GameCube system file and is placed independently of the mini DVD user space (FST). The dol offset is stored in the boot.bin:0x420 at the beginning of the GCM/iso.&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
&lt;br /&gt;
The dol [http://wiki.tockdom.com/wiki/DOL_(File_Format) header] has a length of 0x100 bytes which describe how the dol must be loaded in virtual memory and how to prepare this memory.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;| Dol header&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Length !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x000 || style=&amp;quot;width:10%;&amp;quot; | 4 × 18 || Sections offsets - It tells where the section datas begin relative from the dol start. 0 for unused section.&lt;br /&gt;
|-&lt;br /&gt;
| 0x048 || 4 × 18 || Sections virtual addresses - It tells where we load section datas in virtual memory. 0 for unused section.&lt;br /&gt;
|-&lt;br /&gt;
| 0x090 || 4 × 18 || Sections length in bytes. 0 for unused section.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0d8 || 4 || bss virtual address - Where bss start in virtual memory. bss areas are 0 initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0dc || 4 || bss length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0e0 || 4 || Entry point - Virtual address where we start executing when the dol has been loaded. This function shouldn&#039;t terminate.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0e4 || 0x1c || Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || colspan=&amp;quot;2&amp;quot;| Header end. Start of section datas.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The first 7 sections are .text section containing executable code. We can find interrupts handlers or padding in it.&lt;br /&gt;
&lt;br /&gt;
The 11 next sections are for .data containing initialized datas.&lt;br /&gt;
&lt;br /&gt;
The .bss interval can contain .data or .text sections in it. If this is the case then the .bss is splited to not override existing sections and only out parts are keeped.&lt;br /&gt;
&lt;br /&gt;
All section have to be aligned to 32 bytes. The [https://www.gc-forever.com/wiki/index.php?title=Apploader apploader] align all section length to upper 32 bytes&lt;br /&gt;
&lt;br /&gt;
=== Memory organization ===&lt;br /&gt;
[https://www.gc-forever.com/yagcd/chap4.html#sec4 Yet Another GameCube Documentation / YAGCD] provide a very good documentation on memory organization.&lt;br /&gt;
&lt;br /&gt;
==== Memory global organization ====&lt;br /&gt;
&lt;br /&gt;
Global memory organization describe how addressing used in the dol allow to access the differents GameCube hardware composants. This is really interesting to understand the bus / interfaces access.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=4 | Memory mapping&lt;br /&gt;
|-&lt;br /&gt;
! Begin !! End !! Length !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || 0x017fffff || 24MB || Physical address of the RAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000000 || 0x817fffff || 24MB || Logical address of the RAM, cached&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0000000 || 0xC17fffff || 24MB || Logical address of the RAM, not cached&lt;br /&gt;
|-&lt;br /&gt;
| 0xc8000000 || || 2MB || Embedded Framebuffer (EFB)&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC000000 || || || Hardware registers&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC000000 || || || CP - Command Processor&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC001000 || || || PE - Pixel Engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC002000 || || || VI - Video Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC003000 || || || PI - Processor Interface (Interrupt Interface)&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC004000 || || || MI - Memory Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC005000 || || || AI - Audio Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC006000 || || || DI - DVD Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC006400 || || || SI - Serial Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC006800 || || || EXI - External Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC006C00 || || || Streaming Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC008000 || || || GX FIFO (Graphic display lists)&lt;br /&gt;
|-&lt;br /&gt;
| 0xe0000000 || 0xe0003fff || 16k || L2 Cache&lt;br /&gt;
|-&lt;br /&gt;
| 0xfff00000 || || 1MB || IPL (mapped here at bootup)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hardware registers length and composition is detailed [https://www.gc-forever.com/yagcd/chap5.html#sec5 here].&lt;br /&gt;
&lt;br /&gt;
==== User program area (dol) ====&lt;br /&gt;
As seen above the dol is mapped in the 24MB of RAM in virtual cached address space from 0x80003100 to 0x80700000 in production boards, and 0x81200000 in development boards.&lt;br /&gt;
&lt;br /&gt;
The first 0x3100 bytes contains system informations [https://www.gc-forever.com/yagcd/chap4.html#sec4.2.1 (&amp;quot;Dolphin OS Globals&amp;quot;)] with globals variables and also interrupts handlers specific to powerpc architecture. This informations are interesting when creating a dol loader resolving cross references inside the code.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=4 | Memory map&lt;br /&gt;
|-&lt;br /&gt;
! Adress !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x80003100 || Start of mapped sections .text (usually)&lt;br /&gt;
|-&lt;br /&gt;
| 0x80003140 || Entry point (early SDK v1.0 applications)&lt;br /&gt;
|-&lt;br /&gt;
| ? || Stack - After the last section with a default length of 0x10000 bytes&lt;br /&gt;
|-&lt;br /&gt;
| ? || ArenaLo - Bottom of the Area initialized by the OS (SDK) after the Stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x81200000 || Load Address of the Apploader&lt;br /&gt;
|-&lt;br /&gt;
| 0x81300000 || Load Address of Bootrom/IPL&lt;br /&gt;
|-&lt;br /&gt;
| ? || ArenaHi - Top of the Area initialized by the OS (SDK) stuck to the FST&lt;br /&gt;
|-&lt;br /&gt;
| ? || FST - Variable length - Stuck to the end of virtual cached memory space.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81800000 || End of the virtual cached memory space (24MB)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Area contains the apploader and the bootrom/IPL. This area is allocated by the SDK api and is used to create and destroy Heaps in it.&lt;br /&gt;
&lt;br /&gt;
The dol can be mapped from 0x80003100 to 0x80700000 in production boards leaving 7.3 MB for the program.&lt;br /&gt;
&lt;br /&gt;
The FST is loaded in virtual memory deppending to it&#039;s position from the dol in the [[GCM (File format)|GCM/iso]]:&lt;br /&gt;
* FST_offset(iso) &amp;lt; dol_offset(iso) -&amp;gt; FST_virtual_address &amp;gt; dol_virtual_address&lt;br /&gt;
* FST_offset(iso) &amp;gt; dol_offset(iso) -&amp;gt; FST_virtual_address &amp;lt; dol_virtual_address&lt;br /&gt;
&lt;br /&gt;
==== Sections ====&lt;br /&gt;
&lt;br /&gt;
The PowerPc Embedded Application Binary Interface (EABI) describe 4 special registers:&lt;br /&gt;
* R1 is the stack pointer. We substract the space needed from it when entering in a function (Stack Frame). Terminal functions (thoose which don&#039;t call any functions) don&#039;t always need a frame.&lt;br /&gt;
* R2 is the read only Small Data Anchor __SDA2_BASE__ addressed with a signed short offset. It correspond to the .sdata2 (initialized constants) or .sbss2 (uninitialized constants).&lt;br /&gt;
* R13 is the Read / Write Small Data Anchor __SDA_BASE__ also addressed with a signed short offset. It correspond to the .sdata (initialized variables) or .sbss (uninitialized variables).&lt;br /&gt;
* R0 when used with an offset don&#039;t care about it&#039;s value. It allow to address 0x8000 first bytes of memory space and 0x7fff last bytes (signed short).&lt;br /&gt;
&lt;br /&gt;
As said above SDA are used with a signed short offset (-0x8000 +0x7FFF). When we reach the entry_point then R1 R2 and R13 are pointer in the Bootrom/IPL. The first function __init_registers initialize them for executing the dol and we can see that it&#039;s set to the beginning of some .data and .bss sections.&lt;br /&gt;
&lt;br /&gt;
We found this section originally build in the ELF32 file format:&lt;br /&gt;
* .ctors&lt;br /&gt;
* .dtors&lt;br /&gt;
* .rodata&lt;br /&gt;
* .data&lt;br /&gt;
* .bss&lt;br /&gt;
* .sdata (should correspond to -0x8000(R13) &lt;br /&gt;
* .sbss&lt;br /&gt;
* .sdata2 (should correspond to -0x8000(R2)&lt;br /&gt;
* .sbss2&lt;br /&gt;
* Followed by the stack (by default 0x10000 bytes length)&lt;br /&gt;
* Followed by ArenaLo initialized by the SDK&lt;br /&gt;
* Apploader loaded at address 81200000&lt;br /&gt;
* Bootrom/IPL loaded at address 81300000&lt;br /&gt;
* ArenaHi stuck to the FST&lt;br /&gt;
* FST stuck to the end of memory (81800000)&lt;br /&gt;
&lt;br /&gt;
The SDK offer two functions for handling Arena: OSAllocFromArenaHi &amp;amp; OSAllocFromArenaLo. But the main program initialize a number of Heaps in it and Create / Destroy them as it need.&lt;br /&gt;
&lt;br /&gt;
== DI - DVD Interface ==&lt;br /&gt;
The driver handling DVD accesses use the chip [https://wiibrew.org/wiki/Hardware/Disc_Drive#Hardware MN102] documented on [https://www.gc-forever.com/yagcd/chap5.html#sec5.7 yagcd]. The Hitmen team has programmed a plugin for it: [http://hitmen.c02.at/html/gc_releases.html MN102 IDA Pro].&lt;br /&gt;
&lt;br /&gt;
Some more documentation on [http://hitmen.c02.at/files/docs/gc/Ingenieria-Inversa-Understanding_WII_Gamecube_Optical_Disks.html disc reads].&lt;br /&gt;
&lt;br /&gt;
== EXI - External Interface ==&lt;br /&gt;
[https://github.com/dolphin-emu/dolphin/blob/master/Source/Core/Core/HW/EXI/EXI_Device.h Dolphin Emulator sources] show how EXI is used: MemoryCard, MaskROM, AD16, Microphone, Ethernet, AGP, EthernetXLink, EthernetTapServer.&lt;br /&gt;
&lt;br /&gt;
== SI - Serial Interface ==&lt;br /&gt;
[https://github.com/dolphin-emu/dolphin/blob/master/Source/Core/Core/HW/SI/SI_Device.h Dolphin Emulator sources] show devices using SI. We found this devices: GBA (Game Boy Advance), CONTROLLER, KEYBOARD, STEERING, TARUKONGA. The Serial Interface use the [https://n64brew.dev/wiki/Joybus_Protocol Joybus] protocol.&lt;br /&gt;
&lt;br /&gt;
== Softwares ==&lt;br /&gt;
&lt;br /&gt;
This softwares can handle dol files:&lt;br /&gt;
* [https://github.com/Virtual-World-RE/NeoGF/tree/main/doltool doltool.py] - Virtual World RE.&lt;br /&gt;
* [https://github.com/sup39/GeckoLoader GeckoLoader], - JoshuaMKW, sup32.&lt;br /&gt;
&lt;br /&gt;
[[Category:File format]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
	<entry>
		<id>https://wiki.re.virtualworld.fr/index.php?title=DOL_(File_format)&amp;diff=1232</id>
		<title>DOL (File format)</title>
		<link rel="alternate" type="text/html" href="https://wiki.re.virtualworld.fr/index.php?title=DOL_(File_format)&amp;diff=1232"/>
		<updated>2022-09-13T13:39:59Z</updated>

		<summary type="html">&lt;p&gt;Administrateur: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Gotcha Force | &amp;amp;larr; Gotcha Force]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;This article is for the DOL file format. See [[DOL (Gotcha Force)]] for current research on Gotcha Force DOL.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{ToDo| 1 | Better description sections. }}&lt;br /&gt;
{{Research | 3 | We need to fix bug with bad align.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;DOL&#039;&#039;&#039; files (from the GameCube codename &#039;&#039;&#039;dol&#039;&#039;&#039;phin) are files found in [[GCM (File format)|iso/GCM]] GameCube and Wii files. Observations below concern only GameCube dol. Before being a dol the file was in ELF file format compiled from C sources with the GameCube SDK. All libs are staticly linked but in some dols we found some kind of external code loaded in the REL format.&lt;br /&gt;
&lt;br /&gt;
== Boot Info 2 (BI2) dol configuration ==&lt;br /&gt;
&lt;br /&gt;
For performances optimizations it is advisable to keep a max loaded length of 4Mb. This restriction is enabled by default with the DolLimit setting set to 4Mb in the BI2. This limit is often disabled by developpers. Code in .rel can be dynamically relocated and loaded by SDK OS lib (OSSetBootDol).&lt;br /&gt;
* In developpement boards we can map sections in virtual memory up to 0x81200000.&lt;br /&gt;
* In production boards we can map sections in virtual memory up to 0x80700000.&lt;br /&gt;
After this limits the apploader will raise an error.&lt;br /&gt;
&lt;br /&gt;
== Format ==&lt;br /&gt;
The dol is a [[GCM (File format)|iso/GCM]] GameCube system file and is placed independently of the mini DVD user space (FST). The dol offset is stored in the boot.bin:0x420 at the beginning of the GCM/iso.&lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
&lt;br /&gt;
The dol [http://wiki.tockdom.com/wiki/DOL_(File_Format) header] has a length of 0x100 bytes which describe how the dol must be loaded in virtual memory and how to prepare this memory.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;| Dol header&lt;br /&gt;
|-&lt;br /&gt;
! Offset !! Length !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x000 || style=&amp;quot;width:10%;&amp;quot; | 4 × 18 || Sections offsets - It tells where the section datas begin relative from the dol start. 0 for unused section.&lt;br /&gt;
|-&lt;br /&gt;
| 0x048 || 4 × 18 || Sections virtual addresses - It tells where we load section datas in virtual memory. 0 for unused section.&lt;br /&gt;
|-&lt;br /&gt;
| 0x090 || 4 × 18 || Sections length in bytes. 0 for unused section.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0d8 || 4 || bss virtual address - Where bss start in virtual memory. bss areas are 0 initialized.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0dc || 4 || bss length in bytes.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0e0 || 4 || Entry point - Virtual address where we start executing when the dol has been loaded. This function shouldn&#039;t terminate.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0e4 || 0x1c || Padding.&lt;br /&gt;
|-&lt;br /&gt;
| 0x100 || colspan=&amp;quot;2&amp;quot;| Header end. Start of section datas.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The first 7 sections are .text section containing executable code. We can find interrupts handlers or padding in it.&lt;br /&gt;
&lt;br /&gt;
The 11 next sections are for .data containing initialized datas.&lt;br /&gt;
&lt;br /&gt;
The .bss interval can contain .data or .text sections in it. If this is the case then the .bss is splited to not override existing sections and only out parts are keeped.&lt;br /&gt;
&lt;br /&gt;
All section have to be aligned to 32 bytes. The [https://www.gc-forever.com/wiki/index.php?title=Apploader apploader] align all section length to upper 32 bytes&lt;br /&gt;
&lt;br /&gt;
=== Memory organization ===&lt;br /&gt;
[https://www.gc-forever.com/yagcd/chap4.html#sec4 Yet Another GameCube Documentation / YAGCD] provide a very good documentation on memory organization.&lt;br /&gt;
&lt;br /&gt;
==== Memory global organization ====&lt;br /&gt;
&lt;br /&gt;
Global memory organization describe how addressing used in the dol allow to access the differents GameCube hardware composants. This is really interesting to understand the bus / interfaces access.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=4 | Memory mapping&lt;br /&gt;
|-&lt;br /&gt;
! Begin !! End !! Length !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || 0x017fffff || 24MB || Physical address of the RAM&lt;br /&gt;
|-&lt;br /&gt;
| 0x80000000 || 0x817fffff || 24MB || Logical address of the RAM, cached&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0000000 || 0xC17fffff || 24MB || Logical address of the RAM, not cached&lt;br /&gt;
|-&lt;br /&gt;
| 0xc8000000 || || 2MB || Embedded Framebuffer (EFB)&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC000000 || || || Hardware registers&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC000000 || || || CP - Command Processor&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC001000 || || || PE - Pixel Engine&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC002000 || || || VI - Video Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC003000 || || || PI - Processor Interface (Interrupt Interface)&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC004000 || || || MI - Memory Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC005000 || || || AI - Audio Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC006000 || || || DI - DVD Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC006400 || || || SI - Serial Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC006800 || || || EXI - External Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC006C00 || || || Streaming Interface&lt;br /&gt;
|-&lt;br /&gt;
| 0xCC008000 || || || GX FIFO (Graphic display lists)&lt;br /&gt;
|-&lt;br /&gt;
| 0xe0000000 || 0xe0003fff || 16k || L2 Cache&lt;br /&gt;
|-&lt;br /&gt;
| 0xfff00000 || || 1MB || IPL (mapped here at bootup)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Hardware registers length and composition is detailed [https://www.gc-forever.com/yagcd/chap5.html#sec5 here].&lt;br /&gt;
&lt;br /&gt;
==== User program area (dol) ====&lt;br /&gt;
As seen above the dol is mapped in the 24MB of RAM in virtual cached address space from 0x80003100 to 0x80700000 in production boards, and 0x81200000 in development boards.&lt;br /&gt;
&lt;br /&gt;
The first 0x3100 bytes contains system informations [https://www.gc-forever.com/yagcd/chap4.html#sec4.2.1 (&amp;quot;Dolphin OS Globals&amp;quot;)] with globals variables and also interrupts handlers specific to powerpc architecture. This informations are interesting when creating a dol loader resolving cross references inside the code.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! colspan=4 | Memory map&lt;br /&gt;
|-&lt;br /&gt;
! Adress !! Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x80003100 || Start of mapped sections .text (usually)&lt;br /&gt;
|-&lt;br /&gt;
| 0x80003140 || Entry point (early SDK v1.0 applications)&lt;br /&gt;
|-&lt;br /&gt;
| ? || Stack - After the last section with a default length of 0x10000 bytes&lt;br /&gt;
|-&lt;br /&gt;
| ? || ArenaLo - Bottom of the Area initialized by the OS (SDK) after the Stack&lt;br /&gt;
|-&lt;br /&gt;
| 0x81200000 || Load Address of the Apploader&lt;br /&gt;
|-&lt;br /&gt;
| 0x81300000 || Load Address of Bootrom/IPL&lt;br /&gt;
|-&lt;br /&gt;
| ? || ArenaHi - Top of the Area initialized by the OS (SDK) stuck to the FST&lt;br /&gt;
|-&lt;br /&gt;
| ? || FST - Variable length - Stuck to the end of virtual cached memory space.&lt;br /&gt;
|-&lt;br /&gt;
| 0x81800000 || End of the virtual cached memory space (24MB)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The Area contains the apploader and the bootrom/IPL. This area is allocated by the SDK api and is used to create and destroy Heaps in it.&lt;br /&gt;
&lt;br /&gt;
The dol can be mapped from 0x80003100 to 0x80700000 in production boards leaving 7.3 MB for the program.&lt;br /&gt;
&lt;br /&gt;
The FST is loaded in virtual memory deppending to it&#039;s position from the dol in the [[GCM (File format)|GCM/iso]]:&lt;br /&gt;
* FST_offset(iso) &amp;lt; dol_offset(iso) -&amp;gt; FST_virtual_address &amp;gt; dol_virtual_address&lt;br /&gt;
* FST_offset(iso) &amp;gt; dol_offset(iso) -&amp;gt; FST_virtual_address &amp;lt; dol_virtual_address&lt;br /&gt;
&lt;br /&gt;
==== Sections ====&lt;br /&gt;
&lt;br /&gt;
The PowerPc Embedded Application Binary Interface (EABI) describe 4 special registers:&lt;br /&gt;
* R1 is the stack pointer. We substract the space needed from it when entering in a function (Stack Frame). Terminal functions (thoose which don&#039;t call any functions) don&#039;t always need a frame.&lt;br /&gt;
* R2 is the read only Small Data Anchor __SDA2_BASE__ addressed with a signed short offset. It correspond to the .sdata2 (initialized constants) or .sbss2 (uninitialized constants).&lt;br /&gt;
* R13 is the Read / Write Small Data Anchor __SDA_BASE__ also addressed with a signed short offset. It correspond to the .sdata (initialized variables) or .sbss (uninitialized variables).&lt;br /&gt;
* R0 when used with an offset don&#039;t care about it&#039;s value. It allow to address 0x8000 first bytes of memory space and 0x7fff last bytes (signed short).&lt;br /&gt;
&lt;br /&gt;
As said above SDA are used with a signed short offset (-0x8000 +0x7FFF). When we reach the entry_point then R1 R2 and R13 are pointer in the Bootrom/IPL. The first function __init_registers initialize them for executing the dol and we can see that it&#039;s set to the beginning of some .data and .bss sections.&lt;br /&gt;
&lt;br /&gt;
We found this section originally build in the ELF32 file format:&lt;br /&gt;
* .ctors&lt;br /&gt;
* .dtors&lt;br /&gt;
* .rodata&lt;br /&gt;
* .data&lt;br /&gt;
* .bss&lt;br /&gt;
* .sdata (should correspond to -0x8000(R13) &lt;br /&gt;
* .sbss&lt;br /&gt;
* .sdata2 (should correspond to -0x8000(R2)&lt;br /&gt;
* .sbss2&lt;br /&gt;
* Followed by the stack (by default 0x10000 bytes length)&lt;br /&gt;
* Followed by ArenaLo initialized by the SDK&lt;br /&gt;
* Apploader loaded at address 81200000&lt;br /&gt;
* Bootrom/IPL loaded at address 81300000&lt;br /&gt;
* ArenaHi stuck to the FST&lt;br /&gt;
* FST stuck to the end of memory (81800000)&lt;br /&gt;
&lt;br /&gt;
The SDK offer two functions for handling Arena: OSAllocFromArenaHi &amp;amp; OSAllocFromArenaLo. But the main program initialize a number of Heaps in it and Create / Destroy them as it need.&lt;br /&gt;
&lt;br /&gt;
== DI - DVD Interface ==&lt;br /&gt;
The driver handling DVD accesses use the chip [https://wiibrew.org/wiki/Hardware/Disc_Drive#Hardware MN102] documented on [https://www.gc-forever.com/yagcd/chap5.html#sec5.7 yagcd]. The Hitmen team has programmed a plugin for it: [http://hitmen.c02.at/html/gc_releases.html MN102 IDA Pro].&lt;br /&gt;
&lt;br /&gt;
Some more documentation on [http://hitmen.c02.at/files/docs/gc/Ingenieria-Inversa-Understanding_WII_Gamecube_Optical_Disks.html disc reads].&lt;br /&gt;
&lt;br /&gt;
== EXI - External Interface ==&lt;br /&gt;
[https://github.com/dolphin-emu/dolphin/blob/master/Source/Core/Core/HW/EXI/EXI_Device.h Dolphin Emulator sources] show how EXI is used: MemoryCard, MaskROM, AD16, Microphone, Ethernet, AGP, EthernetXLink, EthernetTapServer.&lt;br /&gt;
&lt;br /&gt;
== SI - Serial Interface ==&lt;br /&gt;
[https://github.com/dolphin-emu/dolphin/blob/master/Source/Core/Core/HW/SI/SI_Device.h Dolphin Emulator sources] show devices using SI. We found this devices: GBA (Game Boy Advance), CONTROLLER, KEYBOARD, STEERING, TARUKONGA. The Serial Interface use the [https://n64brew.dev/wiki/Joybus_Protocol Joybus] protocol.&lt;br /&gt;
&lt;br /&gt;
== Softwares ==&lt;br /&gt;
&lt;br /&gt;
This softwares can handle dol files:&lt;br /&gt;
* [https://github.com/Virtual-World-RE/NeoGF/tree/main/doltool doltool.py] - Virtual World RE.&lt;br /&gt;
* [https://github.com/sup39/GeckoLoader GeckoLoader], - JoshuaMKW, sup32.&lt;br /&gt;
&lt;br /&gt;
[[Category:File format]]&lt;/div&gt;</summary>
		<author><name>Administrateur</name></author>
	</entry>
</feed>