Technical Information

Has anyone got some specs for the format of the LMProject, LMScene, LMScript, LMSprite, LMFont or Spritemap files? And how much progress has been made at code-type plugins, beyond the easy class-dump type stuff?

@prophile, on Aug 30 2008, 03:49 PM, said in Technical Information:

Has anyone got some specs for the format of the LMProject, LMScene, LMScript, LMSprite, LMFont or Spritemap files? And how much progress has been made at code-type plugins, beyond the easy class-dump type stuff?

Dang, that went so far over my head (which is not an easy task given my height) that I could barely spot it while squinting. 😉
Hopefully, prophile, someone with more knowledge than me (i.e., most anybody) will respond to this topic, as it seems interesting.

Lamkin

@prophile, on Aug 30 2008, 03:49 PM, said in Technical Information:

Has anyone got some specs for the format of the LMProject, LMScene, LMScript, LMSprite, LMFont or Spritemap files? And how much progress has been made at code-type plugins, beyond the easy class-dump type stuff?

Yes on all of the file formats except LMFont. Spritemaps are standard .tif files- the only organization in them is determined by the LMSprite files. For the rest, see below. As for code-type plug-ins, you'll need to ask someone else- I have no idea how to do something like that.

Edwards

LM File Information

Notes: Ints are 4 bytes, doubles are 8 bytes. Also, all data types are bigendian, so you will need to be careful to convert them appropriately on Intel systems.

LMScript

The file starts with an integer that gives the number of actions in the script. The actions start immediately thereafter, and each of them consists of the following 44 bytes (note: not all actions utilize all of these numbers, but all 44 bytes are always present in the file):

Action Type Index (int- 4 bytes)
Action time offset from start of script (int- 4 bytes)
Action data integer (int- 4 bytes)
Action data floating-point 1 (float- 8 bytes)
Action data floating-point 2 (float- 8 bytes)
Action data floating-point 3 (float- 8 bytes)
Action data floating-point 4 (float- 8 bytes)

After all the actions, there is another integer, which gives the length of the script's name. This is followed by the name itself, which runs to the end of the file.

Action Type List  (lifted from the strings in the SketchFighter binary)
Note: I have not done extensive testing to find out exactly how each of these actions work, or what some of the more ambiguous parameters do (i.e. "plus" in Turn Towards Target).

Idx	Action
0	Delete Self
1	RETURN %d loops
2	Set ID to %d
3	Set ID relative %d
4	Set POSITION (%d) (%f, %f) rand:(%f, %f)
5	Set POSITION relative(%d) (%f, %f) rand:(%f, %f)
6	Set ROTATION to (%d) %f rand:%f
7	Set ROTATION relative (%d) %f rand:%f
8	Set SPEED (%d) (%f, %f) rand:(%f, %f)
9	Set SPEED relative (%d) (%f, %f) rand:(%f, %f)
10	Set COLOR (%d) R:%f G:%f B:%f A:%f
11	Set COLOR relative (%d) R:%f G:%f B:%f A:%f
12	Set ROTATION SPEED (%d) %f rand:%f
13	Set ROTATION SPEED relative (%d) %f rand:%f
14	WAIT (%d) %f ticks rand:%f
15	SPAWN id:%d at (%f, %f) rand:(%f, %f)
16	Set SCALE (%d) (%f, %f) rand:(%f, %f)
17	Set SCALE relative (%d) (%f, %f) rand:(%f, %f)
18	Return to previous script						
19	Turn towards target (%d) max angle %f plus:%f
20	Set SPEED FORWARD (%d) %f rand:%f
21	FIRE id %d speed:%f angle:%f rand:%f
22	PROXIMITY script:%d distance:%f
23	EXTRA1 CHECK script:%d lower than:%f
24	Set EXTRA1 to:%d
25	Set EXTRA2 to:%d
26	TARGET closest of type:%d

LMSprite

This file is a simple list of values with the following meanings, in order.

double  Spritemap section top left corner X
double  Spritemap section top left corner Y
double  Spritemap section width
double  Spritemap section height
double  Center X
double  Center Y
double  Collision Box Start X (within sprite)
double  Collision Box Start Y (within sprite)
double  Collision Box Width
double  Collision Box Height
int	 Imagefile Index from Project.LMProject (for the existing files, spritemap#+4)
int	 Default AI
int	 Solid type
int	 Default layer
int	 Default Extra1
int	 Default Extra2
int	 Name Length
string  Name

LMScene

This file type is simply a list of sprites, with all information for each sprite that is set in the editor. Each sprite entry follows a set format, shown below, and the list starts at the first byte of the file. There is no indicator for how many sprites are in a LMScene file. The game engine simply reads through each sprite until it reaches a name string with the value "(End of File)".

int	 Name Length
string  Name	   (Length is Name Length bytes)
int	 Sprite	 (1-based ID)
int	 Script	 (1-based ID)
double  Location X (pixels)
double  Location Y (pixels)
double  Size X	 (pixels)
double  Size Y	 (pixels)
double  Red		(0 to 1)
double  Green	  (0 to 1)
double  Blue	   (0 to 1)
double  Alpha	  (0 to 1)
double  Rotation   (degrees)
int	 Solid Type
int	 Layer	  (+13 for .SketchMap)
int	 Tiled Flag
int	 Extra1
int	 Extra2

LMProject

This file starts with an int giving the number of spritemaps the game has. Then, for each of the spritemaps, it has information in the following format:

int	 Description length
string  Description (note: I don't know where this is used, apart from this file)
int	 Filename Length
string  Filename

The file ends with two more ints. First, one giving the number of LMSprite files in the Data/Sprites folder, and second, one giving the number of LMScript files in the Data/Scripts folder. Note that if you want to add any new scripts or sprites, you will need to adjust these numbers appropriately.