Gamestudio WMP files are similar to Quake® or Half-Life® MAP files. They are plain text files that contain the description of the convex shapes (blocks or brushes) that make up the geometry of a BSP tree based level.
A block in a WMP file has the following structure:
block 5 { // sequential number of blocks vertices 8 // number of vertices faces 6 // number of faces 5 -5 40 5 -5 -40 5 5 40 // XYZ coordinates of the vertices 5 5 -40 -5 -5 40 -5 -5 -40 -5 5 40 -5 5 -40 4 1 0 2 3 : heavymetal ( 0 1 0 0 ) ( 0 0 -1 0 ) 0 0 0 1 1 : 0000 0 50 ndef // face 1 4 0 1 5 4 : heavymetal ( 1 0 0 0 ) ( 0 0 -1 0 ) 0 0 0 1 1 : 0000 0 50 ndef // face 2 4 4 5 7 6 : heavymetal ( 0 1 0 0 ) ( 0 0 -1 0 ) 0 0 0 1 1 : 0000 0 50 ndef // face 3 4 3 2 6 7 : heavymetal ( 1 0 0 0 ) ( 0 0 -1 0 ) 0 0 0 1 1 : 0000 0 50 ndef // face 4 4 2 0 4 6 : heavymetal ( 1 0 0 0 ) ( 0 -1 0 0 ) 0 0 0 1 1 : 0000 0 50 ndef // face 5 4 1 3 7 5 : heavymetal ( 1 0 0 0 ) ( 0 -1 0 0 ) 0 0 0 1 1 : 0000 0 50 ndef // face 6 { 0000 // block flags (0000 for unlocked, 00000000000000010000000000000000 for locked textures) ndef // block function (normally ndef) 5 // block index number } }
Structure of a block face:
4 1 0 2 3 : defaulttex ( 1 0 0 -96 ) ( 0 -1 0 -64 ) 0 32 15 1 1 : 00 0 50 ndef 4 // number of vertices for this face 1 0 2 3: // index numbers of the 4 vertices ( 1 0 0 -96 ) ( 0 -1 0 -64 ) // texture vectors t1 and t2 0 32 // x, y offsets in texels 15 // rotation angle in degrees 1 1 // x, y scale factors Without any transformation, the offset, rotation, and scale values are at 0 0 0 1 1. WED calculates the texture vectors from them. After ':' there's a binary 32 bit value of surface flags bit 0 is set when it's a non-shaded surface bits 1,2,3 - flat, sky, water flags bits 13,14 - smooth and mirror flags bits 16..23 - user flags 1..8 0 50 // ambient and albedo of the texture ndef // material of the texture (normally ndef)
The texture vectors t1 and t2 are used for calculating the texture u v coordinates depending on the x y z position of a texel. The following formula is used:
u = t11 * x + t12 * y + t13 * z + t14
v = t21 * x + t22 * y + t23 * z + t24
Therefore with the above example vectors t1 = ( 1 0 0 -96 ) and t2 = ( 0 -1 0 -64 ), the texture formula resolves to:
u = x - 96
v = -y - 64
There are 6 types of objects in a WMP file. Objects have sequential numbers. First, the level itself:
level 0 { // sequential number of objects <office.$$w> // the WAD file used <palette.pcx> // the level palette 30 // the sun angles 45 35 <OFFICE.wdl> // the level script 100.00 100.00 100.00 // the sun color 18.82 18.820 100.00 // the ambient color 100.00 17.64 18.82 // the 4 fog colors 0.00 0.00 0.00 31.37 27.45 27.45 13.72 13.72 13.72 }
A camera position, that only contains a name and possibly an angle:
start 1 { pos_001 }
A light source and a sound source:
light 2 { 78.82 78.82 39.21 300 // the light color and range } sound 3 { <WATER.WAV> // sound file, wav or ogg 0001 // sound flags (normally 1) 20 0 1 1900 // sound volume, pitch, time, and range }
An entity:
model 4 { 1 1 1 // scale <lift1.wmb> // file lift1_mdl_008 // name elevator // entity action 0 0 300 0 3 32 0 0 // skills 0000 // flags 10 // ambient 50 // albedo ndef ndef }
A path:
path 5 { path_001 // name 9 // number of nodes 45 // number of data triplets in the following list 0 0 0 // xyz positions of the nodes -156.000031 -47.000023 -0.000001 -258.000031 14.999981 -0.000012 -303.000031 224.000015 -0.000003 -422.000061 272.999817 -0.000054 -494.000031 338.999969 -0.000062 -494.000061 729 -0.000062 -379.000061 892 -0.00006 -8.000052 894 -0.00006 0 0 0 0 0 0 // 6 skill values per node 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 1 0 0 0 // list of edges: node number, direction, 3 edge skills 2 3 1 0 0 0 3 4 1 0 0 0 4 5 1 0 0 0 5 6 1 0 0 0 6 7 1 0 0 0 7 8 1 0 0 0 8 9 1 0 0 0 9 1 1 0 0 0 }
All objects belong to groups. Groups contain the position, angle, scale, and a list of their objects or sub-groups:
object 25 { // sequential number of groups (-85 68.00 35.99) (0 0 0) (1 1 1) // position, angles, scale object 26, 27, 33 // sub-groups block 13, 17 // blocks belonging to the group model 4 // an entity belonging to the group light 8, 19 // 2 lights belonging to the group }
For compiling a map to the lightmapped BSP tree, WED converts the WMP to a temporary $$M format, which is then sent to the level compiler wwmp2wmb.exe. All textures of the level, from WAD files or external folders, are also convertes to a temporary $$W WAD file. $$M and $$W files can be read by WED in order to recover the level (although without groups) in the case that all other level files and textures are lost.
The $$M file has basically the same content as the WMP file, with the exception that the groups are resolved to the final positions, angles, and scales of the objects. A $$M block:
{ // 1 // sequential block number vertices 8 faces 6 79 -6.99994 47.999981 79 -6.99994 19.999981 79 7.00006 47.999981 // final positions after resolving the group hierarchy 79 7.00006 19.999981 74 -6.99994 47.999981 74 -6.99994 19.999981 74 7.00006 47.999981 74 7.00006 19.999981 4 1 0 2 3 : brownwood ( 0 1 0 0 ) ( 0 0 -1 0 ) : 0000 0 50 ndef // angles, offsets and scale are converted to texture vectors 4 0 1 5 4 : brownwood ( 1 0 0 0 ) ( 0 0 -1 0 ) : 0000 0 50 ndef 4 4 5 7 6 : brownwood ( 0 1 0 0 ) ( 0 0 -1 0 ) : 0000 0 50 ndef 4 3 2 6 7 : brownwood ( 1 0 0 0 ) ( 0 0 -1 0 ) : 0000 0 50 ndef 4 2 0 4 6 : brownwood ( 1 0 0 0 ) ( 0 -1 0 0 ) : 0000 0 50 ndef 4 1 3 7 5 : brownwood ( 1 0 0 0 ) ( 0 -1 0 0 ) : 0000 0 50 ndef { 0000 ndef 1 } }
The block list is followed by a list of objects. The object type is indicated by a number: 1 = position, 2 = light, 3 = static entity (no skills and action), 4 = sound, 5 = sun angles, 6 = path, and 7 = extended entity (with skills and action).
{ 7 // extended entity 299 288.000061 66.789551 // final position 260 0 0 // final angles 1 1 1 // final scale guard.mdl // file name guard_mdl_007 // entity name patrol_prog // action name 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 // skills 00000000000001000000000000000000 // flags 0 // ambient, albedo 50 0 // number of target entity and path, if any 2 }► latest version online