Difference between revisions of "Elma 2/Technical"

From Elma Wiki
Jump to navigation Jump to search
Line 455: Line 455:
 
|-
 
|-
 
| style="text-align:right;" | 180016 || bytes[?] ||  style="text-align:right;" | ? || Raw stream of all files in a row with no separation. Find the file using the fileset information.
 
| style="text-align:right;" | 180016 || bytes[?] ||  style="text-align:right;" | ? || Raw stream of all files in a row with no separation. Find the file using the fileset information.
 +
|-
 +
| style="text-align:right;" | ? || int ||  style="text-align:right;" | 4 || 5B7AAB9Eh
 
|-
 
|-
 
|}
 
|}

Revision as of 06:12, 18 December 2017

Levels

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

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
? compile ? Only exists if no topology error, otherwise this object is skipped. "Processed" data for when you actually open a level.
? byte 1 0x2B
? int 1 dec: 192356446 (0x0B77205Eh)
? double 8 Number of objects + 0.4643643. Maximum 500.
? object ? Sequential list of objects
? double 8 Number of pictures + 0.2345672. Maximum 5000.
? picture ? Sequential list of pictures

Polygon

Orientation: positive y is down. These polygons are edited by the editor. The editor uses this info to generate Line Objects

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 Used by Csaba as a secret comment section. Not included in normal editor
376 int 4 Number of vertices
380 vertex (double * 2)[?] vertices * 16 X and Y as two doubles.

Compile Object

Compile Object
Offset Type Bytes Description
0 int 4 n: Total number of vertices across all polygons of type 1 + 5 only.
4 line*n 72*n Sequential list of n line objects
4+72*n double 8 ?Probably constant value of 60.0
12+72*n int 4 Random number based on current time. SIGNED integer; crashes if negative number
16+72*n byte 1 1=Beginning of a platform object. 0=No platforms
? platform ? Sequential list of all platform objects, as long as previous byte is 1
? byte 1 0x58h
? double 8 -406.64166666666665 in default shareware levels, but varies - unknown function
? double 8 -74.99166666666666 in default shareware levels, but varies - unknown function
? byte 1 1=Beginning of a path object. 0=No path objects
? path ? Sequential list of all path objects, as long as previous byte is 1

Line Object

Orientation: positive y is up. Each line object is used by the game to draw on the screen and to make lines solid/non-solid.

LineObject (72 bytes)
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

Object Object

Object (344 bytes)
Offset Type Bytes Description
0 double 8 x
8 double 8 y
16 int 4 Type:

1=Flower

2=Food

3=Killer

4=Start

5=Bonus

6=Card

7=Switch

8=Group switch

9=Platform reference

(10="stage") - internal error

(11="fordit") "turn" - no object appears ingame

(12="ugrat") "jump" - black square with no effect

13=Teleport

20 int 4 Group id
24 int 4 Condition 2 Path id
28 int 4 Opener/Closer: 1=A, 0=B
32 int 4 Card color: 0=None, 1=Red, 2=Yellow, 3=Blue
36 int 4 Condition 2 State: 1=Up, 0=Down
40 int 4 Platform id
44 byte[300] 300 Used by Csaba as a secret comment section. Not included in normal editor

Picture Object

Same as in elma1

Picture (54 bytes)
Offset Type Bytes Description
0 string 10 Picture name
10 string 10 Unused: Texture name
20 string 10 Unused: Mask name
30 double 8 X
38 double 8 Y
46 int 4 Distance
50 int 4 Clipping; 0=U, 1=G, 2=S

Platform Object

This contains info about the lines in a platform for the purposes of collision

