Code Vonc

Urban Chaos : Format PRM

CommentairesComments

Décryptage de la structure du format PRM du jeu Urban Chaos.




FR

// Urban Chaos
// Structure du format PRM

// Petit-boutiste
// Ens16 = Entier non signé 16 bits
// Es8 = Entier signé 8 bits
// Chn = Chaîne de caractères
// Bool8 = Drapeaux, flags, 8 valeurs booléennes codées chacune sur 1 bit


// En-tête

Ens16		(2)		Signature (0x16A2)
Chn  		(32)		Nom de l'objet

Ens16		(2)		ID du premier point
Ens16		(2)		ID du dernier point
	// Nombre de points = (ID du dernier point) - (ID du premier point)

Ens16		(2)		ID du premier quadrangle
Ens16		(2)		ID du dernier quadrangle
	// Nombre de quadrangles = (ID du dernier quadrangle) - (ID du premier quadrangle)

Ens16		(2)		ID du premier triangle
Ens16		(2)		ID du dernier triangle
	// Nombre de triangles = (ID du dernier triangle) - (ID du premier triangle)


// Propriétés

Ens8		(1)		Type de collision
	// 0 : Normale
	// 1 : Sans
	// 2 : Arbre (collision cylindrique centrale)
	// 3 : Réduite (collision légèrement plus petite que la taille de l'objet)
	// 4 à 255 : Sans ?
	
Bool8		(1)		Réaction à un choc par un véhicule
	// Bit 1 : Explosion (barils)
	// Bit 2 : ?
	// Bit 3 : Déformation
	// Bit 4 : Se penche (poteaux)
	// Bits 5 à 8 : ?

Ens8		(1)		Type d'ombre
	// 0 : Sans
	// 1 : Carrée
	// 2 : Ronde
	// 3 : 4 ronds
	// 4 : Carré plein
	// 5 à 255 : Sans ?

Bool8		(1)		Propriétés diverses
	// Bit 1 : Source lumineuse (lampadaires)
	// Bit 2 : Collision polygonale verticale (escaliers, caisses), voir les propriétés des polygones
	// Bit 3 : Halo de lumière (enseignes, petites lampes)
	// Bit 4 : Animation rotation Y (armes)
	// Bit 5 : Générer des feuilles par-terre autour (arbres)
	// Bit 6 : ? (feux rouges, clefs à ramasser, bonus, hélicoptère, certains véhicules)
	// Bit 7 : ? (certains bonus, certains lampadaires, certaines portes de zone)
	// Bit 8 : ? (certains panneaux routiers, chaîne Hi-fi, certains bonus, chaises, certaines passerelles, téléphones, billard)


// Coordonnées des points
	// Pour chaque point
	Es16		(2)		Position X
	Es16		(2)		Position Y
	Es16		(2)		Position Z

// Structure des quadrangles
	// Pour chaque quadrangle
	Ens8		(1)		ID du groupe de textures (un groupe de texture est une grille de 8*8 textures)
	
	Bool8		(1)		Propriétés
		// Bit 1 à 6 : ?
		// Bit 7 : Visibilité double-face
		// Bit 8 : ?
	
	Ens16		(2)		ID du point A
	Ens16		(2)		ID du point B
	Ens16		(2)		ID du point C
	Ens16		(2)		ID du point D

	Ens8		(1)		Position U du point A sur la grille de texture (u)
	Ens8		(1)		Position V du point A sur la grille de texture (v)
	Ens8		(1)		Position U du point B sur la grille de texture (u)
	Ens8		(1)		Position V du point B sur la grille de texture (v)
	Ens8		(1)		Position U du point C sur la grille de texture (u)
	Ens8		(1)		Position V du point C sur la grille de texture (v)
	Ens8		(1)		Position U du point D sur la grille de texture (u)
	Ens8		(1)		Position V du point D sur la grille de texture (v)
		// ID U de la texture dans le groupe de textures = int(u/32)
		// ID V de la texture dans le groupe de textures = int(v/32)
		// Position U relative à la texture = float(u/32.0) - int(u/32)
		// Position V relative à la texture = float(v/32.0) - int(v/32)
	
	Ens16 ?		(2)		A ? Normales ? (souvent 64)
	Ens16 ?		(2)		B ?
	Ens16 ?		(2)		C ?
	Ens16 ?		(2)		D ?
	
	Octets		(4)		? (souvent nul)
	
	Bool8		(1)		Propriétés
		// Bit 1 : ? ()
		// Bit 2 : ? (feuilles des arbres, herbe, sol de certaines passerelles, certains panneaux, certaines statues)
		// Bit 3 : ? ()
		// Bit 4 : ? ()
		// Bit 5 : ? ()
		// Bit 6 : Transparent
		// Bit 7 : Collision (passerelles, caisses)
		// Bit 8 : Réflexion (vitres, chrome)
	
	Ens8 ?		(1)		Propriétés d'affichage ?
		// 0 : Normal, couleur
		// 1 : Teinte change en fonction de l'angle
		// 2 : Noir
		// 3 : Noir + reflets multicolores
		// 4 à 255 : ?
	
	Octets		(2)		? (souvent nul)

