Skip to content

CustomMaps ObjectTables

wezzzyrek1 edited this page Sep 18, 2026 · 1 revision

Object effects and animations

Two tables decide what the objects of a world do on their own: which particle effects hang off them, and how their animations play and follow one another. Both are per world, and both live inside the client's Data\Lang.mpr:

Data\Lang.mpr
    EffectInfo\EffectInfo<n>.txt                            effects attached to objects
    MapObjectAnimationInfo\MapObjectAnimationInfo<n>.txt    animation behaviour of objects

Values that refer to each other carry the same mark: 🟦 object type, 🟩 animation, 🟧 bone - see How the two files link.

Which world a file belongs to

<n> is the world folder number, not the map number - the same convention as Data\World<n>\:

Map number World folder Tables
63 Data\World64\ EffectInfo64.txt, MapObjectAnimationInfo64.txt
138 Data\World139\ EffectInfo139.txt, MapObjectAnimationInfo139.txt

Both files are optional; a world without one simply has no entries. Custom maps are read too, up to map 199.

A copied world needs its tables copied

The tables are looked up by world number, so a copied world's objects keep their types but lose everything the tables gave them. A world copied from World64 needs EffectInfo64.txt and MapObjectAnimationInfo64.txt copied to EffectInfo<n>.txt and MapObjectAnimationInfo<n>.txt under its own number.

Format

Plain text, one row per line, values separated by a single TAB, no header row.

Two TABs in a row make an empty value and shift every later column by one. The row still loads, with its scale, bone and the rest in the wrong places.

EffectInfo

Each row hangs one particle effect off every object of one type.

Column Value Meaning
1 🟦 object type the type as placed in EncTerrain<n>.obj
2 effect Data\Effect\<name>.ein
3 4 5 offset X Y Z from the attachment point
6 7 8 rotation X Y Z in degrees
9 scale multiplied by the object's own scale
10 🟧 bone -1 for the object's origin, otherwise a bone of its model
11 follow rotation 1 the effect turns with the bone, 0 it follows only its position and scale
12 object colour 1 the effect takes its colour from the object
13 🟩 animation the object animation it runs in; -1 for every animation
14 start frame the frame of that animation it starts at

From EffectInfo64.txt:

71	Data\Effect\fire02-red03.ein	15	-20	0	-90	0	0	50	43	1	0	1	0

Every object of type 71 burns at bone 43, offset 15 / -20 / 0, turned -90 degrees around X, at scale 50, turning with the bone - and only while the object plays animation 1.

Write 11 values or 14, never 12 or 13. Columns 12 to 14 are read as soon as a row has a 12th value, with no further check, so a row of 12 or 13 is read past its end. A row of 11 runs in every animation, but its colour and start frame are never set and hold whatever was left in memory - write all 14 whenever either matters.

One effect in several animations

A row with the same 🟦 object type, the same .ein and the same 🟧 bone as an earlier one does not add a second effect: its 🟩 animation joins the earlier row's animations, and everything else in it is ignored. Repeat the row with another animation to run one effect in several. EffectInfo139.txt puts one twister on object 177 - the gate further down - in animations 0, 1 and 3:

Type Effect Offset Rotation Scale Bone Follow Colour Anim Start
🟦 177 Data\Effect\twister19-yellow01.ein 0 0 45 0 0 0 285 🟧 17 1 0 🟩 0 0
🟦 177 Data\Effect\twister19-yellow01.ein 0 0 45 0 0 0 285 🟧 17 1 0 🟩 1 0
🟦 177 Data\Effect\twister19-yellow01.ein 0 0 45 0 0 0 285 🟧 17 1 0 🟩 3 0

Those are three of the gate's four states - closed, opening and closing - so the twister shows everywhere except while the gate stands open.

A row with -1 in column 13 is never merged - it always adds a new effect.

MapObjectAnimationInfo

Each row is one state: while objects of this type play animation A, play it at this speed and move on by this rule. The rows of one object type chain into a small state machine.

