Track element building

From Stunts Wiki

This article aims to present what is currently know on how Stunts stores the data which is used to assemble track elements such as roads, bridges, loops and scenery. The ultimate goal is to be able to effectively modify the existing elements and create new ones. There is still much to learn before that becomes possible, though - which also means there will be large gaps on this article for the time being.

General observations

Track elements have two different models. The graphical model consists of a 3D shape stored in either of GAME1.P3S or GAME2.P3S . Like any regular 3D shape, it can be modified using stressed. The graphical model, however, only controls the looks of the element. Actual physical behaviour is determined by a physical model. The physical model data appears to be spread over a number of files, and only parts of such data were located thus far. Briefly, track elements are made of potentially several plane surfaces, whose description is stored at the plan resource of GAME.PRE . Such plane surfaces, which are in principle boundless, are then weld together by a set of rules stored elsewhere. Another important piece of data which is not in plan is the type of surface associated with each plane (asphalt, grass, etc.). It is important to notice that plane surfaces in plan are not unique - for instance, the same planes are used for creating hill slopes and bridge ramps, and thus alterations to the plane surfaces will be reflected in both elements. The difference between the two elements is merely one of assembly - that is, where the planes are cut within the track tile in order to result in the track element shape. A similar situation is observed for the cork l/r and the pipe round surface. GAME.PRE also contains the wall resource, which stores data for non-drivable surfaces (such as bridge and building walls) in a poorly understood format.

GAME.PRE data

The plan resource

plan is composed of 536 structures of 34 bytes each, each associated with a plane which in turn forms part of a drivable surface. The structures consist of:

struct PLANE {
    WORD angleYZ;
    WORD angleXY;
    VECTOR origin;
    VECTOR normal;
    VECTOR[3] rotationMatrix;
};

In the above, WORD = 2-byte signed integer and:

struct VECTOR {
    WORD x;
    WORD y;
    WORD z;
};

origin sets a point in space belonging to the plane (coordinate system is the same track tile system of the 3D shapes in GAME1/2), and normal sets a normal vector to the plane "normalized" to a length of 8192. These two vectors are enough to define a (boundless) plane. angleYZ and angleXY appear to contain the inclination of the planes (given in units of 360/1024 degree, with values ranging form 0 to 1023). Since such data is made redundant by origin and normal and the values have no obvious effect on the surface behaviour their actual function is unknown. Finally, rotationMatrix appears to be a rotation matrix (of column vectors "normalized" to 16384) which changes the orientation of the car normal vector when it changes surfaces. It must be correctly set so that the surface displays reasonable physical behaviour.

The 536 structures in plan are arranged in 134 sets of 4 plane surfaces. Each plane in these quartets corresponds to the same part of the associated track element(s), the only difference being orientation relative to the track grid. The order on each quartet is predictable: the first one is in S->N orientation (pointing to +z) and the others correspond to counter-clockwise rotations (for pieces of bridge corners and banked roads, the first plane of the quartet is from the corner going S->W, the second one E->S and so on.).

List of planes