Platform
Offset Type Bytes Description
0 double 8 0 - x_min(2)-0.0500000
8 double 8 1 - y_min(3)-0.0500000
16 double 8 2 - x_min of all point.y-platform_reference_object.y
24 double 8 3 - y_min of all point.y-platform_reference_object.y
32 double 8 4 - x_max of all point.x-platform_reference_object.x
40 double 8 5 - y_max of all point.y-platform_reference_object.y
48 double 8 6 - x_min(2)-0.3300000
56 double 8 7 - y_min(3)-0.3300000
64 double 8 8 - same as 2
72 double 8 9 - same as 3
80 double 8 10 - same as 4
88 double 8 11 - same as 5
96 double 8 12 - Platform reference object X
104 double 8 13 - Platform reference object Y
112 int 4 0 - Width of the polygon image probably
116 int 4 1 - Height of the polygon image probably
120 int 4 2 - ?Approximately width/6
124 int 4 3 - ?Approximately height/6
128 int 4 4 - Platform ID of the set
132 int 4 5 - ? defaults to 0
136 int 4 6 - ? defaults to 0
140 int 4 7 - ? defaults to 0
144 int 4 8 - ? defaults to 0
148 int 4 9 - ? defaults to 0
152 int 4 10 - ? defaults to 0
156 int 4 11 - ? defaults to 0
160 int 4 12 - Texture id of center part
164 int 4 13 - Texture id of border
168 int 4 14 - Always 1478256389
172 int 4 15 - Probably null-padding
180 int 4 16 - Number of vertices of all polygons belonging to the same platform, excluding non-solid vertices/lines.
184 line*n 72*n Sequential list of n line objects. Note that the 4 int variables are ignored and set to 0. The position of these line objects describe the platform's initial position based on the platform reference object, ignoring the path. This data is only used for to make the platforms solid and is not used to draw the platforms.
? byte 1 1=Beginning of another platform object. 0=No more platforms to read

Path Object

Path objects contain the info used to graphically draw platforms

Path
Offset Type Bytes Description
0 byte[24] 24 Null-padding
24 int 4 path id
28 int 4 platform id
32 int 4 pathsubtype
36 int 4 speedattop
40 int 4 speedatbottom
44 int 4 opendelay
48 int 4 closedelay
52 int 4 reopendelay
56 int 4 reclosedelay
60 int 4 initially
64 int 4 noplatforms
68 byte[16] 16 Null padding
84 int 4 f=number of frames to do forward animation path
88 int 4 f2=total number of frames to do forward and backwards animation path. Always f*2 except continuous one-way, where it is (f+1). Also different for multiple platforms
92 byte[4] 4 Null padding
96 int 4 0 ?pointer
100 int 4 1 ?pointer
104 int 4 2 ?pointer
108 int 4 3 ?pointer
112 int 4 4 ?pointer
116 byte[20] 20 Null padding
136 int 4 x=?always 0
140 int 4 identical to x
144 int 4 identical to x
148 int 4 identical to x
152 int 4 identical to x
156 int 4 identical to x
160 int 4 Always=1236278137
164 byte[4] 4 Null padding
168 int?*ft 4*ft mozg_x (4 bytes per frame) mozg="movement"
? byte 1 0x15
? int?*ft 4*ft mozg_y (4 bytes per frame)
? byte 1 0x15
? int?*ft 4*ft seb_x (4 bytes per frame) seb="velocity"
? byte 1 0x15
? int?*ft 4*ft seb_y (4 bytes per frame)
? byte 1 0x15
? int?*ft 4*ft plat_x (4 bytes per frame)
? byte 1 0x15
? int?*ft 4*ft plat_y (4 bytes per frame)
? byte 1 0x15
? byte 1 1=Beginning of another path object. 0=No more path obj to read

Data

Texture IDs

Many more ids exist - these are just some examples. Would be better to extract all the images somewhere instead of manually verifying numbers.

TextureID
Id Texture
0 Do not draw
10 Default Border (solid medium-colored beige)
100 Default ground (sandy rocks)
102 Platform texture (striped blue)
104 Platform border (dark blue)
105 Solid dark green

.mif

Python code to open files: Elma_2/Code#Python: .mif parser

Main structure

Mif file
Offset Type Bytes Description
0 int 4 .mif header: 100
4 int 4 Length of filename dataset. Fixed at 180,000 or else crash
8 int 4 n: Number of files in filename dataset. Restricted to number 1-1800 inclusive.
12 fileset 180000 List of n filesets, then padded with 0xCD to a length of 180000
180012 int 4 5B7AAB9Eh
180016 bytes[?] ? Raw stream of all files in a row with no separation. Find the file using the fileset information.
? int 4 5B7AAB9Eh

Fileset

Fileset
Offset Type Bytes Description
0 char[92] 92 Filename, null-terminated and padded with 0xCD. e.g. ('example.txt\0\0xCD\0xCD...\0xCD')
92 int 4 Reading from the start of default.mif, the location of the above file (e.g. f.seek(x,0))
96 int 4 Length of the file