Column Value Meaning
1 🟦 object type the type as placed in EncTerrain<n>.obj; below 1000
2 🟩 animation the animation this row describes
3 speed playback speed; map objects start at 0.16
4 behaviour 0 to 8, below
5 distance player distance, used by behaviours 5 and 7 only
6 and on parameters depend on the behaviour

The type has to stay below 1000 because the client folds type and animation into one key, 1000 x animation + type - type 1000 in animation 0 is the same entry as type 0 in animation 1. Keep one row per type and animation.

A row needs at least five values. The client only checks that it is not empty before reading the first five.

Behaviours

Behaviour Parameters
0 loops the animation none
1 when the animation ends, switches 6: 🟩 next animation
2 repeats a random number of times, then switches 6: fewest, 7: most, 8: 🟩 next animation
3 as 2, but picks the next animation at random 6: fewest, 7: most, 8 and on: 🟩 animations to pick from
4 follows a game-wide state instead of the player 6: condition, last: 🟩 next animation
5 reacts to the player's distance 6: condition, 7: 🟩 next animation
6 as 4, once per change 6: condition, last: 🟩 next animation
7 as 5, once until the player leaves the range 6: condition, 7: 🟩 next animation
8 fades the object while it hides the player 6-8: box size, 9-11: box offset, 12: fade rate

For 5 and 7 the condition is 0 the player comes closer than column 5, 2 the player moves farther than column 5, 1 or 3 the animation ends. Four rows of MapObjectAnimationInfo139.txt make a gate - each row's next animation is the animation of the row after it:

Type Anim Speed Behaviour Distance Condition Next
🟦 177 🟩 0 0.16 5 300 0 🟩 1
🟦 177 🟩 1 0.30 5 300 1 🟩 2
🟦 177 🟩 2 0.16 5 300 2 🟩 3
🟦 177 🟩 3 0.26 5 300 3 🟩 0

Closed 0 → the player comes within 300 → opening 1 → it ends → open 2 → the player leaves → closing 3 → it ends → closed again.

4 and 6 watch a state of the game that has not been identified; stay with 5 and 7 for your own objects.

Behaviour 8: roofs and walls out of the way

8 never changes the animation. It builds a box around the object and, while the box stands between the camera and the player, fades the object towards 10% opacity; it returns to full once the view is clear.

Column Value Meaning
5 distance not used by 8 - the client's own files write 300
6 7 8 box size X Y Z multiplied by the object's scale
9 10 11 box offset X Y Z from the object's origin
12 fade rate x 0.01 - the fraction of the way the object moves each frame; without it the rate stays what the object had

From MapObjectAnimationInfo146.txt:

Type Anim Speed Behaviour Distance Size Offset Rate
🟦 17 🟩 0 0.16 8 300 250 250 700 0 0 0 7
🟦 13 🟩 0 0.16 8 300 610 100 345 0 0 150 7

Custom maps read their own table like any other world, so a behaviour 8 row works on them unchanged. To open a roof by where the player stands rather than by the camera, or a building of several pieces as one, use a map script - see Fading roofs.

How the two files link

Value Where it appears What it must match
🟦 object type EffectInfo column 1, MapObjectAnimationInfo column 1 the type of the object in EncTerrain<n>.obj
🟩 animation MapObjectAnimationInfo column 2 and its next-animation parameters, EffectInfo column 13 an animation the object's model has
🟧 bone EffectInfo column 10 a bone of the object's model

🟩 is what ties the files together: an effect whose column 13 says animation 1 shows only while the object's state machine is in its animation-1 row.

In World64, object 69 idles in animation 0, every few loops plays animation 1 once, and a spark shows at bone 44 from frame 9 of it.

MapObjectAnimationInfo64.txt:

Type Anim Speed Behaviour Distance 6 7 8
🟦 69 🟩 0 0.16 2 0 2 fewest 5 most 🟩 1 next
🟦 69 🟩 1 0.16 1 0 🟩 0 next

EffectInfo64.txt:

Type Effect Offset Rotation Scale Bone Follow Colour Anim Start
🟦 69 Data\Effect\sparkle29-yellow01.ein 0 50 70 80 0 0 20 🟧 44 1 0 🟩 1 9

See Also

Clone this wiki locally