// Structure des triangles
	// Pour chaque triangle
	// Idem que pour les quadrangles mais sans le point D


EN

// Urban Chaos
// PRM structure format

// Little-endian
// Uint16 = Unsigned integer 16 bits
// Int8 = Integer 8 bits
// Str = String
// Bool8 = Flags, 8 booleans each on 1 bit


// Header

Uint16		(2)		Signature (0x16A2)
Str  		(32)		Name

Uint16		(2)		First point ID
Uint16		(2)		Last point ID
	// Point count = (Last point ID) - (First point ID)

Uint16		(2)		First quadrangle ID
Uint16		(2)		Last quadrangle ID
	// Quadrangle count = (Last quadrangle ID) - (First quadrangle ID)

Uint16		(2)		First triangle ID
Uint16		(2)		Last triangle ID
	// Triangle count = (Last triangle ID) - (First triangle ID)


// Properties

Uint8		(1)		Collision type
	// 0 : Normal
	// 1 : None
	// 2 : Tree (central cylindric collision)
	// 3 : Reduced (collision a bit smaller than the object)
	// 4 to 255 : None ?
	
Bool8		(1)		Reaction to an impact by a vehicle
	// Bit 1 : Explosion (barrel)
	// Bit 2 : ?
	// Bit 3 : Deformation
	// Bit 4 : Stoop (poles, streetlights)
	// Bits 5 to 8 : ?

Uint8		(1)		Shadow type
	// 0 : None
	// 1 : Square
	// 2 : Round
	// 3 : 4 rounds
	// 4 : Filled square
	// 5 to 255 : None ?

Bool8		(1)		Various properties
	// Bit 1 : Light source (streetlights)
	// Bit 2 : Vertical polygonal collision (stairs, boxes), see polygons properties
	// Bit 3 : Halo of light (neon signs, small lamps)
	// Bit 4 : Animation rotation Y (guns to pick up)
	// Bit 5 : Add leaves on the ground around the object (trees)
	// Bit 6 : ? (traffic lights, keys to pick up, bonus, helicopter, some cars)
	// Bit 7 : ? (some bonus, some streetlights, some exit doors)
	// Bit 8 : ? (some road signs, stereo, some bonus, chairs, some gateways, phones, billiards)


// Points coordinates
	// For each point
	Int16		(2)		Position X
	Int16		(2)		Position Y
	Int16		(2)		Position Z

// Quadrangles structure
	// For each quadrangle
	Uint8		(1)		Texture ID group (a group texture is a grid of 8*8 textures)
	
	Bool8		(1)		Properties
		// Bit 1 to 6 : ?
		// Bit 7 : Double-sided visibility
		// Bit 8 : ?
	
	Uint16		(2)		Point A ID
	Uint16		(2)		Point B ID
	Uint16		(2)		Point C ID
	Uint16		(2)		Point D ID

	Uint8		(1)		U position of the point A on the texture grid (u)
	Uint8		(1)		V position of the point A on the texture grid (v)
	Uint8		(1)		U position of the point B on the texture grid (u)
	Uint8		(1)		V position of the point B on the texture grid (v)
	Uint8		(1)		U position of the point C on the texture grid (u)
	Uint8		(1)		V position of the point C on the texture grid (v)
	Uint8		(1)		U position of the point D on the texture grid (u)
	Uint8		(1)		V position of the point D on the texture grid (v)
		// ID U of the texture in the textures group = int(u/32)
		// ID V of the texture in the textures group = int(v/32)
		// U position relative to the texture = float(u/32.0) - int(u/32)
		// V position relative to the texture = float(v/32.0) - int(v/32)
	
	Uint16 ?		(2)		A ? Normals ? (often 64)
	Uint16 ?		(2)		B ?
	Uint16 ?		(2)		C ?
	Uint16 ?		(2)		D ?
	
	Bytes		(4)		? (often null)
	
	Bool8		(1)		Properties
		// Bit 1 : ? ()
		// Bit 2 : ? (tree leaves, grass, some gateways floors, some road signs, somes statues)
		// Bit 3 : ? ()
		// Bit 4 : ? ()
		// Bit 5 : ? ()
		// Bit 6 : Transparent
		// Bit 7 : Collision (gateways, boxes)
		// Bit 8 : Reflection (glass, chrome)
	
	Uint8 ?		(1)		Display properties ?
		// 0 : Normal, colored
		// 1 : Color change with the angle
		// 2 : Black
		// 3 : Black + multicolor reflection
		// 4 to 255 : ?
	
	Bytes		(2)		? (often null)

// Triangles structure
	// For each triangle
	// Same as quadrangles but without the D point