LemSet Tutorial

This will explain how to create a custom graphic set with LemSet. Unfortunately, LemSet can be a bit tricky to use, but it's the only tool we have at the moment for creating custom graphic sets for DOS Lemmings, Lemmix and NeoLemmix.

Firstly, you should create a folder to work in. I would recommend putting a copy of LemSet in the folder. After this, place all images you create for the style, as well as the STYLE.INI file, in the folder.

A graphic set, before being compiled, consists of:
  • style.ini - This INI file defines properties of the style, especially the interactive objects
  • palette.bmp (optional) - This BMP contains the style's palette; though it can be defined in the INI file instead
  • t##.bmp - These BMPs contain each terrain piece
  • o##.bmp - These BMPs contain each object
General information about BMPs for LemSet
All BMPs for LemSet must be 24-bit, uncompressed BMP files. LemSet does not support 8-bit BMPs, or any non-BMP format such as PNG or GIF. As mentioned above, a graphic set has a set palette; any color that does not exist in the palette is considered to be transparent as far as LemSet is concerned (unless using RGB-based images, in which case color #7 (the 8th one in the palette) is considered to be the "transparent" color). However, it should be noted that before comparing colors, they are converted from 24-bit colors to 18-bit colors. So, if you have 252,252,252 in the palette, and a pixel that's 255,255,255 in an image, it will not be considered transparent; as once downgraded to 18-bit, these two colors are identical.

It should also be noted that all terrain piece and object BMPs must have a width that is divisible by 8. This only applies to the width; the height can be any value you like, with one exception which we will see later.
1) palette.bmp
Palette.bmp contains all the colors used by the graphic set. It is important to note that the first 8 colors are fixed; if you put different ones, the game will replace those colors with the standard ones. It should be an image with dimensions of either 16x1 or 32x1, with each pixel representing one palette entry.

2) t##.bmp
These images contain the terrain piece. The first piece should be t00.bmp, the next t01.bmp, and so on. The maximum is 128 pieces (ie: up to t127.bmp), though traditional Lemmix can only use up to 64 pieces. LemSet will stop looking for terrain pieces when it either reaches t63.bmp, or reaches a file that does not exist - so for example, if you have up to t10.bmp, then don't have t11.bmp but do have t12.bmp; t12.bmp will not be compiled into the graphic set (because LemSet finds t11.bmp doesn't exist, and stops loading terrain pieces at that point).

3) o##.bmp
These images contain the objects. The first piece is o00.bmp, the next o01.bmp, and so on. The maximum is 32 pieces (ie: up to o31.bmp), though traditional Lemmix can only use up to 16. If an object has more than one animation frame, then every frame is stored in the one BMP file, arranged vertically - the top frame is frame #0, the next is frame #1, etc. Unlike with terrain pieces, LemSet does not automatically deduce whether or not an object exists from the file's existance or lack thereof; instead it depends whether the object is defined in the style.ini file. In all cases, the frames are arranged sequentially vertically like this, with no gap inbetween; exactly what frame should be what depends on the object.

4) style.ini
The style.ini file contains all the information about the style, most notably (but not solely) the data about the interactive objects. The rest of this tutorial deals with the contents of style.ini, and how it relates to the other files.

Each entry in the INI file takes the form of:

key = value

They are not case-sensitive, and spaces are ignored. Only one entry may be on a line, but blank lines are permitted. The order of the entries does not matter; it only matters that they're all there.

The types of entries that may be found in a style.ini can be divided into four types - palette info, object info, terrain info and others. We will cover them in this order, except leaving objects until last because it is by far the most complicated.

Palette Info
palette_infoThis specifies how the palette is given. There are three valid values - 18, 24 or BMP. If BMP is set, the palette will be loaded from palette.bmp, and no further palette info entries are nessecary. Otherwise, the palette must be defined with further entries.

