Difference between revisions of "Elma 2/Technical"

From Elma Wiki
Jump to navigation Jump to search
(Created page with "== Elasto Mania 2 == === Levels === How to parse a level byte by byte. Remember little-endianess. WIP Polygon objects are oriented so for y, up is negative and down is posit...")
 
Line 1: Line 1:
== Elasto Mania 2 ==
+
== Levels ==
=== Levels ===
 
 
How to parse a level byte by byte. Remember little-endianess.
 
How to parse a level byte by byte. Remember little-endianess.
  
Line 8: Line 7:
 
Line objects are inverted so for y, up is positive and down is negative.
 
Line objects are inverted so for y, up is positive and down is negative.
  
 +
 +
=== Main .lev Structure ===
 
{| class="wikitable"
 
{| class="wikitable"
 
! Offset || Type || Bytes || Description
 
! Offset || Type || Bytes || Description
Line 47: Line 48:
 
|}
 
|}
  
 +
=== Polygon ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|+ Polygon structure
 
|+ Polygon structure
Line 97: Line 99:
 
|}
 
|}
  
 +
=== Object1 ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|+ Object1
 
|+ Object1
Line 110: Line 113:
 
|}
 
|}
  
 
+
=== Line Object ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|+ LineObject
 
|+ LineObject
Line 140: Line 143:
 
|}
 
|}
  
 +
== Data ==
 +
=== Texture IDs ===
 
{| class="wikitable"
 
{| class="wikitable"
 
|+ TextureID - some examples (more exist - would be easier to extract all somewhere)
 
|+ TextureID - some examples (more exist - would be easier to extract all somewhere)

Revision as of 03:36, 16 December 2017

Levels

How to parse a level byte by byte. Remember little-endianess.

WIP

Polygon objects are oriented so for y, up is negative and down is positive. Line objects are inverted so for y, up is positive and down is negative.


Main .lev Structure

Offset Type Bytes Description
0 char[5] 5 "POT35" for Elma 2 levels
5 int 4 30 if unlocked level, 0 if locked level. Otherwise, assertion error
9 short 2 1 if topology error, 0 if no topology error.
11 int 4 1 if start out facing right (autoturn at level start)
15 char[51] 51 Unused: Level name/description. "Unnamed". Unused but can be hex-edited
66 char[16] 16 LGR name. Unchangeable except by hex edit. Always "default"
82 char[10] 10 Unused: Ground texture name. Unused. Value always overwritten to "texturea" on save. If missing on open, defaults as "ground"
92 char[10] 10 Unused: Sky texture name. Unused. Value always overwritten to "qgrass" on save. If missing on open, defaults as "sky"
102 byte[20] 20 Unused: ? Appears to be useless. Can be hex-edited
122 int 4 Shareware check. Shareware editor always saves this value as 115. Shareware game cannot open any number greater than 120. Full game is probably 135 but to confirm with real game version
126 double 8 Number of polygons + 0.4643643. Maximum 2000.
134 polygon ? Sequential list of polygons with data. "Raw" data for editor purposes
? object1 ? Only exists if no topology error, otherwise this object is skipped. "Processed" data for when you actually open a level.
? byte 1 0x2B
x To be continued... Work in progress
? double 8 Number of objects + 0.4643643. Maximum 500.
x To be continued... Work in progress

Polygon

Polygon structure
Offset Type Bytes Description
0 int 4 Type: 1=Normal, 2=Inactive, 3=Platform, 4=Path, 5=Autogenerated Border Polygon
4 int 4 Path Subtype: Door=1, Elevator=2, Falling=3, Continuous Oneway=4, Continuous Twoway=5
8 int 4 Platform's Platform ID or Path's Path ID: 0-999
12 int 4 Path's Platform ID: 0-999
16 int 4 Path's Speed at top
20 int 4 Path's Speed at bottom
24 int 4 Path's Open delay
28 int 4 Path's Close delay
32 int 4 Path's ReOpen delay
36 int 4 Path's ReClose delay
40 int 4 Path's Initially flag: 1=Up, 0=Down
44 int 4 Path's No of platforms
48 int 4 Override flag: 1=Polygon interacts with biker
52 int 4 Style index
56 int 4 Override flag: 1=Border on
60 int 4 Override flag: 1=Border off
64 int 4 Override flag: 1=Whole polygon border colored
68 int 4 Distance
72 int 4 Probably always 0. Probably not important as not included in Balazs' debug file (0040F1FB)
76 byte[300] 300 Probably just padding
376 int 4 Number of vertices
380 vertex (double * 2)[?] vertices * 16 X and Y as two doubles.

Object1

Object1
Offset Type Bytes Description
0 int 4 Total number of vertices across all polygons of type 1 + 5 only.
4 byte[72]*n 72*n LineObject
x To be continued... Work in progress

Line Object

LineObject
Offset Type Bytes Description
0 double 8 a: Vertex's x
8 double 8 b: (-1)*Vertex's y
16 double 8 c: Delta x to reach the next vertex
24 double 8 d: (-1)*Delta y to reach the next vertex
32 double 8 e: Delta x to move one unit towards the next vertex - c/g - 1=sqrt(e^2+f^2)
40 double 8 f: Delta y to move one unit towards the next vertex - d/g - 1=sqrt(e^2+f^2)
48 double 8 g: Line length - sqrt(c^2+d^2)
56 int 4 Texture ID (draws to right of the line)
60 int 4 0 if solid, 1 if cannot touch
64 int 4 Distance (border polygons copy base polygon distance)
68 int 4 Do not draw to the right of the line if = 1 (equivalent to texture id of 0), otherwise draw texture. Not sure if actually used by the default editor but that's what editing this value does

Data

Texture IDs

TextureID - some examples (more exist - would be easier to extract all somewhere)
Id Texture
0 Do not draw
10 Border texture (solid medium-colored beige)
100 Default ground (sandy rocks)
105 Solid dark green