<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://sgp.halamix2.pl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Halamix2</id>
	<title>Trickstart wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://sgp.halamix2.pl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Halamix2"/>
	<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/wiki/Special:Contributions/Halamix2"/>
	<updated>2026-04-28T17:34:05Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=SkScreen&amp;diff=188</id>
		<title>SkScreen</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=SkScreen&amp;diff=188"/>
		<updated>2026-01-10T22:57:18Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* fixes screen ratio for non 4:3 resolutions (replaces widescreen fix)&lt;br /&gt;
* Removes 2048px resolution limit&lt;br /&gt;
* Removes quality limit for Radeon cards in DirectX mode&lt;br /&gt;
* Fixes text tilt on higher resolutions (tilt is constant, based on original 640x480 tilt)&lt;br /&gt;
** text shadows aren&#039;t fixed yet&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Install [[StuntKit]] loader if you haven&#039;t already&lt;br /&gt;
* Download [https://github.com/Halamix2/StuntKit_modules/releases/ skScreen.dll] and place it in the same folder as &amp;lt;code&amp;gt;StuntGP.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you want to play the game in resolution greater than 2048px (e.g. 2560x1440), download [https://github.com/UCyborg/LegacyD3DResolutionHack/releases/ LegacyD3DResolutionHack], and unpack it in the same folder as &amp;lt;code&amp;gt;StuntGP.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; (if it doesn&#039;t exist, run &amp;lt;code&amp;gt;config.exe&amp;lt;/code&amp;gt;) with a text editor, edit lines &amp;lt;code&amp;gt;DISPLAYRESWIDTH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DISPLAYRESHEIGHT&amp;lt;/code&amp;gt; with requested resolution.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;StuntKit_D3D.exe&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;StuntKit_Glide.exe&amp;lt;/code&amp;gt;, depending on wanted graphics API. These programs will load all &amp;lt;code&amp;gt;sk*.dll&amp;lt;/code&amp;gt; modules and start the game.&lt;br /&gt;
[[Category:StuntKit]]&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Windows_10_compatibility&amp;diff=187</id>
		<title>Windows 10 compatibility</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Windows_10_compatibility&amp;diff=187"/>
		<updated>2026-01-10T22:45:33Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Windows 10 have some problems running this game, some ideas how to fix that below (still won&#039;t fix problem for everyone):&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Please try to run installer &#039;&#039;&#039;without&#039;&#039;&#039; administrator privileges&lt;br /&gt;
* The game won&#039;t run without administrator privileges if it was installed to &amp;lt;code&amp;gt;Program Files&amp;lt;/code&amp;gt;&lt;br /&gt;
** Game installer by default suggests using &amp;lt;code&amp;gt;C:\Team17\SGP&amp;lt;/code&amp;gt; and it&#039;s working reliably&lt;br /&gt;
&lt;br /&gt;
== First run ==&lt;br /&gt;
&lt;br /&gt;
=== First configuration ===&lt;br /&gt;
&lt;br /&gt;
* Run &amp;lt;code&amp;gt;configure.exe&amp;lt;/code&amp;gt;, try to run the game before you edit &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; manually&lt;br /&gt;
** If after running &amp;lt;code&amp;gt;configure.exe&amp;lt;/code&amp;gt; there should be &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; file in the game directory. If it&#039;s missing you may not have write access to the game directory.&lt;br /&gt;
*** It might be blocked by your antivirus&lt;br /&gt;
*** You can try running &amp;lt;code&amp;gt;config.exe&amp;lt;/code&amp;gt; and the game itself with administrator privileges (not recommended but I don&#039;t have better idea)&lt;br /&gt;
&lt;br /&gt;
=== Manual edit ===&lt;br /&gt;
&lt;br /&gt;
* Game might not start if there are spaces in the path&lt;br /&gt;
** if your folder name has spaces in it you could try editing game.cfg &amp;lt;code&amp;gt;GAMELOCATION = &amp;lt;your path&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;GAMELOCATION     = .&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit game resolution&lt;br /&gt;
** If you want to set non 4:3 resolution please use [[skScreen]] [[StuntKit]] module to fix screen ratio&lt;br /&gt;
** Game won&#039;t start if you set resolution to 2048x2048px and over&lt;br /&gt;
*** You can use [[skScreen]] [[StuntKit]] module to use greater resolutions&lt;br /&gt;
* Skip Team17 and Eon logo at the start&lt;br /&gt;
** Set &amp;lt;code&amp;gt;DISPLAY_BOOT_GFX&amp;lt;/code&amp;gt; to 0&lt;br /&gt;
&lt;br /&gt;
== Configuring Glide version ==&lt;br /&gt;
Glide version may run better on some PCs, but it requires sligthly more configuration:&lt;br /&gt;
&lt;br /&gt;
* Install &amp;lt;s&amp;gt;dgVoodo&amp;lt;/s&amp;gt; [https://www.zeus-software.com/downloads/nglide nGlide] and enter nGlide configure&lt;br /&gt;
** set &amp;lt;code&amp;gt;Video backend&amp;lt;/code&amp;gt; to DirectX if you wish to use it with DXWnd for playing in window&lt;br /&gt;
** Run &amp;lt;code&amp;gt;configure.exe&amp;lt;/code&amp;gt; and change Rendering from &amp;lt;code&amp;gt;DirectX&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;Glide&amp;lt;/code&amp;gt;&lt;br /&gt;
*** You&#039;ll have to manually edit &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; afterwards to your liking&lt;br /&gt;
&lt;br /&gt;
== Playing in Window ==&lt;br /&gt;
&lt;br /&gt;
* In [https://sourceforge.net/projects/dxwnd/ DXWnd] add new game, set &amp;lt;code&amp;gt;Path&amp;lt;/code&amp;gt; to the game directory and &amp;lt;code&amp;gt;Launch&amp;lt;/code&amp;gt; to the game exe path (either &amp;lt;code&amp;gt;StuntGP_D3D.exe&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;StuntGP_Glide.exe&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Potential fixes ==&lt;br /&gt;
* If the game loads but you can&#039;t exit to main menu  or some weird things happen check if you have folders &amp;lt;code&amp;gt;save\card00&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;save\card07&amp;lt;/code&amp;gt; present inside Stunt GP folder. If not you need to create them&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Music&amp;diff=186</id>
		<title>Music</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Music&amp;diff=186"/>
		<updated>2024-05-18T16:05:42Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
All music in-game is in 22kHz, but the engine supports 44kHz wav files, making it possible to buy songs in better quality and replace them in &amp;lt;code&amp;gt;sound\Music&amp;lt;/code&amp;gt; folder&lt;br /&gt;
&lt;br /&gt;
You can find [https://lynnemusic.com/retro-amiga-and-game-soundtracks-albums/ &amp;quot;Accelerator&amp;quot; album here]&lt;br /&gt;
&lt;br /&gt;
You can find [https://lynnemusic.com/divinorum-albums/ &amp;quot;Talisman&amp;quot; album here]&lt;br /&gt;
&lt;br /&gt;
You can find [https://marcpattison1.bandcamp.com/album/risen-from-the-ashes-2 &amp;quot;Risen from the Ashes&amp;quot; album here]&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!File name&lt;br /&gt;
!Song name in-game&lt;br /&gt;
!Original song name&lt;br /&gt;
!Album&lt;br /&gt;
|-&lt;br /&gt;
|Track2.wav&lt;br /&gt;
|Japan / Bank Job&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Track3.wav&lt;br /&gt;
|Roughdust Flats&lt;br /&gt;
|Bjørn Lynne – Palm Freak&lt;br /&gt;
|Accelerator&lt;br /&gt;
|-&lt;br /&gt;
|Track4.wav&lt;br /&gt;
|Wide Wall Chase&lt;br /&gt;
|Bjørn Lynne – The Hustler&lt;br /&gt;
|Accelerator&lt;br /&gt;
|-&lt;br /&gt;
|Track5.wav&lt;br /&gt;
|Skytop Speed Circuit&lt;br /&gt;
|Bjørn Lynne – Alley Kat&lt;br /&gt;
|Accelerator&lt;br /&gt;
|-&lt;br /&gt;
|Track6.wav&lt;br /&gt;
|Snakestorm&lt;br /&gt;
|Bjørn Lynne – Turbo Grid&lt;br /&gt;
|Accelerator&lt;br /&gt;
|-&lt;br /&gt;
|Track7.wav&lt;br /&gt;
|England / The Loopback&lt;br /&gt;
|Marc Pattison – Space Jam ?&lt;br /&gt;
|Risen from the Ashes&lt;br /&gt;
|-&lt;br /&gt;
|Track8.wav&lt;br /&gt;
|Flying Finish&lt;br /&gt;
|Bjørn Lynne – Space Precinct&lt;br /&gt;
|Talisman&lt;br /&gt;
|-&lt;br /&gt;
|Track9.wav&lt;br /&gt;
|France / The Chronozone&lt;br /&gt;
|Marc Pattison – Racecar&lt;br /&gt;
|The Bionic Man&lt;br /&gt;
|-&lt;br /&gt;
|Track10.wav&lt;br /&gt;
|Enter Your Name&lt;br /&gt;
|Bjørn Lynne – Road Hog&lt;br /&gt;
|Accelerator&lt;br /&gt;
|-&lt;br /&gt;
|Track11.wav&lt;br /&gt;
|Select Track&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Track12.wav&lt;br /&gt;
|Main Menu&lt;br /&gt;
|Bjørn Lynne – Monkey See Monkey Do&lt;br /&gt;
|Accelerator&lt;br /&gt;
|-&lt;br /&gt;
|Track13.wav&lt;br /&gt;
|Arcade Results&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Track14.wav&lt;br /&gt;
|Records&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Track15.wav&lt;br /&gt;
|Select Vehicle&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Track20.wav&lt;br /&gt;
|Game Over&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Track21.wav&lt;br /&gt;
|1st, 2nd, 3rd Place&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Track22.wav&lt;br /&gt;
|4th, 5th, 6th Place&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|Track23.wav&lt;br /&gt;
|Race Results&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Versions&amp;diff=185</id>
		<title>Versions</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Versions&amp;diff=185"/>
		<updated>2023-01-01T14:56:42Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: Created page with &amp;quot;List of known versions (and SHA256 stuntgp_d3d.exe hash for comparison)  * International (???) * Polish (??)  === Unofficial ===  * Czech - a patch for international version by POLIS &amp;amp; FCBfan&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;List of known versions (and SHA256 stuntgp_d3d.exe hash for comparison)&lt;br /&gt;
&lt;br /&gt;
* International (???)&lt;br /&gt;
* Polish (??)&lt;br /&gt;
&lt;br /&gt;
=== Unofficial ===&lt;br /&gt;
&lt;br /&gt;
* Czech - a patch for international version by POLIS &amp;amp; FCBfan&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=184</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=184"/>
		<updated>2022-11-16T21:16:37Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Transform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than &amp;lt;code&amp;gt;1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** There are mentions of unused versions &amp;lt;code&amp;gt;1.63&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features PMD files in versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; for versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;; for &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt; and later &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|AI track points (same as vertex)&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|AI track meta&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|Exists only in PMD V1.7 and later: track metadata&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be material power effect&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be material binary mask, no alpha, with alpha, blend, multiply and other effect, power regulated in 0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints, set to 0 in all models, might be parent transform?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long, OR might have varying size dependent on type?&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!type&lt;br /&gt;
!size&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0x50&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x90&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x40&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=183</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=183"/>
		<updated>2022-11-16T21:14:23Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Block 20 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than &amp;lt;code&amp;gt;1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** There are mentions of unused versions &amp;lt;code&amp;gt;1.63&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features PMD files in versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; for versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;; for &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt; and later &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|AI track points (same as vertex)&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|AI track meta&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|Exists only in PMD V1.7 and later: track metadata&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be material power effect&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be material binary mask, no alpha, with alpha, blend, multiply and other effect, power regulated in 0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints, set to 0 in all models&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long, OR might have varying size dependent on type?&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!type&lt;br /&gt;
!size&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|0x50&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|0x90&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|0x40&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=182</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=182"/>
		<updated>2022-11-16T21:12:30Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Polygon */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than &amp;lt;code&amp;gt;1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** There are mentions of unused versions &amp;lt;code&amp;gt;1.63&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features PMD files in versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; for versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;; for &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt; and later &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|AI track points (same as vertex)&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|AI track meta&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|Exists only in PMD V1.7 and later: track metadata&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be material power effect&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be material binary mask, no alpha, with alpha, blend, multiply and other effect, power regulated in 0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints, set to 0 in all models&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Texture_format&amp;diff=181</id>
		<title>Texture format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Texture_format&amp;diff=181"/>
		<updated>2022-10-26T17:14:31Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Engine supports maximum size of 256x256 pixels. On Windows textures use .pc extension, on Dreamcast they use .DC extension, and on Playstation2 they use .ps2 extension&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Magic, &amp;lt;code&amp;gt;T54 4D 21 1A&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;TM!\x1A&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x2&lt;br /&gt;
|version, number 2-5&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|0x2&lt;br /&gt;
|width&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x2&lt;br /&gt;
|height&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|0x2&lt;br /&gt;
|first pixel&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|??&lt;br /&gt;
|Compressed data, until EOF&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* compressed image data starts at 0xA, see pc_unpack.py for implementation details&lt;br /&gt;
&lt;br /&gt;
=== Version 2 (PS2) ===&lt;br /&gt;
&lt;br /&gt;
* Paletted image. Instead of first uncompressed pixel at 0xA it has an unsigned short with number of colours in a palette, then a list of colours (ARGB, 4 bytes per colour), and an uncompressed paletted image (1 byte per pixel)&lt;br /&gt;
&lt;br /&gt;
=== Version 3 (PC) ===&lt;br /&gt;
&lt;br /&gt;
* Each pixel is written on 2 bytes, little endian, after converting to big endian the algorithm looks like this:&lt;br /&gt;
* If the 15th bit is 1, then stream data as long as each compressed pixel 15th bit is set&lt;br /&gt;
** Else&lt;br /&gt;
*** If 14th bit is set copy previously unpacked data&lt;br /&gt;
**** bits 11-13 - number of pixels to repeat - 2, so if this number is set to 7, then repeat 9 pixels, minimum 2 pixels&lt;br /&gt;
**** bits 0-10 - offset - back head for copying that many pixels&lt;br /&gt;
**** else - add transparent pixels&lt;br /&gt;
***** bits 0-13 - how many transparent pixels to add&lt;br /&gt;
* &amp;lt;code&amp;gt;00 00&amp;lt;/code&amp;gt; marks the end of compressed data&lt;br /&gt;
&lt;br /&gt;
=== Version 4 (DC) ===&lt;br /&gt;
&lt;br /&gt;
* Same as version 3, but the resulting files are swizzled for Dreamcast GPU, so untwiddling is needed&lt;br /&gt;
&lt;br /&gt;
=== Version 5 (PS2) ===&lt;br /&gt;
&lt;br /&gt;
* Same as version 3, with red and blue channels swapped&lt;br /&gt;
&lt;br /&gt;
=== Unpacked image data (versions 3-5) ===&lt;br /&gt;
Uncompressed image data uses 2 bytes for each pixel, in A1 R5 G5 B5 format. In some places game uses additional file with greyscale alpha channel to compensate for 1bit alpha (5 bits instead of 1).&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=File_archive&amp;diff=180</id>
		<title>File archive</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=File_archive&amp;diff=180"/>
		<updated>2022-10-23T21:24:15Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.wad file format is exactly the same as [https://worms2d.info/Graphics_directory Worms .dir format], only extension is different.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Magic, &amp;lt;code&amp;gt;44 49 52 1A&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;DIR\x1A&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|File size&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Directory address&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|???&lt;br /&gt;
|Files data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* file data spans up to the &amp;quot;address of directory&amp;quot;. These two points are optional, but they provide a nice alignment:&lt;br /&gt;
** There is &amp;lt;code&amp;gt;1A 00&amp;lt;/code&amp;gt; at the end of each file&lt;br /&gt;
** There may be &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; padding after that, so the next file/section starts at offset aligned to 4 bytes&lt;br /&gt;
&lt;br /&gt;
Following offsets are counted from &amp;quot;Directory address&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Magic, &amp;lt;code&amp;gt;0A 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x1000&lt;br /&gt;
|[[File archive#Hash table|Hash table]], 1024 4-byte entries&lt;br /&gt;
|-&lt;br /&gt;
|0x1004&lt;br /&gt;
|???&lt;br /&gt;
|File descriptors&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hash table ==&lt;br /&gt;
&lt;br /&gt;
* each entry value + &amp;quot;address of directory&amp;quot; is a pointer to corresponding &#039;&#039;file descriptor&#039;&#039;&lt;br /&gt;
* each position is calculated, hash function is available at https://worms2d.info/Graphics_directory&lt;br /&gt;
&lt;br /&gt;
each &#039;&#039;&#039;file descriptor&#039;&#039;&#039; have following structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Next hash, by default is set to &amp;lt;code&amp;gt;00 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|File data offset in archive&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|File size&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Filename with path&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== File descriptors ====&lt;br /&gt;
* if two files have the same hash, then hash table points to first file, which have &amp;quot;next hash&amp;quot; to another file descriptor with the same hash. If there is no collision then it&#039;s 0.&lt;br /&gt;
* filename is 4 bytes aligned, terminated by 0x00 (and padded with 0x00 to 4 bytes)&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=179</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=179"/>
		<updated>2022-10-01T19:56:56Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://discord.gg/ykzAWnA https://discord.com/api/guilds/749260704447463495/widget.png?style=banner3&amp;amp;dummy=file.png]&lt;br /&gt;
&lt;br /&gt;
*[https://web.archive.org/web/20080722085717/stuntgp.team17.com/frames.html Original Stunt GP website]&lt;br /&gt;
&lt;br /&gt;
*[[Windows 10 compatibility]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Game engine limitations]]&lt;br /&gt;
*[[Music]]&lt;br /&gt;
*[[Misc]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Controls]]&lt;br /&gt;
*[[Cars]]&lt;br /&gt;
*[[Tracks]]&lt;br /&gt;
*[[Stunts]]&lt;br /&gt;
*Game modes&lt;br /&gt;
**[[Arcade]]&lt;br /&gt;
**[[Time Trial]]&lt;br /&gt;
**[[Championship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====File formats used by the game====&lt;br /&gt;
*[https://github.com/StuntKit/stunt_gp_formats File format scripts]&lt;br /&gt;
*[[File archive]] (.wad)&lt;br /&gt;
*[[Texture format]] (.pc/.dc/.ps)&lt;br /&gt;
*[[3D model format]] (.pmd)&lt;br /&gt;
*[[config.cfg]]&lt;br /&gt;
*[[Save file]] (setup.bin)&lt;br /&gt;
*[[Replay file]] (ghostXX.rpl/.bin)&lt;br /&gt;
&lt;br /&gt;
====Speedrunning====&lt;br /&gt;
*[https://github.com/hoXyy/Livesplit.Autosplitters/blob/master/LiveSplit.StuntGP.asl Autosplitter for LiveSplit]&lt;br /&gt;
*[https://www.speedrun.com/stuntgp Stunt GP on speedrun.com]&lt;br /&gt;
&lt;br /&gt;
==StuntKit==&lt;br /&gt;
[[File:SkScreen example.png|thumb|alt=|skScreen on 16:9 screen, with 2560x1440 resolution]][[StuntKit]] allows to load .dll modules that can fix or alter the game &lt;br /&gt;
&lt;br /&gt;
List of the modules: &lt;br /&gt;
&lt;br /&gt;
*[[skScreen]] - adds widescreen, hi-resolution support &amp;amp; various screen improvements&lt;br /&gt;
*[[skFreeze]] - removes freeze every 7 minutes&lt;br /&gt;
*[[skRemap]] - allows for key remapping&lt;br /&gt;
*skDebug - logs DirectX error messages to &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=178</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=178"/>
		<updated>2022-09-15T22:01:08Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://discord.gg/ykzAWnA https://discord.com/api/guilds/749260704447463495/widget.png?style=banner3&amp;amp;dummy=file.png]&lt;br /&gt;
&lt;br /&gt;
*[https://web.archive.org/web/20080722085717/stuntgp.team17.com/frames.html Original Stunt GP website]&lt;br /&gt;
&lt;br /&gt;
*[[Windows 10 compatibility]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Game engine limitations]]&lt;br /&gt;
*[[Music]]&lt;br /&gt;
*[[Misc]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Controls]]&lt;br /&gt;
*[[Cars]]&lt;br /&gt;
*[[Tracks]]&lt;br /&gt;
*[[Stunts]]&lt;br /&gt;
*Game modes&lt;br /&gt;
**[[Arcade]]&lt;br /&gt;
**[[Time Trial]]&lt;br /&gt;
**[[Championship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====File formats used by the game====&lt;br /&gt;
*[https://github.com/Halamix2/stunt_gp_formats File format scripts]&lt;br /&gt;
*[[File archive]] (.wad)&lt;br /&gt;
*[[Texture format]] (.pc/.dc/.ps)&lt;br /&gt;
*[[3D model format]] (.pmd)&lt;br /&gt;
*[[config.cfg]]&lt;br /&gt;
*[[Save file]] (setup.bin)&lt;br /&gt;
*[[Replay file]] (ghostXX.rpl/.bin)&lt;br /&gt;
&lt;br /&gt;
====Speedrunning====&lt;br /&gt;
*[https://github.com/hoXyy/Livesplit.Autosplitters/blob/master/LiveSplit.StuntGP.asl Autosplitter for LiveSplit]&lt;br /&gt;
*[https://www.speedrun.com/stuntgp Stunt GP on speedrun.com]&lt;br /&gt;
&lt;br /&gt;
==StuntKit==&lt;br /&gt;
[[File:SkScreen example.png|thumb|alt=|skScreen on 16:9 screen, with 2560x1440 resolution]][[StuntKit]] allows to load .dll modules that can fix or alter the game &lt;br /&gt;
&lt;br /&gt;
List of the modules: &lt;br /&gt;
&lt;br /&gt;
*[[skScreen]] - adds widescreen, hi-resolution support &amp;amp; various screen improvements&lt;br /&gt;
*[[skFreeze]] - removes freeze every 7 minutes&lt;br /&gt;
*[[skRemap]] - allows for key remapping&lt;br /&gt;
*skDebug - logs DirectX error messages to &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=177</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=177"/>
		<updated>2022-09-15T21:35:15Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://discord.gg/ykzAWnA https://discord.com/api/guilds/749260704447463495/widget.png?style=banner3&amp;amp;dummy=file.png]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[https://web.archive.org/web/20080722085717/stuntgp.team17.com/frames.html Original Stunt GP website]&lt;br /&gt;
&lt;br /&gt;
*[[Windows 10 compatibility]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Game engine limitations]]&lt;br /&gt;
*[[Music]]&lt;br /&gt;
*[[Misc]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Controls]]&lt;br /&gt;
*[[Cars]]&lt;br /&gt;
*[[Tracks]]&lt;br /&gt;
*[[Stunts]]&lt;br /&gt;
*Game modes&lt;br /&gt;
**[[Arcade]]&lt;br /&gt;
**[[Time Trial]]&lt;br /&gt;
**[[Championship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====File formats used by the game====&lt;br /&gt;
*[https://github.com/Halamix2/stunt_gp_formats File format scripts]&lt;br /&gt;
*[[File archive]] (.wad)&lt;br /&gt;
*[[Texture format]] (.pc/.dc/.ps)&lt;br /&gt;
*[[3D model format]] (.pmd)&lt;br /&gt;
*[[config.cfg]]&lt;br /&gt;
*[[Save file]] (setup.bin)&lt;br /&gt;
*[[Replay file]] (ghostXX.rpl/.bin)&lt;br /&gt;
&lt;br /&gt;
====Speedrunning====&lt;br /&gt;
*[https://github.com/hoXyy/Livesplit.Autosplitters/blob/master/LiveSplit.StuntGP.asl Autosplitter for LiveSplit]&lt;br /&gt;
*[https://www.speedrun.com/stuntgp Stunt GP on speedrun.com]&lt;br /&gt;
&lt;br /&gt;
==StuntKit==&lt;br /&gt;
[[File:SkScreen example.png|thumb|alt=|skScreen on 16:9 screen, with 2560x1440 resolution]][[StuntKit]] allows to load .dll modules that can fix or alter the game &lt;br /&gt;
&lt;br /&gt;
List of the modules: &lt;br /&gt;
&lt;br /&gt;
*[[skScreen]] - adds widescreen, hi-resolution support &amp;amp; various screen improvements&lt;br /&gt;
*[[skFreeze]] - removes freeze every 7 minutes&lt;br /&gt;
*[[skRemap]] - allows for key remapping&lt;br /&gt;
*skDebug - logs DirectX error messages to &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Stunts&amp;diff=176</id>
		<title>Stunts</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Stunts&amp;diff=176"/>
		<updated>2022-09-02T14:05:49Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!Id&lt;br /&gt;
!Name&lt;br /&gt;
!PL&lt;br /&gt;
!Pionts&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_backflip_360&lt;br /&gt;
|BACK 360&lt;br /&gt;
|SALTO W TYŁ 360&lt;br /&gt;
|250&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_backflip_720&lt;br /&gt;
|BACK 720&lt;br /&gt;
|SALTO W TYŁ 720&lt;br /&gt;
|750&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_backflip_1080&lt;br /&gt;
|SUPER BACK FLIP&lt;br /&gt;
|SUPER SALTO W TYŁ&lt;br /&gt;
|2500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_frontflip_360&lt;br /&gt;
|FRONT 360&lt;br /&gt;
|SALTO 360&lt;br /&gt;
|250&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_frontflip_720&lt;br /&gt;
|FRONT 720&lt;br /&gt;
|SALTO 720&lt;br /&gt;
|750&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_frontflip_1080&lt;br /&gt;
|SUPER FRONT FLIP&lt;br /&gt;
|SUPER SALTO&lt;br /&gt;
|3500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistleft_360&lt;br /&gt;
|360 LEFT&lt;br /&gt;
|OBRÓT W LEWO 360&lt;br /&gt;
|500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistleft_720&lt;br /&gt;
|720 LEFT&lt;br /&gt;
|OBRÓT W LEWO 720&lt;br /&gt;
|1250&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistleft_1080&lt;br /&gt;
|SUPER SPIN LEFT&lt;br /&gt;
|SUPER OBRÓT W LEWO&lt;br /&gt;
|5000&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistright_360&lt;br /&gt;
|360 RIGHT&lt;br /&gt;
|OBRÓT W PRAWO 360&lt;br /&gt;
|500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistright_720&lt;br /&gt;
|720 RIGHT&lt;br /&gt;
|OBRÓT W PRAWO 720&lt;br /&gt;
|1250&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistright_1080&lt;br /&gt;
|SUPER SPIN RIGHT&lt;br /&gt;
|SUPER OBRÓT W PRAWO&lt;br /&gt;
|5000&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_loop&lt;br /&gt;
|SUPER LOOPER&lt;br /&gt;
|SUPER PĘTLA&lt;br /&gt;
|1750&lt;br /&gt;
|Activates on a loop, no battery recharge&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_2wheel_front&lt;br /&gt;
|HANDSTAND!&lt;br /&gt;
|STÓJKA!&lt;br /&gt;
|2500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_2wheel_rear&lt;br /&gt;
|WHEELIE!&lt;br /&gt;
|SRÓBA!&lt;br /&gt;
|2500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_2wheel_left&lt;br /&gt;
|SIDEWINDER LEFT&lt;br /&gt;
|STRZAŁA W LEWO&lt;br /&gt;
|200&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_2wheel_right&lt;br /&gt;
|SIDEWINDER RIGHT&lt;br /&gt;
|STRZAŁA W PRAWO&lt;br /&gt;
|200&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_barrel_roll&lt;br /&gt;
|BARREL ROLL!&lt;br /&gt;
|BECZKA!&lt;br /&gt;
|1500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_powerslide&lt;br /&gt;
|POWERSLIDE&lt;br /&gt;
|MEGAŚLIZG&lt;br /&gt;
|750&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_slide&lt;br /&gt;
|SLIDE&lt;br /&gt;
|ŚLIZG&lt;br /&gt;
|150&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_grind&lt;br /&gt;
|GRIND&lt;br /&gt;
|TARKA&lt;br /&gt;
|350&lt;br /&gt;
|Grind alongside the curb&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_hop&lt;br /&gt;
|HOP&lt;br /&gt;
|HOPA&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_air&lt;br /&gt;
|NICE AIR!&lt;br /&gt;
|LOT!&lt;br /&gt;
|100,125,250,500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_bigair&lt;br /&gt;
|BIG AIR!&lt;br /&gt;
|ODLOT!&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_blastoff&lt;br /&gt;
|BLAST OFF!&lt;br /&gt;
|RAKIETA!&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_nosedown&lt;br /&gt;
|NOSE DOWN&lt;br /&gt;
|METEOR&lt;br /&gt;
|2500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_noseup&lt;br /&gt;
|FLAT ATTACK&lt;br /&gt;
|PATELNIA&lt;br /&gt;
|2500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistleft&lt;br /&gt;
|not used&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistright&lt;br /&gt;
|not used&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_twistcombo&lt;br /&gt;
|TWIST COMBO&lt;br /&gt;
|TWISTER COMBO&lt;br /&gt;
|5000&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_freestyle&lt;br /&gt;
|FREESTYLE&lt;br /&gt;
|IMPROWIZACJA&lt;br /&gt;
|500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_freestylecombo&lt;br /&gt;
|FREESTYLE COMBO&lt;br /&gt;
|MEGAIMPROWIZACJA&lt;br /&gt;
|750&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_stream&lt;br /&gt;
|STREAM STYLE&lt;br /&gt;
|KORYTAZ POWIETRZNY&lt;br /&gt;
|200&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_longstream&lt;br /&gt;
|SUPER STREAM&lt;br /&gt;
|DŁUGI KORYTAZ POWIETRZNY&lt;br /&gt;
|500&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_flip&lt;br /&gt;
|FLIP&lt;br /&gt;
|PRZEWRÓT&lt;br /&gt;
|2500?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_halftwistleft&lt;br /&gt;
|HALF TWIST LEFT&lt;br /&gt;
|LEWY PÓŁ TWISTER&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_halftwistright&lt;br /&gt;
|HALF TWIST RIGHT&lt;br /&gt;
|PRAWY PÓŁ TWISTER&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_burnrubber&lt;br /&gt;
|BURNING RUBBER&lt;br /&gt;
|DYM Z KÓŁ!&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|text_stunt_smartstart&lt;br /&gt;
|NOT USED&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Possibly original name for the trickstart?&lt;br /&gt;
|-&lt;br /&gt;
|text_trick_start&lt;br /&gt;
|TRICK START!&lt;br /&gt;
|TRIK START!&lt;br /&gt;
|250&lt;br /&gt;
|Technically not listed as a stunt in game files; repeatedly press gas before the race begins, grants free boost&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=175</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=175"/>
		<updated>2022-08-28T22:29:54Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Transform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than &amp;lt;code&amp;gt;1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** There are mentions of unused versions &amp;lt;code&amp;gt;1.63&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features PMD files in versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; for versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;; for &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt; and later &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|AI track points (same as vertex)&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|AI track meta&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|Exists only in PMD V1.7 and later: track metadata&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints, set to 0 in all models&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=174</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=174"/>
		<updated>2022-08-22T12:50:15Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Tracks|Tracks&lt;br /&gt;
** Cars|Cars&lt;br /&gt;
* Game modes&lt;br /&gt;
** Arcade|Arcade&lt;br /&gt;
** Time Trial|Time Trial&lt;br /&gt;
** Championship|Championship&lt;br /&gt;
* StuntKit&lt;br /&gt;
** StuntKit|StuntKit&lt;br /&gt;
*** SkScreen|skScreen&lt;br /&gt;
** SkFreeze|skFreeze&lt;br /&gt;
** SkRemap|skRemap&lt;br /&gt;
&lt;br /&gt;
* File formats&lt;br /&gt;
** File archive|File archive&lt;br /&gt;
** Texture format|Texture format&lt;br /&gt;
** 3D model format|3D model format&lt;br /&gt;
* wiki&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=173</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=173"/>
		<updated>2022-08-22T12:49:04Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Tracks|Tracks&lt;br /&gt;
** Cars|Cars&lt;br /&gt;
* Game modes&lt;br /&gt;
** Arcade|Arcade&lt;br /&gt;
** Time Trial|Time Trial&lt;br /&gt;
** Championship|Championship&lt;br /&gt;
** StuntKit&lt;br /&gt;
** StuntKit|StuntKit&lt;br /&gt;
*** SkScreen|skScreen&lt;br /&gt;
** SkFreeze|skFreeze&lt;br /&gt;
** SkRemap|skRemap&lt;br /&gt;
&lt;br /&gt;
* File formats&lt;br /&gt;
** File archive|File archive&lt;br /&gt;
** Texture format|Texture format&lt;br /&gt;
** 3D model format|3D model format&lt;br /&gt;
* wiki&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=172</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=172"/>
		<updated>2022-08-22T12:48:48Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Tracks|Tracks&lt;br /&gt;
** Cars|Cars&lt;br /&gt;
* Game modes&lt;br /&gt;
** Arcade|Arcade&lt;br /&gt;
** Time Trial|Time Trial&lt;br /&gt;
** Championship|Championship&lt;br /&gt;
* StuntKit&lt;br /&gt;
** StuntKit|StuntKit&lt;br /&gt;
*** SkScreen|skScreen&lt;br /&gt;
** SkFreeze|skFreeze&lt;br /&gt;
** SkRemap|skRemap&lt;br /&gt;
&lt;br /&gt;
* File formats&lt;br /&gt;
** File archive|File archive&lt;br /&gt;
** Texture format|Texture format&lt;br /&gt;
** 3D model format|3D model format&lt;br /&gt;
* wiki&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=171</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=171"/>
		<updated>2022-08-22T12:48:39Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Tracks|Tracks&lt;br /&gt;
** Cars|Cars&lt;br /&gt;
* Game modes&lt;br /&gt;
** Arcade|Arcade&lt;br /&gt;
** Time Trial|Time Trial&lt;br /&gt;
** Championship|Championship&lt;br /&gt;
* StuntKit|StuntKit&lt;br /&gt;
** StuntKit|StuntKit&lt;br /&gt;
** SkScreen|skScreen&lt;br /&gt;
** SkFreeze|skFreeze&lt;br /&gt;
** SkRemap|skRemap&lt;br /&gt;
&lt;br /&gt;
* File formats&lt;br /&gt;
** File archive|File archive&lt;br /&gt;
** Texture format|Texture format&lt;br /&gt;
** 3D model format|3D model format&lt;br /&gt;
* wiki&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=170</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=MediaWiki:Sidebar&amp;diff=170"/>
		<updated>2022-08-22T12:48:23Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Tracks|Tracks&lt;br /&gt;
** Cars|Cars&lt;br /&gt;
* Game modes&lt;br /&gt;
** Arcade|Arcade&lt;br /&gt;
** Time Trial|Time Trial&lt;br /&gt;
** Championship|Championship&lt;br /&gt;
* StuntKit&lt;br /&gt;
** StuntKit|StuntKit&lt;br /&gt;
** SkScreen|skScreen&lt;br /&gt;
** SkFreeze|skFreeze&lt;br /&gt;
** SkRemap|skRemap&lt;br /&gt;
&lt;br /&gt;
* File formats&lt;br /&gt;
** File archive|File archive&lt;br /&gt;
** Texture format|Texture format&lt;br /&gt;
** 3D model format|3D model format&lt;br /&gt;
* wiki&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=File_archive&amp;diff=169</id>
		<title>File archive</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=File_archive&amp;diff=169"/>
		<updated>2022-08-22T12:46:32Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.wad file format is exactly the same as [https://worms2d.info/Graphics_directory Worms .dir format], only extension is different.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Magic, &amp;lt;code&amp;gt;44 49 52 1A&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;DIR\x1A&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|File size&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Directory address&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|???&lt;br /&gt;
|Files data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* file data spans up to the &amp;quot;address of directory&amp;quot;. These two points are optional, but they provide a nice alignment:&lt;br /&gt;
** There is &amp;lt;code&amp;gt;1A 00&amp;lt;/code&amp;gt; at the end of each file&lt;br /&gt;
** There may be &amp;lt;code&amp;gt;00&amp;lt;/code&amp;gt; padding after that, so the next file/section starts at offset aligned to 4 bytes&lt;br /&gt;
&lt;br /&gt;
Following offsets are counted from &amp;quot;Directory address&amp;quot;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Magic, &amp;lt;code&amp;gt;0A 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x1000&lt;br /&gt;
|[[File archive#Hash table|Hash table]], 1024 4-byte entries&lt;br /&gt;
|-&lt;br /&gt;
|0x1004&lt;br /&gt;
|???&lt;br /&gt;
|File descriptors&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Hash table ==&lt;br /&gt;
&lt;br /&gt;
* each entry value + &amp;quot;address of directory&amp;quot; is a pointer to corresponding &#039;&#039;file descriptor&#039;&#039;&lt;br /&gt;
* each position is calculated, hash function is available at &amp;lt;nowiki&amp;gt;https://worms2d.info/Graphics_directory&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
each &#039;&#039;&#039;file descriptor&#039;&#039;&#039; have following structure:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Next hash, by default is set to &amp;lt;code&amp;gt;00 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|File data offset in archive&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|File size&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Filename with path&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== File descriptors ====&lt;br /&gt;
* if two files have the same hash, then hash table points to first file, which have &amp;quot;next hash&amp;quot; to another file descriptor with the same hash. If there is no collision then it&#039;s 0.&lt;br /&gt;
* filename is 4 bytes aligned, terminated by 0x00 (and padded with 0x00 to 4 bytes)&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=168</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=168"/>
		<updated>2022-07-31T17:51:24Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Offsets table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than &amp;lt;code&amp;gt;1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** There are mentions of unused versions &amp;lt;code&amp;gt;1.63&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features PMD files in versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; for versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;; for &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt; and later &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|AI track points (same as vertex)&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|AI track meta&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|Exists only in PMD V1.7 and later: track metadata&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Unused&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=167</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=167"/>
		<updated>2022-07-31T17:50:06Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Offsets table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than &amp;lt;code&amp;gt;1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** There are mentions of unused versions &amp;lt;code&amp;gt;1.63&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features PMD files in versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; for versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;; for &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt; and later &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|List of points, looks like AI curve&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|Exists only in PMD V1.7 and later: track metadata&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=166</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=166"/>
		<updated>2022-07-03T13:37:56Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Offsets table */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than &amp;lt;code&amp;gt;1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** There are mentions of unused versions &amp;lt;code&amp;gt;1.63&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features PMD files in versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; for versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;; for &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt; and later &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|List of points, looks like AI curve&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|Exists only in PMD V1.7 and later&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=165</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=165"/>
		<updated>2022-07-03T13:36:48Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: support for 1.6X&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than &amp;lt;code&amp;gt;1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** There are mentions of unused versions &amp;lt;code&amp;gt;1.63&amp;lt;/code&amp;gt; &amp;amp; &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features PMD files in versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is equal to &amp;lt;code&amp;gt;32&amp;lt;/code&amp;gt; for versions &amp;lt;code&amp;gt;1.6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.61&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;1.62&amp;lt;/code&amp;gt;; for &amp;lt;code&amp;gt;1.7&amp;lt;/code&amp;gt; and later &amp;lt;code&amp;gt;block_count&amp;lt;/code&amp;gt; is set to &amp;lt;code&amp;gt;37&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|4*block_count&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|List of points, looks like AI curve&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Cars&amp;diff=164</id>
		<title>Cars</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Cars&amp;diff=164"/>
		<updated>2022-07-02T14:30:04Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polish names were added temporarily, it helps me with digging in my version&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!Name&lt;br /&gt;
!Name in PL&lt;br /&gt;
!Group&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Mean Streak&lt;br /&gt;
|Łobuz&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|The Hustler&lt;br /&gt;
|Wykidajło&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Twin Eagle&lt;br /&gt;
|Orzeł&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Sky Hawk&lt;br /&gt;
|Jastrząb&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|The Phantom&lt;br /&gt;
|Duch&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Road Hog&lt;br /&gt;
|Dzik&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|Dune Rat&lt;br /&gt;
|Skoczek&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Nitro Lightnin&#039;&lt;br /&gt;
|Błyskawica&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|Alley Cat&lt;br /&gt;
|Kocur&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Sand Shark&lt;br /&gt;
|Rekin&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|The Brute&lt;br /&gt;
|Twardziel&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|Wild Dart&lt;br /&gt;
|Strzała&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|Raging Bull&lt;br /&gt;
|Wściekły Byk&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|14&lt;br /&gt;
|Flying Mantis&lt;br /&gt;
|Modliszka&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|Stunt Monkey&lt;br /&gt;
|Małpa&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|Inferno&lt;br /&gt;
|Demon&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|Forkster&lt;br /&gt;
|Widelec&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Unlocked in Arcade mode or by finishing 2nd in 21st race of Championship&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|Worms Mobile&lt;br /&gt;
|Autoworm&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Unlocked in Championship mode or by getting 30000 points in stunts mode&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|Formula 17&lt;br /&gt;
|Formuła 17&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Get one gold time in Time Trial&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|Team Machine&lt;br /&gt;
|Team&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Get all gold times in Time Trial&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|Stunt Bowl Special&lt;br /&gt;
|Kaskader&lt;br /&gt;
|&lt;br /&gt;
|Used only in Stunts mode, it&#039;s Sky Hawk with modified paramters&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Group&lt;br /&gt;
!Group in PL&lt;br /&gt;
!Type&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|Dzikie resory&lt;br /&gt;
|Off Roader&lt;br /&gt;
|Green&lt;br /&gt;
|-&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|Pionierzy przestworzy&lt;br /&gt;
|Stunt Car&lt;br /&gt;
|Blue&lt;br /&gt;
|-&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|Demony szybkości&lt;br /&gt;
|Racer&lt;br /&gt;
|Red&lt;br /&gt;
|-&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Specjalności Team&#039;u&lt;br /&gt;
|Prototype&lt;br /&gt;
|Orange&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Cars&amp;diff=163</id>
		<title>Cars</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Cars&amp;diff=163"/>
		<updated>2022-07-02T14:27:16Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: typos&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polish names were added temporarily, it helps me with digging in my version&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; &lt;br /&gt;
|-&lt;br /&gt;
!ID&lt;br /&gt;
!Name&lt;br /&gt;
!Name in PL&lt;br /&gt;
!Group&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Mean Streak&lt;br /&gt;
|Łobuz&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|The Hustler&lt;br /&gt;
|Wykidajło&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Twin Eagle&lt;br /&gt;
|Orzeł&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Sky Hawk&lt;br /&gt;
|Jastrząb&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|The Phantom&lt;br /&gt;
|Duch&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Road Hog&lt;br /&gt;
|Dzik&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|Dune Rat&lt;br /&gt;
|Skoczek&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Nitro Lightnin&amp;lt;nowiki&amp;gt;&#039;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
|Błyskawica&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|Alley Cat&lt;br /&gt;
|Kocur&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Sand Shark&lt;br /&gt;
|Rekin&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|The Brute&lt;br /&gt;
|Twardziel&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|Wild Dart&lt;br /&gt;
|Strzała&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|Raging Bull&lt;br /&gt;
|Wściekły Byk&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|14&lt;br /&gt;
|Flying Mantis&lt;br /&gt;
|Modliszka&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|Stunt Monkey&lt;br /&gt;
|Małpa&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|Inferno&lt;br /&gt;
|Demon&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|Unlocked in Arcade mode&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|Forkster&lt;br /&gt;
|Widelec&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Unlocked in Arcade mode or by finishing 2nd in 21st race of Championship&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|Worms Mobile&lt;br /&gt;
|Autoworm&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Unlocked in Championship mode or by getting 30000 points in stunts mode&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|Formula 17&lt;br /&gt;
|Formuła 17&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Get one gold time in Time Trial&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|Team Machine&lt;br /&gt;
|Team&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Get all gold times in Time Trial&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|?&lt;br /&gt;
|Kaskader&lt;br /&gt;
|&lt;br /&gt;
|Used only in stunts mode, modified version of Sky Hawk?&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Group&lt;br /&gt;
!Group in PL&lt;br /&gt;
!Type&lt;br /&gt;
!Colour&lt;br /&gt;
|-&lt;br /&gt;
|Wild Wheels&lt;br /&gt;
|Dzikie resory&lt;br /&gt;
|Off Roader&lt;br /&gt;
|Green&lt;br /&gt;
|-&lt;br /&gt;
|Aero Blasters&lt;br /&gt;
|Pionierzy przestworzy&lt;br /&gt;
|Stunt Car&lt;br /&gt;
|Blue&lt;br /&gt;
|-&lt;br /&gt;
|Speed Demons&lt;br /&gt;
|Demony szybkości&lt;br /&gt;
|Racer&lt;br /&gt;
|Red&lt;br /&gt;
|-&lt;br /&gt;
|Team Specials&lt;br /&gt;
|Specjalności Team&#039;u&lt;br /&gt;
|Prototype&lt;br /&gt;
|Orange&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=SkScreen&amp;diff=162</id>
		<title>SkScreen</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=SkScreen&amp;diff=162"/>
		<updated>2022-04-16T20:24:59Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* fixes screen ratio for non 4:3 resolutions (replaces widescreen fix)&lt;br /&gt;
* Removes 2048px resolution limit&lt;br /&gt;
* Removes quality limit for Radeon cards in DirectX mode&lt;br /&gt;
* Fixes screen tilt on higher resolutions (tilt is constant, based on original 640x480 tilt)&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Install [[StuntKit]] loader if you haven&#039;t already&lt;br /&gt;
* Download [https://github.com/Halamix2/StuntKit_modules/releases/ skScreen.dll] and place it in the same folder as &amp;lt;code&amp;gt;StuntGP.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you want to play the game in resolution greater than 2048px (e.g. 2560x1440), download [https://github.com/UCyborg/LegacyD3DResolutionHack/releases/ LegacyD3DResolutionHack], and unpack it in the same folder as &amp;lt;code&amp;gt;StuntGP.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; (if it doesn&#039;t exist, run &amp;lt;code&amp;gt;config.exe&amp;lt;/code&amp;gt;) with a text editor, edit lines &amp;lt;code&amp;gt;DISPLAYRESWIDTH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DISPLAYRESHEIGHT&amp;lt;/code&amp;gt; with requested resolution.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;StuntKit_D3D.exe&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;StuntKit_Glide.exe&amp;lt;/code&amp;gt;, depending on wanted graphics API. These programs will load all &amp;lt;code&amp;gt;sk*.dll&amp;lt;/code&amp;gt; modules and start the game.&lt;br /&gt;
[[Category:StuntKit]]&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=161</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=161"/>
		<updated>2022-04-16T20:24:17Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://discord.gg/ykzAWnA Unofficial Discord] https://discord.com/api/guilds/749260704447463495/widget.png&lt;br /&gt;
*[https://web.archive.org/web/20080722085717/stuntgp.team17.com/frames.html Original Stunt GP website]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Windows 10 compatibility]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Game engine limitations]]&lt;br /&gt;
*[[Music]]&lt;br /&gt;
*[[Misc]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Controls]]&lt;br /&gt;
*[[Cars]]&lt;br /&gt;
*[[Tracks]]&lt;br /&gt;
*[[Stunts]]&lt;br /&gt;
*Game modes&lt;br /&gt;
**[[Arcade]]&lt;br /&gt;
**[[Time Trial]]&lt;br /&gt;
**[[Championship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== File formats used by the game ====&lt;br /&gt;
*[https://github.com/Halamix2/stunt_gp_formats File format scripts]&lt;br /&gt;
*[[File archive]] (.wad)&lt;br /&gt;
*[[Texture format]] (.pc/.dc/.ps)&lt;br /&gt;
*[[3D model format]] (.pmd)&lt;br /&gt;
*[[config.cfg]]&lt;br /&gt;
*[[Save file]] (setup.bin)&lt;br /&gt;
*[[Replay file]] (ghostXX.rpl/.bin)&lt;br /&gt;
&lt;br /&gt;
==== Speedrunning ====&lt;br /&gt;
*[https://github.com/hoXyy/Livesplit.Autosplitters/blob/master/LiveSplit.StuntGP.asl Autosplitter for LiveSplit]&lt;br /&gt;
*[https://www.speedrun.com/stuntgp Stunt GP on speedrun.com]&lt;br /&gt;
&lt;br /&gt;
== StuntKit ==&lt;br /&gt;
[[File:SkScreen example.png|thumb|alt=|skScreen on 16:9 screen, with 2560x1440 resolution]][[StuntKit]] allows to load .dll modules that can fix or alter the game &lt;br /&gt;
&lt;br /&gt;
List of the modules: &lt;br /&gt;
&lt;br /&gt;
* [[skScreen]] - adds widescreen, hi-resolution support &amp;amp; various screen improvements&lt;br /&gt;
* [[skFreeze]] - removes freeze every 7 minutes&lt;br /&gt;
* [[skRemap ]] - allows for key remapping&lt;br /&gt;
* skDebug - logs DirectX error messages to &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=SkRemap&amp;diff=160</id>
		<title>SkRemap</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=SkRemap&amp;diff=160"/>
		<updated>2022-04-16T20:23:35Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
skRemap allows user to remap keys used in the game (3D part of the game).&lt;br /&gt;
&lt;br /&gt;
Names of keys are the same as names of the constants on the https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes page, except without &amp;lt;code&amp;gt;VK_&amp;lt;/code&amp;gt; and case-insensitive.&lt;br /&gt;
&lt;br /&gt;
So if the constant is &amp;lt;code&amp;gt;VK_NUMPAD6&amp;lt;/code&amp;gt;, it can be written as &amp;lt;code&amp;gt;NUMPAD6&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;numpad6&amp;lt;/code&amp;gt; , or &amp;lt;code&amp;gt;NuMpAd6&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=SkRemap&amp;diff=159</id>
		<title>SkRemap</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=SkRemap&amp;diff=159"/>
		<updated>2022-04-16T20:22:28Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
skRemap allows user to remap keys used in the game (3D part of the game).&lt;br /&gt;
&lt;br /&gt;
Names of keys are the same as names of the constants on the https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes page, except without &amp;lt;code&amp;gt;VK_&amp;lt;/code&amp;gt; and case-insensitive.&lt;br /&gt;
&lt;br /&gt;
So if the constant is &amp;lt;code&amp;gt;VK_NUMPAD6&amp;lt;/code&amp;gt;, it can be written as, for instance, &amp;lt;code&amp;gt;NUMPAD6&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;numpad6&amp;lt;/code&amp;gt; , or &amp;lt;code&amp;gt;NuMpAd6&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=SkRemap&amp;diff=158</id>
		<title>SkRemap</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=SkRemap&amp;diff=158"/>
		<updated>2022-04-16T20:22:13Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: Created page with &amp;quot; skRemap allows user to remap keys used in the game (3D part of the game).  Names of keys are the same as names of the constants on the https://docs.microsoft.com/en-us/window...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
skRemap allows user to remap keys used in the game (3D part of the game).&lt;br /&gt;
&lt;br /&gt;
Names of keys are the same as names of the constants on the https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes page, except without &amp;lt;code&amp;gt;VK_&amp;lt;/code&amp;gt; and case-insensitive. So if the constant is &amp;lt;code&amp;gt;VK_NUMPAD6&amp;lt;/code&amp;gt;, it can be written as, for instance, &amp;lt;code&amp;gt;NUMPAD6&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;numpad6&amp;lt;/code&amp;gt; , or &amp;lt;code&amp;gt;NuMpAd6&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=SkScreen&amp;diff=157</id>
		<title>SkScreen</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=SkScreen&amp;diff=157"/>
		<updated>2022-04-03T15:29:41Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* fixes screen ratio for non 4:3 resolutions (replaces widescreen fix)&lt;br /&gt;
* Removes 2048px resolution limit&lt;br /&gt;
* Removes quality limit for Radeon cards in DirectX mode&lt;br /&gt;
* Fixes screen tilt on higher resolutions&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Install [[StuntKit]] loader if you haven&#039;t already&lt;br /&gt;
* Download [https://github.com/Halamix2/StuntKit_modules/releases/ skScreen.dll] and place it in the same folder as &amp;lt;code&amp;gt;StuntGP.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
* If you want to play the game in resolution greater than 2048px (e.g. 2560x1440), download [https://github.com/UCyborg/LegacyD3DResolutionHack/releases/ LegacyD3DResolutionHack], and unpack it in the same folder as &amp;lt;code&amp;gt;StuntGP.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; (if it doesn&#039;t exist, run &amp;lt;code&amp;gt;config.exe&amp;lt;/code&amp;gt;) with a text editor, edit lines &amp;lt;code&amp;gt;DISPLAYRESWIDTH&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;DISPLAYRESHEIGHT&amp;lt;/code&amp;gt; with requested resolution.&lt;br /&gt;
* Run &amp;lt;code&amp;gt;StuntKit_D3D.exe&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;StuntKit_Glide.exe&amp;lt;/code&amp;gt;, depending on wanted graphics API. These programs will load all &amp;lt;code&amp;gt;sk*.dll&amp;lt;/code&amp;gt; modules and start the game.&lt;br /&gt;
[[Category:StuntKit]]&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Save_file&amp;diff=156</id>
		<title>Save file</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Save_file&amp;diff=156"/>
		<updated>2022-02-19T14:56:47Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is one unfinished Okteta structure with some recognized values&lt;br /&gt;
&lt;br /&gt;
Save file stores top scores, unlocked tracks/cars etc., sound volume (is setup.bin exists volumes from &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; is not used), current language, camera settings, but it doesn&#039;t seem to store graphics quality&lt;br /&gt;
&lt;br /&gt;
setup.bin is by default saved to save/card00, however when the game starts it checks for first cardXX folder with that file. IT may happen that there is no setup.bin file in card00 and one exists in card01. In this case game will use that file.&lt;br /&gt;
&lt;br /&gt;
Time - time/60 = seconds.milliseconds; 2181/60 = 36.35&lt;br /&gt;
&lt;br /&gt;
Names written in &#039;&#039;&#039;bold&#039;&#039;&#039; are described in detail below the main table&lt;br /&gt;
&lt;br /&gt;
- means zeores/unused&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|File size, 0x211C&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|&#039;&#039;&#039;Checksum&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x16&lt;br /&gt;
|Cars, first one is unused to have same indexes in table and car ID&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x2&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x19&lt;br /&gt;
|Tracks, first one is unused to have same indexes in table and track ID&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|0x3&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|0x16&lt;br /&gt;
|Cars???, seems unused, first one is unused to have same indexes in table and ??? ID&lt;br /&gt;
|-&lt;br /&gt;
|0x52&lt;br /&gt;
|0x2&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|0x19&lt;br /&gt;
|Tracks???, seems unused, first one is unused to have same indexes in table and ??? ID&lt;br /&gt;
|-&lt;br /&gt;
|0x6D&lt;br /&gt;
|0x3&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x70&lt;br /&gt;
|0x4&lt;br /&gt;
|Camera 1-4 (close/medium/chasing/auto)&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| ??? (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x78&lt;br /&gt;
|0x4&lt;br /&gt;
|??? (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x7C&lt;br /&gt;
|0x4&lt;br /&gt;
|Music volume&lt;br /&gt;
|-&lt;br /&gt;
|0x80&lt;br /&gt;
|0x4&lt;br /&gt;
|SFX volume&lt;br /&gt;
|-&lt;br /&gt;
|0x84&lt;br /&gt;
|0x4&lt;br /&gt;
|Graphics quality&lt;br /&gt;
|-&lt;br /&gt;
|0x88&lt;br /&gt;
|0x4&lt;br /&gt;
|x image offset, can be set to &amp;lt;-31, 31&amp;gt; in hidden menu but can be set to arbitrary value, unsigned&lt;br /&gt;
|-&lt;br /&gt;
|0x8C&lt;br /&gt;
|0x4&lt;br /&gt;
|y image offset, can be set to &amp;lt;-31, 31&amp;gt; in hidden menu but can be set to arbitrary value, unsigned&lt;br /&gt;
|-&lt;br /&gt;
|0x90&lt;br /&gt;
|0x4&lt;br /&gt;
|Language id, in Polish version it&#039;s set to 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0x4&lt;br /&gt;
| Vals: 1 / 2&lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Array????&lt;br /&gt;
|-&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 0x18&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 0x2&lt;br /&gt;
| could be 0x1 plus zero&lt;br /&gt;
|-&lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0x1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 0x1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 0x1&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 0x8&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0x1&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|0xFA&lt;br /&gt;
|0x18&lt;br /&gt;
|Connections between tracks in Arcade mode, each is stored as byte (0/1), read from left to right, top to bottom on the map&lt;br /&gt;
|-&lt;br /&gt;
|0x112&lt;br /&gt;
|0x1&lt;br /&gt;
|Zero&lt;br /&gt;
|-&lt;br /&gt;
|0x113&lt;br /&gt;
|0x1&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x114&lt;br /&gt;
|0x260&lt;br /&gt;
|&#039;&#039;&#039;Arcade mode&#039;&#039;&#039;, 19 records, first one is unused (18 tracks in arcade)&lt;br /&gt;
|-&lt;br /&gt;
|0x374&lt;br /&gt;
|0x320&lt;br /&gt;
|Arcade mode &#039;&#039;&#039;records&#039;&#039;&#039;, array with 100 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x694&lt;br /&gt;
|0x888&lt;br /&gt;
|Time trial &#039;&#039;&#039;records&#039;&#039;&#039;, array of 26 elements (first and last one unused, first one is filled with default value, last one is zeroed)&lt;br /&gt;
|-&lt;br /&gt;
|0xF1C&lt;br /&gt;
|0xB00&lt;br /&gt;
|&#039;&#039;&#039;Championship&#039;&#039;&#039;, array with 8 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1A1C&lt;br /&gt;
|0x320&lt;br /&gt;
|looks like array of sorts, 25 elements of 0x20 bytes each, similar to Arcade&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D3C&lt;br /&gt;
| 0x1&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D3D&lt;br /&gt;
| 0xE&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D4B&lt;br /&gt;
| 0x1&lt;br /&gt;
| ???&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D4C&lt;br /&gt;
| 0x10&lt;br /&gt;
|  -&lt;br /&gt;
|-&lt;br /&gt;
|0x1D5C&lt;br /&gt;
|0x50&lt;br /&gt;
|Championship money &#039;&#039;&#039;records&#039;&#039;&#039;, array with 10 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1DAC&lt;br /&gt;
|0x50&lt;br /&gt;
|Championship score &#039;&#039;&#039;records&#039;&#039;&#039;, array with 10 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1DFC&lt;br /&gt;
|0x320&lt;br /&gt;
|Stunts mode &#039;&#039;&#039;records&#039;&#039;&#039;, sorted array with 100 elements&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Checksum ====&lt;br /&gt;
Read whole file, set bytes 0x4-0x7 to 0 (whole checksum), then loop over all bytes &amp;lt;code&amp;gt;hash = int(data[i]) + ( hash &amp;gt;&amp;gt; 0x1D | ((hash &amp;lt;&amp;lt; 3) % 2^32))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arcade mode ==&lt;br /&gt;
&lt;br /&gt;
* each element is 0x20 bytes long&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|lap time, def &amp;lt;code&amp;gt;20 1C 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|total time, def &amp;lt;code&amp;gt;A08C0000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|???, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Stunts score, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
After first record there is empty one and after that second record. All of them are very close to records array, how it it inserted then?&lt;br /&gt;
&lt;br /&gt;
== Championship ==&lt;br /&gt;
&lt;br /&gt;
* each slot is 0x160 bytes long&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Indicate if save exists (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Tour???&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Money&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|Car id&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0xE0&lt;br /&gt;
|&#039;&#039;&#039;Car parts&#039;&#039;&#039;, array of 11 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x100&lt;br /&gt;
|0x60&lt;br /&gt;
|&#039;&#039;&#039;Individual cars&#039;&#039;&#039;, array with 6 elements, 1st element is always player, unknown order of rest&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Sponsor name&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|TGR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|R-Line&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Itex&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Caltex&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Titan&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Mysuko&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Car parts ===&lt;br /&gt;
Each is 0x10 bytes long, first and last part ids determine available parts: &amp;lt;first id, last id&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|If the part was changed, set to 1 after each race, set to 0 when part was changed or with clean championship save&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Current part id, 0 for unused&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|id of first part, 0 for unused&lt;br /&gt;
|-&lt;br /&gt;
|0xc&lt;br /&gt;
|0x4&lt;br /&gt;
|id of last part, 0 for unused&lt;br /&gt;
|}&lt;br /&gt;
Order of parts in array:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!No.&lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Shocks&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Battery&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Engine&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Chassis&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|BMS&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Brakes&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|Unused, might have been horns, set to (1, 0, 1, 5)&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Gearbox&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|Boost&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|Tyres&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|Drive system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Individual cars ===&lt;br /&gt;
Each element is 0x10 bytes long&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Won races?&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Score&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Sponsor&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|??? Might be starting position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 0x1A1C stuff: ====&lt;br /&gt;
Element at last index is not used, races 1-20 are sorted from 20 to 1, so after 1st race there is one entry near end of the table (minus one unused entry)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|lap time, def &amp;lt;code&amp;gt;20 1C 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|total time, def &amp;lt;code&amp;gt;A08C0000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|???, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Stunts score, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Records ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Score, set to 0 for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records for time trials ====&lt;br /&gt;
There are 26 elements, each one is 0x54 bytes long,&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x50&lt;br /&gt;
|Array of records, see singular record below&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Time, (saved as seconds/60)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
Element 0 is unused and filled with default values (time 2 minutes, name&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;), last one (element 25) is empty, all bytes are set to zero&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Save_file&amp;diff=155</id>
		<title>Save file</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Save_file&amp;diff=155"/>
		<updated>2022-02-19T14:55:39Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is one unfinished Okteta structure with some recognized values&lt;br /&gt;
&lt;br /&gt;
Save file stores top scores, unlocked tracks/cars etc., sound volume (is setup.bin exists volumes from &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; is not used), current language, camera settings, but it doesn&#039;t seem to store graphics quality&lt;br /&gt;
&lt;br /&gt;
setup.bin is by default saved to save/card00, however when the game starts it checks for first cardXX folder with that file. IT may happen that there is no setup.bin file in card00 and one exists in card01. In this case game will use that file.&lt;br /&gt;
&lt;br /&gt;
Time - time/60 = seconds.milliseconds; 2181/60 = 36.35&lt;br /&gt;
&lt;br /&gt;
Names written in &#039;&#039;&#039;bold&#039;&#039;&#039; are described in detail below the main table&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|File size, 0x211C&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|&#039;&#039;&#039;Checksum&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x16&lt;br /&gt;
|Cars, first one is unused to have same indexes in table and car ID&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x2&lt;br /&gt;
|Zeroes, Last one could be used for next segments (track are 1-based, but arrays are 0-based, so this would be always zero)&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x19&lt;br /&gt;
|Tracks, first one is unused to have same indexes in table and track ID&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|0x3&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|0x16&lt;br /&gt;
|Cars???, seems unused, first one is unused to have same indexes in table and ??? ID&lt;br /&gt;
|-&lt;br /&gt;
|0x52&lt;br /&gt;
|0x2&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|0x19&lt;br /&gt;
|Tracks???, seems unused, first one is unused to have same indexes in table and ??? ID&lt;br /&gt;
|-&lt;br /&gt;
|0x6D&lt;br /&gt;
|0x3&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x70&lt;br /&gt;
|0x4&lt;br /&gt;
|Camera 1-4 (close/medium/chasing/auto)&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| ??? (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x78&lt;br /&gt;
|0x4&lt;br /&gt;
|??? (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x7C&lt;br /&gt;
|0x4&lt;br /&gt;
|Music volume&lt;br /&gt;
|-&lt;br /&gt;
|0x80&lt;br /&gt;
|0x4&lt;br /&gt;
|SFX volume&lt;br /&gt;
|-&lt;br /&gt;
|0x84&lt;br /&gt;
|0x4&lt;br /&gt;
|Graphics quality&lt;br /&gt;
|-&lt;br /&gt;
|0x88&lt;br /&gt;
|0x4&lt;br /&gt;
|x image offset, can be set to &amp;lt;-31, 31&amp;gt; in hidden menu but can be set to arbitrary value, unsigned&lt;br /&gt;
|-&lt;br /&gt;
|0x8C&lt;br /&gt;
|0x4&lt;br /&gt;
|y image offset, can be set to &amp;lt;-31, 31&amp;gt; in hidden menu but can be set to arbitrary value, unsigned&lt;br /&gt;
|-&lt;br /&gt;
|0x90&lt;br /&gt;
|0x4&lt;br /&gt;
|Language id, in Polish version it&#039;s set to 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0x4&lt;br /&gt;
| Vals: 1 / 2&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x98&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x9C&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xA0&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xA4&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xA8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xAC&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xB0&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xB4&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xB8&lt;br /&gt;
| 0x4&lt;br /&gt;
| Array????&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xBC&lt;br /&gt;
| 0x18&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xD4&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xD8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xDC&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xE0&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xE4&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xE8&lt;br /&gt;
| 0x4&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xEC&lt;br /&gt;
| 0x2&lt;br /&gt;
| could be 0x1 plus zero&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xEE&lt;br /&gt;
| 0x1&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xEF&lt;br /&gt;
| 0x1&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xF0&lt;br /&gt;
| 0x1&lt;br /&gt;
| -&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xF1&lt;br /&gt;
| 0x8&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0xF9&lt;br /&gt;
| 0x1&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|0xFA&lt;br /&gt;
|0x18&lt;br /&gt;
|Connections between tracks in Arcade mode, each is stored as byte (0/1), read from left to right, top to bottom on the map&lt;br /&gt;
|-&lt;br /&gt;
|0x112&lt;br /&gt;
|0x1&lt;br /&gt;
|Zero&lt;br /&gt;
|-&lt;br /&gt;
|0x113&lt;br /&gt;
|0x1&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x114&lt;br /&gt;
|0x260&lt;br /&gt;
|&#039;&#039;&#039;Arcade mode&#039;&#039;&#039;, 19 records, first one is unused (18 tracks in arcade)&lt;br /&gt;
|-&lt;br /&gt;
|0x374&lt;br /&gt;
|0x320&lt;br /&gt;
|Arcade mode &#039;&#039;&#039;records&#039;&#039;&#039;, array with 100 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x694&lt;br /&gt;
|0x888&lt;br /&gt;
|Time trial &#039;&#039;&#039;records&#039;&#039;&#039;, array of 26 elements (first and last one unused, first one is filled with default value, last one is zeroed)&lt;br /&gt;
|-&lt;br /&gt;
|0xF1C&lt;br /&gt;
|0xB00&lt;br /&gt;
|&#039;&#039;&#039;Championship&#039;&#039;&#039;, array with 8 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1A1C&lt;br /&gt;
|0x320&lt;br /&gt;
|looks like array of sorts, 25 elements of 0x20 bytes each, similar to Arcade&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D3C&lt;br /&gt;
| 0x1&lt;br /&gt;
| ???&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x1D3D&lt;br /&gt;
| 0xE&lt;br /&gt;
| -&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x1D4B&lt;br /&gt;
| 0x1&lt;br /&gt;
| ???&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| 0x1D4C&lt;br /&gt;
| 0x10&lt;br /&gt;
| -&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
|0x1D5C&lt;br /&gt;
|0x50&lt;br /&gt;
|Championship money &#039;&#039;&#039;records&#039;&#039;&#039;, array with 10 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1DAC&lt;br /&gt;
|0x50&lt;br /&gt;
|Championship score &#039;&#039;&#039;records&#039;&#039;&#039;, array with 10 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1DFC&lt;br /&gt;
|0x320&lt;br /&gt;
|Stunts mode &#039;&#039;&#039;records&#039;&#039;&#039;, sorted array with 100 elements&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Checksum ====&lt;br /&gt;
Read whole file, set bytes 0x4-0x7 to 0 (whole checksum), then loop over all bytes &amp;lt;code&amp;gt;hash = int(data[i]) + ( hash &amp;gt;&amp;gt; 0x1D | ((hash &amp;lt;&amp;lt; 3) % 2^32))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arcade mode ==&lt;br /&gt;
&lt;br /&gt;
* each element is 0x20 bytes long&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|lap time, def &amp;lt;code&amp;gt;20 1C 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|total time, def &amp;lt;code&amp;gt;A08C0000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|???, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Stunts score, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
After first record there is empty one and after that second record. All of them are very close to records array, how it it inserted then?&lt;br /&gt;
&lt;br /&gt;
== Championship ==&lt;br /&gt;
&lt;br /&gt;
* each slot is 0x160 bytes long&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Indicate if save exists (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Tour???&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Money&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|Car id&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0xE0&lt;br /&gt;
|&#039;&#039;&#039;Car parts&#039;&#039;&#039;, array of 11 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x100&lt;br /&gt;
|0x60&lt;br /&gt;
|&#039;&#039;&#039;Individual cars&#039;&#039;&#039;, array with 6 elements, 1st element is always player, unknown order of rest&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Sponsor name&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|TGR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|R-Line&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Itex&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Caltex&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Titan&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Mysuko&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Car parts ===&lt;br /&gt;
Each is 0x10 bytes long, first and last part ids determine available parts: &amp;lt;first id, last id&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|If the part was changed, set to 1 after each race, set to 0 when part was changed or with clean championship save&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Current part id, 0 for unused&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|id of first part, 0 for unused&lt;br /&gt;
|-&lt;br /&gt;
|0xc&lt;br /&gt;
|0x4&lt;br /&gt;
|id of last part, 0 for unused&lt;br /&gt;
|}&lt;br /&gt;
Order of parts in array:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!No.&lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Shocks&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Battery&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Engine&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Chassis&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|BMS&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Brakes&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|Unused, might have been horns, set to (1, 0, 1, 5)&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Gearbox&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|Boost&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|Tyres&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|Drive system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Individual cars ===&lt;br /&gt;
Each element is 0x10 bytes long&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Won races?&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Score&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Sponsor&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|??? Might be starting position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 0x1A1C stuff: ====&lt;br /&gt;
Element at last index is not used, races 1-20 are sorted from 20 to 1, so after 1st race there is one entry near end of the table (minus one unused entry)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|lap time, def &amp;lt;code&amp;gt;20 1C 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|total time, def &amp;lt;code&amp;gt;A08C0000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|???, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Stunts score, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Records ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Score, set to 0 for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records for time trials ====&lt;br /&gt;
There are 26 elements, each one is 0x54 bytes long,&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x50&lt;br /&gt;
|Array of records, see singular record below&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Time, (saved as seconds/60)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
Element 0 is unused and filled with default values (time 2 minutes, name&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;), last one (element 25) is empty, all bytes are set to zero&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Save_file&amp;diff=154</id>
		<title>Save file</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Save_file&amp;diff=154"/>
		<updated>2022-02-18T13:01:08Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is one unfinished Okteta structure with some recognized values&lt;br /&gt;
&lt;br /&gt;
Save file stores top scores, unlocked tracks/cars etc., sound volume (is setup.bin exists volumes from &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; is not used), current language, camera settings, but it doesn&#039;t seem to store graphics quality&lt;br /&gt;
&lt;br /&gt;
setup.bin is by default saved to save/card00, however when the game starts it checks for first cardXX folder with that file. IT may happen that there is no setup.bin file in card00 and one exists in card01. In this case game will use that file.&lt;br /&gt;
&lt;br /&gt;
Time - time/60 = seconds.milliseconds; 2181/60 = 36.35&lt;br /&gt;
&lt;br /&gt;
Names written in &#039;&#039;&#039;bold&#039;&#039;&#039; are described in detail below the main table&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|File size, 0x211C&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|&#039;&#039;&#039;Checksum&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x16&lt;br /&gt;
|Cars, first one is unused to have same indexes in table and car ID&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x2&lt;br /&gt;
|Zeroes, Last one could be used for next segments (track are 1-based, but arrays are 0-based, so this would be always zero)&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x19&lt;br /&gt;
|Tracks, first one is unused to have same indexes in table and track ID&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|0x3&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|0x16&lt;br /&gt;
|Cars???, seems unused, first one is unused to have same indexes in table and ??? ID&lt;br /&gt;
|-&lt;br /&gt;
|0x52&lt;br /&gt;
|0x2&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|0x19&lt;br /&gt;
|Tracks???, seems unused, first one is unused to have same indexes in table and ??? ID&lt;br /&gt;
|-&lt;br /&gt;
|0x6D&lt;br /&gt;
|0x3&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x70&lt;br /&gt;
|0x4&lt;br /&gt;
|Camera 1-4 (close/medium/chasing/auto)&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| ??? (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x78&lt;br /&gt;
|0x4&lt;br /&gt;
|??? (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x7C&lt;br /&gt;
|0x4&lt;br /&gt;
|Music volume&lt;br /&gt;
|-&lt;br /&gt;
|0x80&lt;br /&gt;
|0x4&lt;br /&gt;
|SFX volume&lt;br /&gt;
|-&lt;br /&gt;
|0x84&lt;br /&gt;
|0x4&lt;br /&gt;
|Graphics quality&lt;br /&gt;
|-&lt;br /&gt;
|0x88&lt;br /&gt;
|0x4&lt;br /&gt;
|x image offset, can be set to &amp;lt;-31, 31&amp;gt; in hidden menu but can be set to arbitrary value, unsigned&lt;br /&gt;
|-&lt;br /&gt;
|0x8C&lt;br /&gt;
|0x4&lt;br /&gt;
|y image offset, can be set to &amp;lt;-31, 31&amp;gt; in hidden menu but can be set to arbitrary value, unsigned&lt;br /&gt;
|-&lt;br /&gt;
|0x90&lt;br /&gt;
|0x4&lt;br /&gt;
|Language id, in Polish version it&#039;s set to 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0x66&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0xFA&lt;br /&gt;
|0x18&lt;br /&gt;
|Connections between tracks in Arcade mode, each is stored as byte (0/1), read from left to right, top to bottom on the map&lt;br /&gt;
|-&lt;br /&gt;
|0x112&lt;br /&gt;
|0x1&lt;br /&gt;
|Zero&lt;br /&gt;
|-&lt;br /&gt;
|0x113&lt;br /&gt;
|0x1&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x114&lt;br /&gt;
|0x260&lt;br /&gt;
|&#039;&#039;&#039;Arcade mode&#039;&#039;&#039;, 19 records, first one is unused (18 tracks in arcade)&lt;br /&gt;
|-&lt;br /&gt;
|0x374&lt;br /&gt;
|0x320&lt;br /&gt;
|Arcade mode &#039;&#039;&#039;records&#039;&#039;&#039;, array with 100 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x694&lt;br /&gt;
|0x888&lt;br /&gt;
|Time trial &#039;&#039;&#039;records&#039;&#039;&#039;, array of 26 elements (first and last one unused, first one is filled with default value, last one is zeroed)&lt;br /&gt;
|-&lt;br /&gt;
|0xF1C&lt;br /&gt;
|0xB00&lt;br /&gt;
|&#039;&#039;&#039;Championship&#039;&#039;&#039;, array with 8 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1A1C&lt;br /&gt;
|0x320&lt;br /&gt;
|looks like array of sorts, 25 elements of 0x20 bytes each, similar to Arcade&lt;br /&gt;
|-&lt;br /&gt;
|0x1D3C&lt;br /&gt;
|0xf&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x1D4B&lt;br /&gt;
|0x11&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x1D5C&lt;br /&gt;
|0x50&lt;br /&gt;
|Championship money &#039;&#039;&#039;records&#039;&#039;&#039;, array with 10 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1DAC&lt;br /&gt;
|0x50&lt;br /&gt;
|Championship score &#039;&#039;&#039;records&#039;&#039;&#039;, array with 10 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1DFC&lt;br /&gt;
|0x320&lt;br /&gt;
|Stunts mode &#039;&#039;&#039;records&#039;&#039;&#039;, sorted array with 100 elements&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Checksum ====&lt;br /&gt;
Read whole file, set bytes 0x4-0x7 to 0 (whole checksum), then loop over all bytes &amp;lt;code&amp;gt;hash = int(data[i]) + ( hash &amp;gt;&amp;gt; 0x1D | ((hash &amp;lt;&amp;lt; 3) % 2^32))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arcade mode ==&lt;br /&gt;
&lt;br /&gt;
* each element is 0x20 bytes long&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|lap time, def &amp;lt;code&amp;gt;20 1C 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|total time, def &amp;lt;code&amp;gt;A08C0000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|???, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Stunts score, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
After first record there is empty one and after that second record. All of them are very close to records array, how it it inserted then?&lt;br /&gt;
&lt;br /&gt;
== Championship ==&lt;br /&gt;
&lt;br /&gt;
* each slot is 0x160 bytes long&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Indicate if save exists (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Tour???&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Money&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|Car id&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0xE0&lt;br /&gt;
|&#039;&#039;&#039;Car parts&#039;&#039;&#039;, array of 11 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x100&lt;br /&gt;
|0x60&lt;br /&gt;
|&#039;&#039;&#039;Individual cars&#039;&#039;&#039;, array with 6 elements, 1st element is always player, unknown order of rest&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Sponsor name&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|TGR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|R-Line&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Itex&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Caltex&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Titan&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Mysuko&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Car parts ===&lt;br /&gt;
Each is 0x10 bytes long, first and last part ids determine available parts: &amp;lt;first id, last id&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|If the part was changed, set to 1 after each race, set to 0 when part was changed or with clean championship save&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Current part id, 0 for unused&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|id of first part, 0 for unused&lt;br /&gt;
|-&lt;br /&gt;
|0xc&lt;br /&gt;
|0x4&lt;br /&gt;
|id of last part, 0 for unused&lt;br /&gt;
|}&lt;br /&gt;
Order of parts in array:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!No.&lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Shocks&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Battery&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Engine&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Chassis&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|BMS&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Brakes&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|Unused, might have been horns, set to (1, 0, 1, 5)&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Gearbox&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|Boost&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|Tyres&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|Drive system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Individual cars ===&lt;br /&gt;
Each element is 0x10 bytes long&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Won races?&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Score&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Sponsor&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|??? Might be starting position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 0x1A1C stuff: ====&lt;br /&gt;
Element at last index is not used, races 1-20 are sorted from 20 to 1, so after 1st race there is one entry near end of the table (minus one unused entry)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|lap time, def &amp;lt;code&amp;gt;20 1C 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|total time, def &amp;lt;code&amp;gt;A08C0000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|???, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Stunts score, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Records ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Score, set to 0 for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records for time trials ====&lt;br /&gt;
There are 26 elements, each one is 0x54 bytes long,&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x50&lt;br /&gt;
|Array of records, see singular record below&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Time, (saved as seconds/60)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
Element 0 is unused and filled with default values (time 2 minutes, name&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;), last one (element 25) is empty, all bytes are set to zero&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Save_file&amp;diff=153</id>
		<title>Save file</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Save_file&amp;diff=153"/>
		<updated>2022-02-18T11:21:53Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: sizes for unknown&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There is one unfinished Okteta structure with some recognized values&lt;br /&gt;
&lt;br /&gt;
Save file stores top scores, unlocked tracks/cars etc., sound volume (is setup.bin exists volumes from &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; is not used), current language, camera settings, but it doesn&#039;t seem to store graphics quality&lt;br /&gt;
&lt;br /&gt;
setup.bin is by default saved to save/card00, however when the game starts it checks for first cardXX folder with that file. IT may happen that there is no setup.bin file in card00 and one exists in card01. In this case game will use that file.&lt;br /&gt;
&lt;br /&gt;
Time - time/60 = seconds.milliseconds; 2181/60 = 36.35&lt;br /&gt;
&lt;br /&gt;
Names written in &#039;&#039;&#039;bold&#039;&#039;&#039; are described in detail below the main table&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|File size, 0x211C&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|&#039;&#039;&#039;Checksum&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x16&lt;br /&gt;
|Cars, first one is unused to have same indexes in table and car ID&lt;br /&gt;
|-&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x2&lt;br /&gt;
|Zeroes, Last one could be used for next segments (track are 1-based, but arrays are 0-based, so this would be always zero)&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x19&lt;br /&gt;
|Tracks, first one is unused to have same indexes in table and track ID&lt;br /&gt;
|-&lt;br /&gt;
|0x39&lt;br /&gt;
|0x3&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x3C&lt;br /&gt;
|0x16&lt;br /&gt;
|Cars???, seems unused, first one is unused to have same indexes in table and ??? ID&lt;br /&gt;
|-&lt;br /&gt;
|0x52&lt;br /&gt;
|0x2&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|0x19&lt;br /&gt;
|Tracks???, seems unused, first one is unused to have same indexes in table and ??? ID&lt;br /&gt;
|-&lt;br /&gt;
|0x6D&lt;br /&gt;
|0x3&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x70&lt;br /&gt;
|0x4&lt;br /&gt;
|Camera 1-4 (close/medium/chasing/auto)&lt;br /&gt;
|-&lt;br /&gt;
| 0x74&lt;br /&gt;
| 0x4&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x78&lt;br /&gt;
|0x4&lt;br /&gt;
|??? (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x7C&lt;br /&gt;
|0x4&lt;br /&gt;
|Music volume&lt;br /&gt;
|-&lt;br /&gt;
|0x80&lt;br /&gt;
|0x4&lt;br /&gt;
|SFX volume&lt;br /&gt;
|-&lt;br /&gt;
|0x84&lt;br /&gt;
|0x4&lt;br /&gt;
|Graphics quality&lt;br /&gt;
|-&lt;br /&gt;
|0x88&lt;br /&gt;
|0x4&lt;br /&gt;
|x image offset, can be set to &amp;lt;-31, 31&amp;gt; in hidden menu but can be set to arbitrary value, unsigned&lt;br /&gt;
|-&lt;br /&gt;
|0x8C&lt;br /&gt;
|0x4&lt;br /&gt;
|y image offset, can be set to &amp;lt;-31, 31&amp;gt; in hidden menu but can be set to arbitrary value, unsigned&lt;br /&gt;
|-&lt;br /&gt;
|0x90&lt;br /&gt;
|0x4&lt;br /&gt;
|Language id, in Polish version it&#039;s set to 1&lt;br /&gt;
|-&lt;br /&gt;
| 0x94&lt;br /&gt;
| 0x66&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0xFA&lt;br /&gt;
|0x18&lt;br /&gt;
|Connections between tracks in Arcade mode, each is stored as byte (0/1), read from left to right, top to bottom on the map&lt;br /&gt;
|-&lt;br /&gt;
|0x112&lt;br /&gt;
|0x2&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x114&lt;br /&gt;
|0x260&lt;br /&gt;
|&#039;&#039;&#039;Arcade mode&#039;&#039;&#039;, 19 records, first one is unused (18 tracks in arcade)&lt;br /&gt;
|-&lt;br /&gt;
|0x374&lt;br /&gt;
|0x320&lt;br /&gt;
|Arcade mode &#039;&#039;&#039;records&#039;&#039;&#039;, array with 100 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x694&lt;br /&gt;
|0x888&lt;br /&gt;
|Time trial &#039;&#039;&#039;records&#039;&#039;&#039;, array of 26 elements (first and last one unused, first one is filled with default value, last one is zeroed)&lt;br /&gt;
|-&lt;br /&gt;
|0xF1C&lt;br /&gt;
|0xB00&lt;br /&gt;
|&#039;&#039;&#039;Championship&#039;&#039;&#039;, array with 8 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1A1C&lt;br /&gt;
|0x320&lt;br /&gt;
|looks like array of sorts, 25 elements of 0x20 bytes each, similar to Arcade&lt;br /&gt;
|-&lt;br /&gt;
|0x1D3C&lt;br /&gt;
|0x20&lt;br /&gt;
|???, probably should be empty&lt;br /&gt;
|-&lt;br /&gt;
|0x1D5C&lt;br /&gt;
|0x50&lt;br /&gt;
|Championship money &#039;&#039;&#039;records&#039;&#039;&#039;, array with 10 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1DAC&lt;br /&gt;
|0x50&lt;br /&gt;
|Championship score &#039;&#039;&#039;records&#039;&#039;&#039;, array with 10 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x1DFC&lt;br /&gt;
|0x320&lt;br /&gt;
|Stunts mode &#039;&#039;&#039;records&#039;&#039;&#039;, sorted array with 100 elements&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Checksum ====&lt;br /&gt;
Read whole file, set bytes 0x4-0x7 to 0 (whole checksum), then loop over all bytes &amp;lt;code&amp;gt;hash = int(data[i]) + ( hash &amp;gt;&amp;gt; 0x1D | ((hash &amp;lt;&amp;lt; 3) % 2^32))&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Arcade mode ==&lt;br /&gt;
&lt;br /&gt;
* each element is 0x20 bytes long&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|lap time, def &amp;lt;code&amp;gt;20 1C 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|total time, def &amp;lt;code&amp;gt;A08C0000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|???, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Stunts score, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
After first record there is empty one and after that second record. All of them are very close to records array, how it it inserted then?&lt;br /&gt;
&lt;br /&gt;
== Championship ==&lt;br /&gt;
&lt;br /&gt;
* each slot is 0x160 bytes long&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Indicate if save exists (0/1)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Tour???&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Money&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|Car id&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0xE0&lt;br /&gt;
|&#039;&#039;&#039;Car parts&#039;&#039;&#039;, array of 11 elements&lt;br /&gt;
|-&lt;br /&gt;
|0x100&lt;br /&gt;
|0x60&lt;br /&gt;
|&#039;&#039;&#039;Individual cars&#039;&#039;&#039;, array with 6 elements, 1st element is always player, unknown order of rest&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Sponsor name&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|TGR&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|R-Line&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Itex&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Caltex&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Titan&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Mysuko&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Car parts ===&lt;br /&gt;
Each is 0x10 bytes long, first and last part ids determine available parts: &amp;lt;first id, last id&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|If the part was changed, set to 1 after each race, set to 0 when part was changed or with clean championship save&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Current part id, 0 for unused&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|id of first part, 0 for unused&lt;br /&gt;
|-&lt;br /&gt;
|0xc&lt;br /&gt;
|0x4&lt;br /&gt;
|id of last part, 0 for unused&lt;br /&gt;
|}&lt;br /&gt;
Order of parts in array:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!No.&lt;br /&gt;
!Name&lt;br /&gt;
|-&lt;br /&gt;
|0&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Unused&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Shocks&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Battery&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Engine&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Chassis&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|BMS&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Brakes&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|Unused, might have been horns, set to (1, 0, 1, 5)&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Gearbox&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|Boost&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|Tyres&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|Drive system&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Individual cars ===&lt;br /&gt;
Each element is 0x10 bytes long&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Won races?&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Score&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|Sponsor&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|??? Might be starting position&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== 0x1A1C stuff: ====&lt;br /&gt;
Element at last index is not used, races 1-20 are sorted from 20 to 1, so after 1st race there is one entry near end of the table (minus one unused entry)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|lap time, def &amp;lt;code&amp;gt;20 1C 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|0x4&lt;br /&gt;
|total time, def &amp;lt;code&amp;gt;A08C0000&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|0x4&lt;br /&gt;
|???, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Stunts score, def 0&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Records ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Score, set to 0 for empty scores&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Records for time trials ====&lt;br /&gt;
There are 26 elements, each one is 0x54 bytes long,&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x50&lt;br /&gt;
|Array of records, see singular record below&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x4&lt;br /&gt;
|Time, (saved as seconds/60)&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3chars + \0, set to &amp;lt;code&amp;gt;...\x00&amp;lt;/code&amp;gt; for empty scores&lt;br /&gt;
|}&lt;br /&gt;
Element 0 is unused and filled with default values (time 2 minutes, name&amp;lt;code&amp;gt;...&amp;lt;/code&amp;gt;), last one (element 25) is empty, all bytes are set to zero&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=152</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=152"/>
		<updated>2022-02-18T11:16:58Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://discord.gg/ykzAWnA Unofficial Discord] https://discord.com/api/guilds/749260704447463495/widget.png&lt;br /&gt;
*[https://web.archive.org/web/20080722085717/stuntgp.team17.com/frames.html Original Stunt GP website]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Windows 10 compatibility]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Game engine limitations]]&lt;br /&gt;
*[[Music]]&lt;br /&gt;
*[[Misc]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Controls]]&lt;br /&gt;
*[[Cars]]&lt;br /&gt;
*[[Tracks]]&lt;br /&gt;
*[[Stunts]]&lt;br /&gt;
*Game modes&lt;br /&gt;
**[[Arcade]]&lt;br /&gt;
**[[Time Trial]]&lt;br /&gt;
**[[Championship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== File formats used by the game ====&lt;br /&gt;
*[https://github.com/Halamix2/stunt_gp_formats File format scripts]&lt;br /&gt;
*[[File archive]] (.wad)&lt;br /&gt;
*[[Texture format]] (.pc/.dc/.ps)&lt;br /&gt;
*[[3D model format]] (.pmd)&lt;br /&gt;
*[[config.cfg]]&lt;br /&gt;
*[[Save file]] (setup.bin)&lt;br /&gt;
*[[Replay file]] (ghostXX.rpl/.bin)&lt;br /&gt;
&lt;br /&gt;
==== Speedrunning ====&lt;br /&gt;
*[https://github.com/hoXyy/Livesplit.Autosplitters/blob/master/LiveSplit.StuntGP.asl Autosplitter for LiveSplit]&lt;br /&gt;
*[https://www.speedrun.com/stuntgp Stunt GP on speedrun.com]&lt;br /&gt;
&lt;br /&gt;
== StuntKit ==&lt;br /&gt;
[[File:SkScreen example.png|thumb|alt=|skScreen on 16:9 screen, with 2560x1440 resolution]][[StuntKit]] allows to load .dll modules that can fix or alter the game &lt;br /&gt;
&lt;br /&gt;
List of the modules: &lt;br /&gt;
&lt;br /&gt;
* [[skScreen]] - adds widescreen &amp;amp; hi-resolution support&lt;br /&gt;
* [[skFreeze]] - removes freeze every 7 minutes&lt;br /&gt;
* skDebug - logs DirectX error messages to &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=151</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=151"/>
		<updated>2022-02-18T11:16:42Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://discord.gg/ykzAWnA Unofficial Discord] https://discord.com/api/guilds/749260704447463495/widget.png&lt;br /&gt;
*[https://web.archive.org/web/20080722085717/stuntgp.team17.com/frames.html Original Stunt GP website]&lt;br /&gt;
&lt;br /&gt;
*[[Windows 10 compatibility]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Game engine limitations]]&lt;br /&gt;
*[[Music]]&lt;br /&gt;
*[[Misc]]&lt;br /&gt;
&lt;br /&gt;
*[[Controls]]&lt;br /&gt;
*[[Cars]]&lt;br /&gt;
*[[Tracks]]&lt;br /&gt;
*[[Stunts]]&lt;br /&gt;
*Game modes&lt;br /&gt;
**[[Arcade]]&lt;br /&gt;
**[[Time Trial]]&lt;br /&gt;
**[[Championship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== File formats used by the game ====&lt;br /&gt;
*[https://github.com/Halamix2/stunt_gp_formats File format scripts]&lt;br /&gt;
*[[File archive]] (.wad)&lt;br /&gt;
*[[Texture format]] (.pc/.dc/.ps)&lt;br /&gt;
*[[3D model format]] (.pmd)&lt;br /&gt;
*[[config.cfg]]&lt;br /&gt;
*[[Save file]] (setup.bin)&lt;br /&gt;
*[[Replay file]] (ghostXX.rpl/.bin)&lt;br /&gt;
&lt;br /&gt;
==== Speedrunning ====&lt;br /&gt;
*[https://github.com/hoXyy/Livesplit.Autosplitters/blob/master/LiveSplit.StuntGP.asl Autosplitter for LiveSplit]&lt;br /&gt;
*[https://www.speedrun.com/stuntgp Stunt GP on speedrun.com]&lt;br /&gt;
&lt;br /&gt;
== StuntKit ==&lt;br /&gt;
[[File:SkScreen example.png|thumb|alt=|skScreen on 16:9 screen, with 2560x1440 resolution]][[StuntKit]] allows to load .dll modules that can fix or alter the game &lt;br /&gt;
&lt;br /&gt;
List of the modules: &lt;br /&gt;
&lt;br /&gt;
* [[skScreen]] - adds widescreen &amp;amp; hi-resolution support&lt;br /&gt;
* [[skFreeze]] - removes freeze every 7 minutes&lt;br /&gt;
* skDebug - logs DirectX error messages to &amp;lt;code&amp;gt;log.txt&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=SkFreeze&amp;diff=150</id>
		<title>SkFreeze</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=SkFreeze&amp;diff=150"/>
		<updated>2022-02-04T21:18:49Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: Created page with &amp;quot;skFreeze module removes 0.5s freezes every 3-20 minutes (depending on the computer)  * Under Windows 10, the game freezes every 7m9.5s  https://halamix2.pl/en/2021/10/03/stunt...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;skFreeze module removes 0.5s freezes every 3-20 minutes (depending on the computer)&lt;br /&gt;
&lt;br /&gt;
* Under Windows 10, the game freezes every 7m9.5s&lt;br /&gt;
&lt;br /&gt;
https://halamix2.pl/en/2021/10/03/stunt-gp-2-timeless-issues/&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=149</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=149"/>
		<updated>2022-02-04T21:18:02Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://discord.gg/ykzAWnA Unofficial Discord] https://discord.com/api/guilds/749260704447463495/widget.png&lt;br /&gt;
*[https://web.archive.org/web/20080722085717/stuntgp.team17.com/frames.html Original Stunt GP website]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Windows 10 compatibility]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Game engine limitations]]&lt;br /&gt;
*[[Music]]&lt;br /&gt;
*[[Misc]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Controls]]&lt;br /&gt;
*[[Cars]]&lt;br /&gt;
*[[Tracks]]&lt;br /&gt;
*[[Stunts]]&lt;br /&gt;
*Game modes&lt;br /&gt;
**[[Arcade]]&lt;br /&gt;
**[[Time Trial]]&lt;br /&gt;
**[[Championship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*File formats used by the game&lt;br /&gt;
**[https://github.com/Halamix2/stunt_gp_formats File format scripts]&lt;br /&gt;
**[[File archive]] (.wad)&lt;br /&gt;
**[[Texture format]] (.pc/.dc)&lt;br /&gt;
**[[3D model format]] (.pmd)&lt;br /&gt;
**[[config.cfg]]&lt;br /&gt;
**[[Save file]] (setup.bin)&lt;br /&gt;
**[[Replay file]] (ghostXX.rpl/.bin)&lt;br /&gt;
*Speedrunning&lt;br /&gt;
**[https://github.com/hoXyy/Livesplit.Autosplitters/blob/master/LiveSplit.StuntGP.asl Autosplitter for LiveSplit]&lt;br /&gt;
**[https://www.speedrun.com/stuntgp Stunt GP on speedrun.com]&lt;br /&gt;
&lt;br /&gt;
== StuntKit ==&lt;br /&gt;
[[StuntKit]] allows to load .dll modules that can fix or alter the game &lt;br /&gt;
&lt;br /&gt;
List of the modules: &lt;br /&gt;
&lt;br /&gt;
* [[skScreen]] - adds widescreen &amp;amp; hi-resolution support&lt;br /&gt;
* [[skFreeze]] - removes freeze every 7 minutes&lt;br /&gt;
* skDebug - logs DirectX error messages to log.txt [[File:SkScreen example.png|thumb|alt=|skScreen on 16:9 screen, with 2560x1440 resolution]]&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=148</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Main_Page&amp;diff=148"/>
		<updated>2022-02-04T21:17:35Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://discord.gg/ykzAWnA Unofficial Discord] https://discord.com/api/guilds/749260704447463495/widget.png&lt;br /&gt;
*[https://web.archive.org/web/20080722085717/stuntgp.team17.com/frames.html Original Stunt GP website]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Windows 10 compatibility]]&lt;br /&gt;
*[[Configuration]]&lt;br /&gt;
*[[Game engine limitations]]&lt;br /&gt;
*[[Music]]&lt;br /&gt;
*[[Misc]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*[[Controls]]&lt;br /&gt;
*[[Cars]]&lt;br /&gt;
*[[Tracks]]&lt;br /&gt;
*[[Stunts]]&lt;br /&gt;
*Game modes&lt;br /&gt;
**[[Arcade]]&lt;br /&gt;
**[[Time Trial]]&lt;br /&gt;
**[[Championship]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*File formats used by the game&lt;br /&gt;
**[https://github.com/Halamix2/stunt_gp_formats File format scripts]&lt;br /&gt;
**[[File archive]] (.wad)&lt;br /&gt;
**[[Texture format]] (.pc/.dc)&lt;br /&gt;
**[[3D model format]] (.pmd)&lt;br /&gt;
**[[config.cfg]]&lt;br /&gt;
**[[Save file]] (setup.bin)&lt;br /&gt;
**[[Replay file]] (ghostXX.rpl/.bin)&lt;br /&gt;
*Speedrunning&lt;br /&gt;
**[https://github.com/hoXyy/Livesplit.Autosplitters/blob/master/LiveSplit.StuntGP.asl Autosplitter for LiveSplit]&lt;br /&gt;
**[https://www.speedrun.com/stuntgp Stunt GP on speedrun.com]&lt;br /&gt;
&lt;br /&gt;
== StuntKit ==&lt;br /&gt;
[[StuntKit]] allows to load .dll modules that can fix or alter the game &lt;br /&gt;
&lt;br /&gt;
List of the modules: &lt;br /&gt;
&lt;br /&gt;
* skScreen - adds widescreen &amp;amp; hi-resolution support &lt;br /&gt;
* skFreeze - removes freeze every 7 minutes &lt;br /&gt;
* skDebug - logs DirectX error messages to log.txt [[File:SkScreen example.png|thumb|alt=|skScreen on 16:9 screen, with 2560x1440 resolution]]&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Replay_file&amp;diff=147</id>
		<title>Replay file</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Replay_file&amp;diff=147"/>
		<updated>2021-12-08T08:09:03Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Ghosts are saved in time trial mode&lt;br /&gt;
&lt;br /&gt;
.rpl files are used as golden times in Time Trial mode&lt;br /&gt;
&lt;br /&gt;
Header is 0x80 bytes long&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x2&lt;br /&gt;
|Usually is set to 1, but on track9.rpl it&#039;s set to 0; value 2 should also do something&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|0x2&lt;br /&gt;
|??&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;14 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;0.33333333&amp;lt;/code&amp;gt;, float (&amp;lt;code&amp;gt;AB AA AA 3E&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;01 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;00 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Lap time, (saved as seconds/60)&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x2&lt;br /&gt;
|car ID&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|0x2&lt;br /&gt;
|doubled car ID, doesn&#039;t seem to do anything&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|0x2&lt;br /&gt;
|Car livery (1-7)&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|0x2&lt;br /&gt;
|&amp;lt;code&amp;gt;0A 00&amp;lt;/code&amp;gt; - not always&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3 chars and \0, &amp;lt;code&amp;gt;AAA&amp;lt;/code&amp;gt; in .rpl files&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|0xC&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|0x40&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x80&lt;br /&gt;
|???&lt;br /&gt;
|binary data of some kind, seems to be neatly organized around 0x2c bytes each entry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Each level has 8 save slots, each slot is stored in different &amp;lt;code&amp;gt;save/CardXX&amp;lt;/code&amp;gt; folder. In each level each separate map ghost is saved in &amp;lt;code&amp;gt;ghostYY.bin&amp;lt;/code&amp;gt; file, where YY is the id of the map&lt;br /&gt;
* .rpl files seems to be similar/identical, some stuff doesn&#039;t make sense yet.&lt;br /&gt;
* All ghost files are 0x7530 (30000) bytes long, padded with zeroes after ghost binary data&lt;br /&gt;
** could be trimmed?&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Replay_file&amp;diff=146</id>
		<title>Replay file</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Replay_file&amp;diff=146"/>
		<updated>2021-12-08T08:08:31Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Ghosts are saved in time trial mode&lt;br /&gt;
&lt;br /&gt;
.rpl files are used as golden times in Time Trial mode&lt;br /&gt;
&lt;br /&gt;
Header is 0x80 bytes long&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x2&lt;br /&gt;
|Usually is set to 1, but on track9.rpl it&#039;s set to 0; value 2 should also do something&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|0x2&lt;br /&gt;
|??&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;14 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;0.33333333&amp;lt;/code&amp;gt;, float (&amp;lt;code&amp;gt;AB AA AA 3E&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;01 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;00 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Lap time, (saved as seconds/60)&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x2&lt;br /&gt;
|car ID&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|0x2&lt;br /&gt;
|doubled car ID, doesn&#039;t seem to do anything&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|0x2&lt;br /&gt;
|Car livery (1-7)&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|0x2&lt;br /&gt;
|&amp;lt;code&amp;gt;0A 00&amp;lt;/code&amp;gt; - not always&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3 chars and \0, &amp;lt;code&amp;gt;AAA&amp;lt;/code&amp;gt; in .rpl files&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|0xC&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|0x40&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x80&lt;br /&gt;
|???&lt;br /&gt;
|binary data of some kind, seems to be neatly organized around 0x44 bytes each entry&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Each level has 8 save slots, each slot is stored in different &amp;lt;code&amp;gt;save/CardXX&amp;lt;/code&amp;gt; folder. In each level each separate map ghost is saved in &amp;lt;code&amp;gt;ghostYY.bin&amp;lt;/code&amp;gt; file, where YY is the id of the map&lt;br /&gt;
* .rpl files seems to be similar/identical, some stuff doesn&#039;t make sense yet.&lt;br /&gt;
* All ghost files are 0x7530 (30000) bytes long, padded with zeroes after ghost binary data&lt;br /&gt;
** could be trimmed?&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=145</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=145"/>
		<updated>2021-12-06T07:19:48Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Seven */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than 1.83&lt;br /&gt;
** There is one unused mention of &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features versions 1.6, 1.61, 1.62, 1.7&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x94?&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|0x94?&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|List of points, looks like AI curve&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Some kind of vertices data, bound to mesh somehow&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Replay_file&amp;diff=144</id>
		<title>Replay file</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Replay_file&amp;diff=144"/>
		<updated>2021-11-28T21:40:20Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Ghosts are saved in time trial mode&lt;br /&gt;
&lt;br /&gt;
.rpl files are used as golden times in Time Trial mode&lt;br /&gt;
&lt;br /&gt;
Header is 0x80 bytes long&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x2&lt;br /&gt;
|Usually is set to 1, but on track9.rpl it&#039;s set to 0; value 2 should also do something&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|0x2&lt;br /&gt;
|??&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;14 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;0.33333333&amp;lt;/code&amp;gt;, float (&amp;lt;code&amp;gt;AB AA AA 3E&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;01 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;00 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Lap time, (saved as seconds/60)&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x2&lt;br /&gt;
|car ID&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|0x2&lt;br /&gt;
|doubled car ID, doesn&#039;t seem to do anything&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|0x2&lt;br /&gt;
|Car livery (1-7)&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|0x2&lt;br /&gt;
|&amp;lt;code&amp;gt;0A 00&amp;lt;/code&amp;gt; - not always&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3 chars and \0, &amp;lt;code&amp;gt;AAA&amp;lt;/code&amp;gt; in .rpl files&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|0xC&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|0x40&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x80&lt;br /&gt;
|???&lt;br /&gt;
|binary data of some kind&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Each level has 8 save slots, each slot is stored in different &amp;lt;code&amp;gt;save/CardXX&amp;lt;/code&amp;gt; folder. In each level each separate map ghost is saved in &amp;lt;code&amp;gt;ghostYY.bin&amp;lt;/code&amp;gt; file, where YY is the id of the map&lt;br /&gt;
* .rpl files seems to be similar/identical, some stuff doesn&#039;t make sense yet.&lt;br /&gt;
* All ghost files are 0x7530 (30000) bytes long, padded with zeroes after ghost binary data&lt;br /&gt;
** could be trimmed?&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=143</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=143"/>
		<updated>2021-11-02T20:57:17Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than 1.83&lt;br /&gt;
** There is one unused mention of &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features versions 1.6, 1.61, 1.62, 1.7&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x94?&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|0x94?&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of collider, a tiny ball of vertices, quite large number of points&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Vertices data somehow connected to meshes, needs to be transformed&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|List of points, looks like AI curve&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Possibly kind of 2D data, 4 values instead of 3 + 1.0, like vertices use.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=142</id>
		<title>3D model format</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=3D_model_format&amp;diff=142"/>
		<updated>2021-10-24T19:45:44Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: block seven&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Stores 3D models, more investigation needed.&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;signed&amp;quot; was not added assume unsigned value&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Current analysis: https://docs.google.com/spreadsheets/d/1Hk_EIYk2E6hVd747JJmC9pqqqh_dVafM3dqOkeRp3No/edit?usp=sharing&lt;br /&gt;
&lt;br /&gt;
Thanks to Martin for initial format reversing.&lt;br /&gt;
&lt;br /&gt;
* Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
** some files use version &amp;lt;code&amp;gt;1.82&amp;lt;/code&amp;gt; instead, but they aren&#039;t used by the game, the engine in PC version won&#039;t recognise anything other than 1.83&lt;br /&gt;
** There is one unused mention of &amp;lt;code&amp;gt;PMD V1.71&amp;lt;/code&amp;gt; in the game binary&lt;br /&gt;
** Prototype version features versions 1.6, 1.61, 1.62, 1.7&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x18?&lt;br /&gt;
|Magic - &amp;lt;code&amp;gt;PMD V1.83&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|Type - 0 = shadow &amp;amp; skybox; 1 = track; 2 = car&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Zeroes?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x94?&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]]&lt;br /&gt;
|-&lt;br /&gt;
|0xB4&lt;br /&gt;
|0x94?&lt;br /&gt;
|[[3D model format#offsetsTable|offsetsTable]] sizes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Offsets table ==&lt;br /&gt;
&lt;br /&gt;
You have to add &#039;&#039;&#039;0x148&#039;&#039;&#039; to each value to get proper pointers&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bold&#039;&#039;&#039; IDs are in all files, rest of them are specific for tracks&lt;br /&gt;
&lt;br /&gt;
Some of these are either unused or possibly repurposed&lt;br /&gt;
&lt;br /&gt;
All blocks seems to be 32-bit aligned.&lt;br /&gt;
&lt;br /&gt;
If the offset/size address is empty it&#039;s always set to zero.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!offset&lt;br /&gt;
!size offset&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;0&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x20&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb4&#039;&#039;&#039;&lt;br /&gt;
|Martin think it might be some sort of colider&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;1&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x24&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xb8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Polygon|polygons]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;2&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x28&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xbc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#UV mapping|UV texture]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;3&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x2c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Vertex|vertex]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;4&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x30&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc4&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Face|faces]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;5&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x34&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xc8&#039;&#039;&#039;&lt;br /&gt;
|Textures names&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;6&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x38&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xcc&#039;&#039;&#039;&lt;br /&gt;
|Offsets to texture names, absolute addresses in file, add 0x148&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;7&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x3c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd0&#039;&#039;&#039;&lt;br /&gt;
|Each element is 16B long, 4 floats&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;8&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x40&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd4&#039;&#039;&#039;&lt;br /&gt;
|Holds IDs of elements in 7&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;9&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x44&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xd8&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Transform|surface transforms]] data?&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;10&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x48&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xdc&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#Mesh|meshes]] data&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;11&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0x4c&#039;&#039;&#039;&lt;br /&gt;
|&#039;&#039;&#039;0xe0&#039;&#039;&#039;&lt;br /&gt;
|[[3D model format#LOD metadata|LOD metadata]], maybe something more&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;&#039;12&#039;&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;&#039;0xe4&#039;&#039;&#039;&lt;br /&gt;
|for non-tracks it&#039;s size of 1 divided by 16, unknown for tracks&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;13&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;14&#039;&#039;&lt;br /&gt;
|&#039;&#039;0x58&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&#039;&#039;offset marks end of file&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|0x5c&lt;br /&gt;
|0xf0&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|0x60&lt;br /&gt;
|0xf4&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|0x64&lt;br /&gt;
|0xf8&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|&lt;br /&gt;
|0xfc&lt;br /&gt;
|stores size of 20 divided by 0x90&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|&lt;br /&gt;
|0x100&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|0x70&lt;br /&gt;
|0x104&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|0x74&lt;br /&gt;
|0x108&lt;br /&gt;
|List of points, looks like AI curve&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|0x78&lt;br /&gt;
|0x10c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|0x7c&lt;br /&gt;
|0x110&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|0x80&lt;br /&gt;
|0x114&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|25&lt;br /&gt;
|0x84&lt;br /&gt;
|0x118&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|26&lt;br /&gt;
|0x88&lt;br /&gt;
|0x11c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|27&lt;br /&gt;
|0x8c&lt;br /&gt;
|0x120&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|28&lt;br /&gt;
|0x90&lt;br /&gt;
|0x124&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|29&lt;br /&gt;
|0x94&lt;br /&gt;
|0x128&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|30&lt;br /&gt;
|0x98&lt;br /&gt;
|0x12c&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|31&lt;br /&gt;
|0x9c&lt;br /&gt;
|0x130&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|32&lt;br /&gt;
|0xa0&lt;br /&gt;
|0x134&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;33&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;34&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;35&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|&#039;&#039;36&#039;&#039;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Basic elements ==&lt;br /&gt;
Each model contains these elements&lt;br /&gt;
&lt;br /&gt;
=== LOD metadata ===&lt;br /&gt;
I&#039;m skipping most of this block, as it&#039;s unused or used directly by the engine to store some of the calculated addresses&lt;br /&gt;
&lt;br /&gt;
If the number of LODs is set to less than 3, later ones just copy id from previous ones&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|Same as file type at 0x18&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|short&lt;br /&gt;
|Unknown, always set to 1 for normal files, 2 for tracks and 4 for cars&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|Always 1.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x21&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|number of meshes (surfaces) for each LOD&lt;br /&gt;
|-&lt;br /&gt;
|0x48&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 0&lt;br /&gt;
|-&lt;br /&gt;
|0x4c&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 1&lt;br /&gt;
|-&lt;br /&gt;
|0x50&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 2&lt;br /&gt;
|-&lt;br /&gt;
|0x54&lt;br /&gt;
|int&lt;br /&gt;
|ID of first mesh for LOD 3&lt;br /&gt;
|-&lt;br /&gt;
|0x58&lt;br /&gt;
|int&lt;br /&gt;
|Number of additional LODs, can be 0-3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Vertex ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|Z&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Polygon ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|byte&lt;br /&gt;
|vertex count&lt;br /&gt;
|-&lt;br /&gt;
|0x1&lt;br /&gt;
|byte&lt;br /&gt;
|material ID&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|byte&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x3&lt;br /&gt;
|byte&lt;br /&gt;
|unknown, might be weight&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|short&lt;br /&gt;
|vertices index?&lt;br /&gt;
|-&lt;br /&gt;
|0x6&lt;br /&gt;
|short&lt;br /&gt;
|face table start index&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== UV mapping ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|X&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|Y&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|vertex index&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short&lt;br /&gt;
|unknown, might be texture index&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|normal vector?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Face ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short&lt;br /&gt;
|index ?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Seven ===&lt;br /&gt;
Possibly kind of 2D data, 4 values instead of 3 + 1.0, like vertices use.&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|float&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|float&lt;br /&gt;
|?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Transform ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|float[4][4]&lt;br /&gt;
|some kind of matrix&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|int[4] ?&lt;br /&gt;
|unknown four ints?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mesh ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|short[4]&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|short&lt;br /&gt;
|transform index?&lt;br /&gt;
|-&lt;br /&gt;
|0xA&lt;br /&gt;
|short[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int[3]&lt;br /&gt;
|zeros?&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|float&lt;br /&gt;
|weight?&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|short&lt;br /&gt;
|unknown (index?)&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|short&lt;br /&gt;
|polys count&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|short&lt;br /&gt;
|UVs count&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|int&lt;br /&gt;
|vertices count&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|int&lt;br /&gt;
|UVs start index&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|int&lt;br /&gt;
|vertices start index&lt;br /&gt;
|-&lt;br /&gt;
|0x34&lt;br /&gt;
|int&lt;br /&gt;
|polys start index&lt;br /&gt;
|-&lt;br /&gt;
|0x38&lt;br /&gt;
|int[2]&lt;br /&gt;
|zeros?&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Track data ==&lt;br /&gt;
&lt;br /&gt;
=== Block 15 ===&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|signed int&lt;br /&gt;
|If there is any data it&#039;s set to 1, last one is always set to -1&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|float&lt;br /&gt;
|unknown&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 16 ===&lt;br /&gt;
12 floats and 4 ints, seems similar to 3 points (each 4th float is always 1.0)&lt;br /&gt;
&lt;br /&gt;
=== Block 17 ===&lt;br /&gt;
0x28 bytes, seems like there are 4 floats (perhaps intensity/R/G/B values?), rest unused?&lt;br /&gt;
&lt;br /&gt;
=== Block 20 ===&lt;br /&gt;
Long, each element 0x90 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 21 / 22 ===&lt;br /&gt;
Block 21 holds list of vertices, possibly defining track for AI.&lt;br /&gt;
&lt;br /&gt;
There are 5 curves in this block, 255 points each.&lt;br /&gt;
&lt;br /&gt;
Curve 0, 2-4 are track curves, curve 1 is for the charging station.&lt;br /&gt;
&lt;br /&gt;
Chall1 only has one curve.&lt;br /&gt;
&lt;br /&gt;
=== Block 22 ===&lt;br /&gt;
Holds the same number of elements as is the number of curves.&lt;br /&gt;
&lt;br /&gt;
Each element is 0x1C long&lt;br /&gt;
&lt;br /&gt;
WIP, so far hardcoded data from one track&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|int&lt;br /&gt;
|id&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|int&lt;br /&gt;
|starting vertex offset&lt;br /&gt;
|-&lt;br /&gt;
|0x8&lt;br /&gt;
|int&lt;br /&gt;
|length?&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|int&lt;br /&gt;
|0x1&lt;br /&gt;
|-&lt;br /&gt;
|0x10&lt;br /&gt;
|int&lt;br /&gt;
|0x2&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|int&lt;br /&gt;
|0xa&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Block 23 ===&lt;br /&gt;
List of vertices&lt;br /&gt;
&lt;br /&gt;
=== Block 24 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 25 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 26 ===&lt;br /&gt;
Each element 0x40 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 27 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 28 ===&lt;br /&gt;
list of faces? Each element 0x2 bytes long&lt;br /&gt;
&lt;br /&gt;
=== Block 29 ===&lt;br /&gt;
Each element 0x4 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 30 ===&lt;br /&gt;
Each element 0x8 long.&lt;br /&gt;
&lt;br /&gt;
=== Block 31 ===&lt;br /&gt;
Each element 0x30 long.&lt;br /&gt;
&lt;br /&gt;
4 floats (last one set to 1.0), and 16 shorts.&lt;br /&gt;
&lt;br /&gt;
=== Block 32 ===&lt;br /&gt;
0x38 bytes, mostly zeros&lt;br /&gt;
{| class=&amp;quot;wikitable mw-collapsible mw-collapsed&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|float&lt;br /&gt;
|Always 50.0&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|float&lt;br /&gt;
|Always 100.0&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|int&lt;br /&gt;
|&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Windows_10_compatibility&amp;diff=141</id>
		<title>Windows 10 compatibility</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Windows_10_compatibility&amp;diff=141"/>
		<updated>2021-10-09T17:29:24Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: /* Potential fixes */ That section was rubbish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Windows 10 have some problems running this game, some ideas how to fix that below (still won&#039;t fix problem for everyone):&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
* Please try to run installer &#039;&#039;&#039;without&#039;&#039;&#039; administrator privileges&lt;br /&gt;
* The game won&#039;t run without administrator privileges if it was installed to &amp;lt;code&amp;gt;Program Files&amp;lt;/code&amp;gt;&lt;br /&gt;
** Game installer by default suggests using &amp;lt;code&amp;gt;C:\Team17\SGP&amp;lt;/code&amp;gt; and it&#039;s working reliably&lt;br /&gt;
&lt;br /&gt;
== First run ==&lt;br /&gt;
&lt;br /&gt;
=== First configuration ===&lt;br /&gt;
&lt;br /&gt;
* Run &amp;lt;code&amp;gt;configure.exe&amp;lt;/code&amp;gt;, try to run the game before you edit &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; manually&lt;br /&gt;
** If after running &amp;lt;code&amp;gt;configure.exe&amp;lt;/code&amp;gt; there should be &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; file in the game directory. If it&#039;s missing you may not have write access to the game directory.&lt;br /&gt;
*** It might be blocked by your antivirus&lt;br /&gt;
*** You can try running &amp;lt;code&amp;gt;config.exe&amp;lt;/code&amp;gt; and the game itself with administrator privileges (not recommended but I don&#039;t have better idea)&lt;br /&gt;
&lt;br /&gt;
=== Manual edit ===&lt;br /&gt;
&lt;br /&gt;
* Game might not start if there are spaced in the path&lt;br /&gt;
** if your folder name has spaces in it you could try editing game.cfg &amp;lt;code&amp;gt;GAMELOCATION = &amp;lt;your path&amp;gt;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;GAMELOCATION     = .&amp;lt;/code&amp;gt;&lt;br /&gt;
* Edit game resolution&lt;br /&gt;
** If you wan&#039;t to set non 4:3 resolution please use [[skScreen]] [[StuntKit]] module to fix screen ratio&lt;br /&gt;
** Game won&#039;t start if you set resolution to 2048x2048px and over&lt;br /&gt;
*** You can use [[skScreen]] [[StuntKit]] module to use greater resolutions&lt;br /&gt;
* Skip Team17 and Eon logo at the start&lt;br /&gt;
** Set &amp;lt;code&amp;gt;DISPLAY_BOOT_GFX&amp;lt;/code&amp;gt; to 0&lt;br /&gt;
&lt;br /&gt;
== Configuring Glide version ==&lt;br /&gt;
Glide version may run better on some PCs, but it requires sligthly more configuration:&lt;br /&gt;
&lt;br /&gt;
* Install &amp;lt;s&amp;gt;dgVoodo&amp;lt;/s&amp;gt; [https://www.zeus-software.com/downloads/nglide nGlide] and enter nGlide configure&lt;br /&gt;
** set &amp;lt;code&amp;gt;Video backend&amp;lt;/code&amp;gt; to DirectX if you wish to use it with DXWnd for playing in window&lt;br /&gt;
** Run &amp;lt;code&amp;gt;configure.exe&amp;lt;/code&amp;gt; and change Rendering from &amp;lt;code&amp;gt;DirectX&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;Glide&amp;lt;/code&amp;gt;&lt;br /&gt;
*** You&#039;ll have to manually edit &amp;lt;code&amp;gt;game.cfg&amp;lt;/code&amp;gt; afterwards to your liking&lt;br /&gt;
&lt;br /&gt;
== Playing in Window ==&lt;br /&gt;
&lt;br /&gt;
* In [https://sourceforge.net/projects/dxwnd/ DXWnd] add new game, set &amp;lt;code&amp;gt;Path&amp;lt;/code&amp;gt; to the game directory and &amp;lt;code&amp;gt;Launch&amp;lt;/code&amp;gt; to the game exe path (either &amp;lt;code&amp;gt;StuntGP_D3D.exe&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;StuntGP_Glide.exe&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
== Potential fixes ==&lt;br /&gt;
* If the game loads but you can&#039;t exit to main menu  or some weird things happen check if you have folders &amp;lt;code&amp;gt;save\card00&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;save\card07&amp;lt;/code&amp;gt; present inside Stunt GP folder. If not you need to create them&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Replay_file&amp;diff=140</id>
		<title>Replay file</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Replay_file&amp;diff=140"/>
		<updated>2021-07-29T20:35:41Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Ghosts are saved in time trial mode&lt;br /&gt;
&lt;br /&gt;
.rpl files are used as golden times in Time Trial mode&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!Offset&lt;br /&gt;
!Size&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|0x0&lt;br /&gt;
|0x2&lt;br /&gt;
|Usually is set to 1, but on track9.rpl it&#039;s set to 0; value 2 should also do something&lt;br /&gt;
|-&lt;br /&gt;
|0x2&lt;br /&gt;
|0x2&lt;br /&gt;
|??&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x4&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;14 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0xC&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;0.33333333&amp;lt;/code&amp;gt;, float (&amp;lt;code&amp;gt;AB AA AA 3E&amp;lt;/code&amp;gt;)&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x14&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;01 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x18&lt;br /&gt;
|0x4&lt;br /&gt;
|&amp;lt;code&amp;gt;00 00 00 00&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x4&lt;br /&gt;
|Lap time, (saved as seconds/60)&lt;br /&gt;
|-&lt;br /&gt;
|0x20&lt;br /&gt;
|0x2&lt;br /&gt;
|car ID&lt;br /&gt;
|-&lt;br /&gt;
|0x22&lt;br /&gt;
|0x2&lt;br /&gt;
|doubled car ID, doesn&#039;t seem to do anything&lt;br /&gt;
|-&lt;br /&gt;
|0x24&lt;br /&gt;
|0x2&lt;br /&gt;
|Car livery (1-7)&lt;br /&gt;
|-&lt;br /&gt;
|0x26&lt;br /&gt;
|0x2&lt;br /&gt;
|&amp;lt;code&amp;gt;0A 00&amp;lt;/code&amp;gt; - not always&lt;br /&gt;
|-&lt;br /&gt;
|0x28&lt;br /&gt;
|0x4&lt;br /&gt;
|???&lt;br /&gt;
|-&lt;br /&gt;
|0x2C&lt;br /&gt;
|0x4&lt;br /&gt;
|Player name, 3 chars and \0, &amp;lt;code&amp;gt;AAA&amp;lt;/code&amp;gt; in .rpl files&lt;br /&gt;
|-&lt;br /&gt;
|0x30&lt;br /&gt;
|0xC&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
| -&lt;br /&gt;
|-&lt;br /&gt;
|0x40&lt;br /&gt;
|0x40&lt;br /&gt;
|Zeroes&lt;br /&gt;
|-&lt;br /&gt;
|0x80&lt;br /&gt;
|???&lt;br /&gt;
|binary data of some kind&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
* Each level has 8 save slots, each slot is stored in different &amp;lt;code&amp;gt;save/CardXX&amp;lt;/code&amp;gt; folder. In each level each separate map ghost is saved in &amp;lt;code&amp;gt;ghostYY.bin&amp;lt;/code&amp;gt; file, where YY is the id of the map&lt;br /&gt;
* .rpl files seems to be similar/identical, some stuff doesn&#039;t make sense yet.&lt;br /&gt;
* All ghost files are 0x7530 (30000) bytes long, padded with zeroes after ghost binary data&lt;br /&gt;
** could be trimmed?&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
	<entry>
		<id>https://sgp.halamix2.pl/index.php?title=Tracks&amp;diff=139</id>
		<title>Tracks</title>
		<link rel="alternate" type="text/html" href="https://sgp.halamix2.pl/index.php?title=Tracks&amp;diff=139"/>
		<updated>2021-05-15T18:08:33Z</updated>

		<summary type="html">&lt;p&gt;Halamix2: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
Flag, country, number and type read from catalogue pages, I don&#039;t know what these number means&lt;br /&gt;
&lt;br /&gt;
Flag colour corresponds to [[Cars]] group&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
!ID&lt;br /&gt;
!Name&lt;br /&gt;
!Name in Polish&lt;br /&gt;
!Flag&lt;br /&gt;
!Country&lt;br /&gt;
!Number&lt;br /&gt;
!Type&lt;br /&gt;
!Notes&lt;br /&gt;
|-&lt;br /&gt;
|1&lt;br /&gt;
|Crazy Straights&lt;br /&gt;
|Szalone proste&lt;br /&gt;
|Red&lt;br /&gt;
|France&lt;br /&gt;
|6&lt;br /&gt;
|Stunts?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|2&lt;br /&gt;
|Bank Job&lt;br /&gt;
|Odskok&lt;br /&gt;
|Red&lt;br /&gt;
|Japan&lt;br /&gt;
|4&lt;br /&gt;
|Handling?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|Tubular hell&lt;br /&gt;
|Piekło rurowe&lt;br /&gt;
|Blue&lt;br /&gt;
|Japan&lt;br /&gt;
|7&lt;br /&gt;
|Stunts&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|4&lt;br /&gt;
|Curbed Heights&lt;br /&gt;
|Znoje i wyboje&lt;br /&gt;
|Red&lt;br /&gt;
|France&lt;br /&gt;
|6&lt;br /&gt;
|Handling?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|5&lt;br /&gt;
|Flying Finish&lt;br /&gt;
|Końcowy odlot&lt;br /&gt;
|Blue&lt;br /&gt;
|Italy&lt;br /&gt;
|8&lt;br /&gt;
|Stunts&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|6&lt;br /&gt;
|Secret Six&lt;br /&gt;
|Misja nr 6&lt;br /&gt;
|Blue&lt;br /&gt;
|Spain&lt;br /&gt;
|7&lt;br /&gt;
|Stunts&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|7&lt;br /&gt;
|The Sandwinder&lt;br /&gt;
|Pustynna burza&lt;br /&gt;
|Green&lt;br /&gt;
|Spain&lt;br /&gt;
|8&lt;br /&gt;
|Sand&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|8&lt;br /&gt;
|Roughdust Flats&lt;br /&gt;
|Pyłowe równiny&lt;br /&gt;
|Green&lt;br /&gt;
|Spain&lt;br /&gt;
|6&lt;br /&gt;
|Sand&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|9&lt;br /&gt;
|The Loopback&lt;br /&gt;
|Pętelka&lt;br /&gt;
|Blue&lt;br /&gt;
|United Kingdom&lt;br /&gt;
|7&lt;br /&gt;
|Stunts&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|10&lt;br /&gt;
|Intersector&lt;br /&gt;
|Krzyżowy ogień&lt;br /&gt;
|Red&lt;br /&gt;
|United Kingdom&lt;br /&gt;
|7&lt;br /&gt;
|Intersections?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|11&lt;br /&gt;
|Rise N&#039; Fall&lt;br /&gt;
|Góra czy dół?&lt;br /&gt;
|Blue&lt;br /&gt;
|Spain&lt;br /&gt;
|6&lt;br /&gt;
|Stunts&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|12&lt;br /&gt;
|Wide Wall Chase&lt;br /&gt;
|Gonitwa na mur&lt;br /&gt;
|Red&lt;br /&gt;
|Spain&lt;br /&gt;
|5&lt;br /&gt;
|Night&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|13&lt;br /&gt;
|Curb City Circuit&lt;br /&gt;
|Wyboiste miasto&lt;br /&gt;
|Red&lt;br /&gt;
|USA&lt;br /&gt;
|5&lt;br /&gt;
|Curves?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|14&lt;br /&gt;
|Waterfront Dash&lt;br /&gt;
|Wypad nad morze&lt;br /&gt;
|Red&lt;br /&gt;
|Italy&lt;br /&gt;
|9&lt;br /&gt;
|Curves?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|15&lt;br /&gt;
|Freefall Freeway&lt;br /&gt;
|Opadająca autostrada&lt;br /&gt;
|Blue&lt;br /&gt;
|Spain&lt;br /&gt;
|6&lt;br /&gt;
|Night&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|16&lt;br /&gt;
|High Roller&lt;br /&gt;
|Zrolowany&lt;br /&gt;
|Red&lt;br /&gt;
|Germany&lt;br /&gt;
|7&lt;br /&gt;
|Curves?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|17&lt;br /&gt;
|High Fly Clearway&lt;br /&gt;
|Wyskokowa trasa&lt;br /&gt;
|Green&lt;br /&gt;
|Japan&lt;br /&gt;
|9&lt;br /&gt;
|Sand&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|18&lt;br /&gt;
|Helipad Heights&lt;br /&gt;
|Lotnicze odloty&lt;br /&gt;
|Blue&lt;br /&gt;
|USA&lt;br /&gt;
|6&lt;br /&gt;
|Stunts&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|19&lt;br /&gt;
|Sunken Sights&lt;br /&gt;
|Zatopione ścieżki&lt;br /&gt;
|Green&lt;br /&gt;
|Spain&lt;br /&gt;
|6&lt;br /&gt;
|Night&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|20&lt;br /&gt;
|Dust Buster&lt;br /&gt;
|Proch i pył&lt;br /&gt;
|Green&lt;br /&gt;
|Japan&lt;br /&gt;
|4&lt;br /&gt;
|Sand&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|21&lt;br /&gt;
|Twin Loop Circuit&lt;br /&gt;
|Podwójna pętelka&lt;br /&gt;
|Blue&lt;br /&gt;
|Germany&lt;br /&gt;
|8&lt;br /&gt;
|Loops&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|22&lt;br /&gt;
|Snake Storm&lt;br /&gt;
|Zakręcony&lt;br /&gt;
|Blue&lt;br /&gt;
|Germany&lt;br /&gt;
|6&lt;br /&gt;
|Loops&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|23&lt;br /&gt;
|Skytop Speed&lt;br /&gt;
|Droga do nieba&lt;br /&gt;
|Red&lt;br /&gt;
|USA&lt;br /&gt;
|4&lt;br /&gt;
|Handling?&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|24&lt;br /&gt;
|The Chronozone&lt;br /&gt;
|Czasoprzestrzeń&lt;br /&gt;
|Red&lt;br /&gt;
|France&lt;br /&gt;
|4&lt;br /&gt;
|Handling?&lt;br /&gt;
|&lt;br /&gt;
|}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Country&lt;br /&gt;
!Level ID&lt;br /&gt;
|-&lt;br /&gt;
|France&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|Japan&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|US&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|UK&lt;br /&gt;
|4&lt;br /&gt;
|-&lt;br /&gt;
|Spain&lt;br /&gt;
|5&lt;br /&gt;
|-&lt;br /&gt;
|Spain night&lt;br /&gt;
|6&lt;br /&gt;
|-&lt;br /&gt;
|Italy&lt;br /&gt;
|7&lt;br /&gt;
|-&lt;br /&gt;
|Germany&lt;br /&gt;
|8&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Halamix2</name></author>
	</entry>
</feed>