If it is set to 18, then RGB values should be entered in the range of 0 to 63 (the same range that Lemmings uses internally). If it is set to 24, then normal RGB values in the range of 0 to 255 should be used. Aside from that, these two options are identical.
palette_colorsThis specifies how many colors are in the palette. The only valid values are 16 or 32.
palette_#This specifies an entry in the palette; # should be replaced with the entry number. For example, palette_0 for the first color in the palette. The value of this should be in the form of R,G,B; for example (in palette_info = 24 mode), magenta would be 255,0,255. Note that you should not put leading zeros, ie: palette_4, not palette_04.
rgb_imagesThis specifies that images should be encoded by their RGB values, not through the palette. The end effect is that terrains and objects are not limited to 16 / 32 colors, but can use any color. At present, such graphic sets are only compatible with NeoLemmix.

Terrain Info
terrain_#_steelThis specifies whether or not a specific terrain piece is to be considered steel. The # should be replaced with the terrain piece number (the same number as in the piece's BMP's filename). For example, to make the piece in t30.bmp a steel piece, put terrain_30_steel = 1. You do not need to specify terrain_#_steel = 0 for non-steel pieces; just leave it out altogether. Note that you should not put leading zeros; ie: terrain_3_steel, not terrain_03_steel.

Other Info
style_numberIf this is specified, LemSet will output the style using this number. For example, if this is set to 5, the output files will be named ground5o.dat and vgagr5.dat. This does not actually affect the contents of the files in any way; only their file name. If it is not specified, the output files will be named groundXo.dat and vgagrX.dat. Note that in older versions of LemSet, this must be a one-digit number (but newer versions remove that restriction).
xmas_paletteIf this is set to 1, a flag is marked in the output graphic set that marks the set as using the Xmas Palette for the fixed colors. Note that you still must set the palette info (or palette.bmp) according to the xmas palette; this does not cause LemSet to automatically swtich to it. All it does is set the xmas palette flag in the output file.
multi_windowsThis is a somewhat misleading name. If this is set to 1, then the second object (#1) in the style will not automatically be assumed to be a window. If it's set to zero (or not set at all), then it will be assumed to be one. This property only works on NeoLemmix; in traditional Lemmix, object #1 (and no others) are always a window. You can still (NeoLemmix only) set other objects as windows either way.
protect_styleIf this is set to 1, a "protected" flag is added to the output graphic set. LemSet will refuse to decompile any graphic set that has this flag set. Do note that this is a VERY weak protection and someone with sufficient technical capability will have little trouble bypassing it; it is also unlikely that any software other than LemSet will pay attention to it. For slightly better (though still far from bulletproof) protection, you should also only distribute your style embedded into an all-in-one Flexi player.



This leaves only objects to deal with. Objects are very complicated, as there are many types of objects. There are many properties which can be set for objects; some are global to all object types, while others are only used for certain types.

Global Object Properties - These properties apply to ALL objects.
In all object keys (whether global or object-specific), # should be replaced with the object number; this is the same number as in its BMP filename. For example, o03.bmp is referred to here as object_3_(whatever). Do note that you must not put leading zeros on the key name.
object_#_framesSets the number of animation frames an object has. This must be set even if the object only has one frame (object_#_frames = 1); if this value is not set, the object is assumed to not exist; and if a non-existant object is encountered, any higher number objects are also ignored as it is assumed that the end of the valid objects has been reached.
object_#_start_frameSets the frame to start animation from; I'm fairly sure Lemmix (and by extension, NeoLemmix) ignore this.
object_#_trigger_typeSets the type of the object. If this is left as nothing, the object will be purely decorative (note that windows are a special case).
object_#_preview_frameSets the frame to display on the level preview screen. Note that NeoLemmix overrides this on certain object types (such as locked exits).

While these apply to all objects, they do not nessecerially have to be defined (except for object_#_frames). They will default to 0 (which is the first frame, or a purely-decorative object) if not set.

Type-Specific Object Properties - These properties only need to be set on certain types of objects.
object_#_trigger_leftSets the X coordinate of the object's trigger area (relative to the top-left of the object image). Must be divisible by 4 in traditional Lemmix (but doesn't have to be in NeoLemmix).
object_#_trigger_topSets the Y coordinate of the object's trigger area (relative to the top-left of the object image). Must be divisible by 4 in traditional Lemmix (but doesn't have to be in NeoLemmix).
object_#_trigger_widthSets the width of the object's trigger area. Must be divisible by 4 in traditional Lemmix (but doesn't have to be in NeoLemmix).
object_#_trigger_heightSets the height of the object's trigger area. Must be divisible by 4 in traditional Lemmix (but doesn't have to be in NeoLemmix).
object_#_trigger_point_xSets the object's trigger X point. This is only used in objects that need both a point and a trigger area; otherwise the trigger area's top-left corner is used as the active point.
object_#_trigger_point_ySets the object's trigger Y point. See object_#_trigger_point_x for more details.
object_#_trigger_animSets whether the object always animates or only animates when triggered. This should simply always be on (1) for certain object types and always off (0, or just not set) for others; I'll probably make this set automatically sooner or later.
object_#_trigger_soundSets the sound that plays when the object is triggered.
object_#_key_frameSets the "key frame" of the object; the effect of this depends on the object type.

First, we will cover one object type that works in a very unique way - that is, the entrance window. There is no defined value for object_#_trigger_effect that gives a window; rather, the second object in the set (o01.bmp) is always assumed to be a window, and no other object can be a window. The correct order for the frames of a window is for the first frame to be fully open, the second frame fully shut, and the remaining frames the opening animation. In DOS, the window also must be exactly 48 pixels wide, and at least 25 pixels tall (this is per frame, not all frames combined). This limitation does not exist in Lemmix (not even in traditional Lemmix), but is still enforced in LemSet versions up to V9; LemSet V10 and onwards no longer enforce it. For newer versions of NeoLemmix (V1.25n onwards), you can specify a spawn position using the trigger top and trigger left coordinates; if none is specified (or in older NeoLemmix or traditional Lemmix), a default position is used. The default position is 24, 13 in versions of NeoLemmix that do support this, 24, 14 in traditional Lemmix when playing under Original Lemmings mechanics, and 25, 14 in other NeoLemmix versions or other traditional mechanics sets.

As of recent versions of NeoLemmix (V1.29n onwards), what I said about having no defined value is not quite accurate. Object #1 is still assumed to be a window (unless multi_windows, above, is set), but you can also set other objects as windows (or set object #1 as one in sets that do have multi_windows set) by giving them the trigger effect ID number 23.

With that covered, we now must cover the 28 different types of "normal" objects (not including objects that do nothing, which have already been explained).

First, I will list the "standard" types. These simply need a defined trigger area (using the trigger_left, trigger_top, trigger_width and trigger_height properties), do not need any special organisation of their frames, and should not have trigger_anim turned on. Any lemming that walks into their trigger area is affected (or in the case of one-way arrows / steel, any terrain within their trigger area is affected).

Traditional & NeoLemmix
Object type 2: One-way field left (right-facing lemmings are turned around)
Object type 3: One-way field right (opposite of above)
Object type 5: Water
Object type 6: Fire
Object type 7: One-way wall left
Object type 8: One-way wall right
Object type 9: Steel area
Object type 10: Anti-blocker field (blockers can't be assigned in the trigger area)

NeoLemmix Only
Object type 16: Secret level trigger
   
When a lemming enters the trigger area, a secret level is triggered.
Object type 18: Radiation
    When a lemming enters the trigger area, it becomes a timed bomber with a 9 second countdown.
Object type 19: One-way wall down
    One-way down walls can be mined (in either direction) or dug, but cannot be bashed.
Object type 20: Updraft
   
Updrafts slow fallers/floaters, and a lemming that lands while inside one will not splat. Gliders are blown upwards by them.
Object type 22: Slowfreeze
    Slowfreeze is similar to radiation, but gives a Stoner rather than a Bomber.
Object type 25: Hint
    These currently do nothing and are not displayed in-game; they exist only for Cheapo compatibility purposes. They are displayed in the editor so you may be able to think of creative uses for them.
Object type 26: Anti-splat pad
    A lemming landing on these will not splat. The difference from Updraft is that they have no special effect on lemmings while falling / floating / gliding, only upon landing.
Object type 27: Splat pad
    A lemming landing on these will splat, no matter how short the fall was. Floaters/gliders are still safe, provided they fell far enough to pull their parachute / glider out.

No, object types 2, 3 and 10 are not a mistake - they really exist under traditional Lemmix, and even DOS; they just aren't used by any official objects (but Lemmings Plus II does make use of the one-way fields). Object type 9 is not a mistake either - despite the seperate steel areas, it's also possible for an object to place a steel area.

It should also be noted that despite being traditional Lemmix, the secret level trigger worked in the older traditional Lemmix versions of Lemmings Plus II and Lemmings Plus II Bonus Pack; they were specially coded to add it. On the subject of secret level triggers, it should also be noted that they are not actually visible in-game, the graphic is purely for the editor. (This does NOT apply to traditional versions of LPII / LPII Bonus; in those they will be visible just like any other object, unless their graphic is entirely transparent of course.)


Now, I will explain the more complicated object types. Note the following shortcuts in the below table:
  • "trigger area" with no explanation - This means the trigger top/left/width/height work the same way as the above objects
  • object_#_trigger_anim - If listed with no explanation, it must be set to 1 for that object type
  • object_#_trigger_sound - If listed with no explanation, it's the sound effect that plays when a lemming triggers the object
  • "frame order" - This is to describe how the object's animation frames should be laid out

Also note that except for the exit and triggered trap, all remaining object types are NeoLemmix-only.

Object type 1: Exit
trigger area
object_#_trigger_animIf this is set to 0, it acts as a normal exit.
If this is set to 1, it's a triggered exit, which functions more or less like a triggered trap, except the lemmings are saved rather than killed.
This is NeoLemmix-exclusive; all exits are normal exits on traditional Lemmix.
object_#_trigger_soundThe sound effect to play for a triggered exit. If none is set, the usual "Yippee" sound is used. This is ignored with a non-triggered exit.
frame orderFor a normal exit, there is no special frame ordering; just a constant animation sequence.
For a triggered exit, the first frame is the exit idle. The remaining frames are the exit when triggered; note that the lemming must be drawn on the exit animation.

Object type 4: Triggered trap
trigger area
object_#_trigger_anim
object_#_trigger_sound
frame orderFirst frame is the trap idle. The remaining frames are the trap when triggered; note that the lemming must be drawn on the trap animation.

Object type 11: Teleporter
When triggered, the lemming is moved to the corresponding receiver or two-way teleporter.
trigger area
object_#_trigger_anim
object_#_trigger_sound
object_#_key_frameSets the frame at which the corresponding receiver begins its animation. The first frame is frame 0. If this is not set, the receiver begins when the teleporter finishes its animation.
frame orderExactly the same as traps.

Object type 12: Receiver
Receives a teleported lemming from a teleporter or two-way teleporter.
trigger areaThe lemming is set at the same offset from the trigger area's top-left as what its offset was from the teleporter's trigger's top-left. The width and height are used to determine how much to further offset this when the object is flipped or inverted.
object_#_trigger_anim
object_#_key_frameSets the frame at which the lemming is released.
frame orderMostly the same as traps. The lemming should be drawn on the animation up until the frame at which it is released; after this it should not be.

Object type 13: Pre-placed lemming
A single lemming which is pre-placed on the map instead of spawning from an entrance.
object_#_trigger_top
object_#_trigger_left
Sets the X and Y coordinates of where the lemming's foot will be placed, relative to the top-left corner of the object. (Width and Height have no effect)
frame orderThe first frame should be the lemming facing right, the second frame should be the lemming facing left. Note that the graphics for this are purely for the sake of level editors; the pre-placed lemming object is never displayed in-game (even on the preview screen, the actual lemming sprites are used).

Object type 14: Pickup skill
When a lemming reaches this, the skill on it is added to the skillset.
trigger area
frame orderThe first frame should be "empty" (after the skill is picked up), beyond that the correct order is: Climber, Floater, Bomber, Blocker, Builder, Basher, Miner, Digger, Walker, Swimmer, Glider, Mechanic, Stoner, Platformer, Stacker, Cloner. It should have exactly 17 frames.

Object type 15: Locked exit
This works like a normal exit, but must be unlocked by pushing all unlock buttons in the level.
trigger area
object_#_trigger_anim
frame orderThe first frame should be the exit fully open, the second frame should be the exit fully closed, and the remaining frames are the opening animation.

Object type 17: Unlock button
These are pushed in order to open a locked exit.
trigger area
object_#_trigger_anim
object_#_trigger_sound
frame orderFirst frame is pressed, second frame is unpressed.

Object type 21: Splitter
Lemmings that enter the splitter are sent out facing alternating directions - the first lemming to reach it will go right, the next will go left, and so on (it is possible to make the first one go left instead, second right, etc).
trigger area
object_#_trigger_anim
frame orderFirst frame is sending lemmings right, second frame is sending lemmings left.

Object type 23: Window

See above for details, near the start of the section on objects.

Object type 24: Triggered animation
Triggered animations do nothing apart from animate; you could compare them to constant no-effect objects (like the flags in the default graphic sets) in the same way you could compare triggered traps to water/fire objects.
trigger area
object_#_trigger_anim
object_#_trigger_sound
frame orderFirst frame is idle. The remaining frames are the animation when triggered. Note that this does not hold the lemming in place while working; if you want something that "delays" a lemming but is otherwise harmless, you may want to use a single-object teleporter.

Object type 28: Two-way teleporter
These are essentially like a teleporter and receiver in one. They won't send lemmings to themself, only to a receiver or another two-way teleporter.
trigger area
object_#_trigger_point_x / ySets the coordinate at which a lemming is received, when acting as a receiver.
object_#_trigger_anim
object_#_trigger_soundNote that the sound is only played when sending, not when receiving.
object_#_key_frameSets the frame at which the corresponding receiver begins its animation (when sending) or releases the lemming (when receiving). The first frame is frame 0. If this is not set, the receiver begins / lemming is released when the teleporter finishes its animation.
frame orderExactly the same as traps.

Object type 29: Single-object teleporter
These are also like a teleporter and receiver in one; the difference from a two-way teleporter is that a single teleporter sends a lemming to it's own trigger point, not to a corresponding receiver / two-way teleporter.
trigger area
object_#_trigger_point_x / ySets the coordinate the lemming is teleported to.
object_#_trigger_anim
object_#_trigger_sound
object_#_key_frameSets the frame at which the lemming is released. The first frame is frame 0. If this is not set, the lemming is released when the teleporter finishes its animation.
frame orderExactly the same as traps.

Note:
Use of the two-way teleporters and single-object teleporters is generally not recommended due to the limitations on only having a point, not an area, for the receiving of teleported lemmings, as well as the less-capable key frame control on two-way teleporters. You should instead split the object into a Teleporter and a Receiver. The reason these alternative types exist is mostly for Cheapo compatibility.


And finally, a list of sound effects. Note that a lot of these only work properly for objects under DOS; only a limited subset of them work under Lemmix (even including NeoLemmix):

0None
1Skill select
2Entrance opening
3"Let's go!"
4Skill assign
5"Oh no!"
6Electrode / disintegrator traps
7Squasher traps
8Splatting
9Rope / slicer traps
10Hitting steel
11(Unknown)
12Explosion
13Fire trap
14Ten ton trap
15Bear trap
16Yippee
17Drowning
18Builder warning