Block	Line	Address	Description		
1	1	37E	Flat ground	
2	5	406	Boulevard divider	
3	9	48E	Bridges (Viaducts may not work if set too low)
4	13	516	Ramps and hill slopes	
5	17	59E	Angled hill slopes (outer)	
6	21	626	Angled hill slopes (inner)	
7	25	6AE	Straight banked road	
8	29	736	Banked corner	
9	33	7BE	Banked corner	
10	37	846	Banked corner	
11	41	8CE	Banked corner	
12	45	956	Banked corner	
13	49	9DE	Banked corner	
14	53	A66	Banked corner	
15	57	AEE	Banked corner	
16	61	B76	Banked corner	
17	65	BFE	Banked corner	
18	69	C86	Banked corner	
19	73	D0E	Banked corner	
20	77	D96	Banked corner	
21	81	E1E	Banked corner	
22	85	EA6	Banked corner	
23	89	F2E	Banked corner	
24	93	FB6	Banked corner	
25	97	103E	Banked corner	
26	101	10C6	Banked road entrance (1st orientation is inner=left)
27	105	114E	Banked road entrance	
28	109	11D6	Banked road entrance	
29	113	125E	Banked road entrance	
30	117	12E6	Banked road entrance	
31	121	136E	Banked road entrance	
32	125	13F6	Banked road entrance	
33	129	147E	Banked road entrance	
34	133	1506	Banked road entrance	
35	137	158E	Banked road entrance	
36	141	1616	(unknown)	
37	145	169E	(unknown)	
38	149	1726	(unknown)	
39	153	17AE	(unknown)	
40	157	1836	(unknown)	
41	161	18BE	(unknown)	
42	165	1946	(unknown)	
43	169	19CE	(unknown)	
44	173	1A56	(unknown)	
45	177	1ADE	(unknown)	
46	181	1B66	Loop surface	
47	185	1BEE	Loop surface	
48	189	1C76	Loop surface	
49	193	1CFE	Loop surface	
50	197	1D86	Loop surface	
51	201	1E0E	Loop surface	
52	205	1E96	Loop surface	
53	209	1F1E	Loop surface	
54	213	1FA6	Loop surface	
55	217	202E	Loop surface	
56	221	20B6	Loop surface	
57	225	213E	Loop surface	
58	229	21C6	Pipe surface (grounded)	
59	233	224E	Pipe, cork l/r surface	
60	237	22D6	Pipe, cork l/r surface	
61	241	235E	Pipe, cork l/r surface	
62	245	23E6	Pipe, cork l/r surface	
63	249	246E	Pipe, cork l/r surface	
64	253	24F6	Pipe, cork l/r surface	
65	257	257E	Pipe, cork l/r surface	
66	261	2606	Pipe, cork l/r surface	
67	265	268E	Pipe, cork l/r surface	
68	269	2716	Pipe, cork l/r surface	
69	273	279E	Pipe, cork l/r surface	
70	277	2826	Pipe obstacle	
71	281	28AE	Pipe entrance (grounded)	
72	285	2936	Pipe entrance	
73	289	29BE	Pipe entrance	
74	293	2A46	Pipe entrance	
75	297	2ACE	Pipe entrance	
76	301	2B56	Pipe entrance	
77	305	2BDE	Pipe entrance	
78	309	2C66	Pipe entrance	
79	313	2CEE	Pipe entrance	
80	317	2D76	LH cork u/d entrance	
81	321	2DFE	Left-handed cork u/d	
82	325	2E86	Left-handed cork u/d	
83	329	2F0E	Left-handed cork u/d	
84	333	2F96	Left-handed cork u/d	
85	337	301E	Left-handed cork u/d	
86	341	30A6	Left-handed cork u/d	
87	345	312E	Left-handed cork u/d	
88	349	31B6	Left-handed cork u/d	
89	353	323E	Left-handed cork u/d	
90	357	32C6	Left-handed cork u/d	
91	361	334E	Left-handed cork u/d	
92	365	33D6	Left-handed cork u/d	
93	369	345E	Left-handed cork u/d	
94	373	34E6	Left-handed cork u/d	
95	377	356E	Left-handed cork u/d	
96	381	35F6	Left-handed cork u/d	
97	385	367E	Left-handed cork u/d	
98	389	3706	Left-handed cork u/d	
99	393	378E	Left-handed cork u/d	
100	397	3816	Left-handed cork u/d	
101	401	389E	Left-handed cork u/d	
102	405	3926	Left-handed cork u/d	
103	409	39AE	Left-handed cork u/d	
104	413	3A36	Left-handed cork u/d	
105	417	3ABE	LH cork u/d bridge	
106	421	3B46	RH cork u/d entrance	
107	425	3BCE	Right-handed cork u/d	
108	429	3C56	Right-handed cork u/d	
109	433	3CDE	Right-handed cork u/d	
110	437	3D66	Right-handed cork u/d	
111	441	3DEE	Right-handed cork u/d	
112	445	3E76	Right-handed cork u/d	
113	449	3EFE	Right-handed cork u/d	
114	453	3F86	Right-handed cork u/d	
115	457	400E	Right-handed cork u/d	
116	461	4096	Right-handed cork u/d	
117	465	411E	Right-handed cork u/d	
118	469	41A6	Right-handed cork u/d	
119	473	422E	Right-handed cork u/d	
120	477	42B6	Right-handed cork u/d	
121	481	433E	Right-handed cork u/d	
122	485	43C6	Right-handed cork u/d	
123	489	444E	Right-handed cork u/d	
124	493	44D6	Right-handed cork u/d	
125	497	455E	Right-handed cork u/d	
126	501	45E6	Right-handed cork u/d	
127	505	466E	Right-handed cork u/d	
128	509	46F6	Right-handed cork u/d	
129	513	477E	Right-handed cork u/d	
130	517	4806	Right-handed cork u/d	
131	521	488E	RH corh u/d bridge	
132	525	4916		
133	529	499E		
134	533	4A26	Tunnel roof

The wall resource

wall is composed of the following structures:

struct WALL {
    WORD angleXZ;
    WORD x;
    WORD z;
};

The data in these structures appear to be ground-plane projections of wall segments, with x and z making endpoints and angleXZ defining segment angles. Verification of that, and identification of wall pieces, is best performed by plotting the x and z values. There must be additional pieces of data involved in wall assembly through, as there is no info on wall heights, nor any obvious link to data in plan; also, simple alterations to wall pieces associated with elements such as block houses or slalom blocks do not work as intended.

External links