bzw(5) BZFlag bzw(5) bzw-@BZFLAG_VERSION@ 2.99 @BZFLAG_DATE@ 7-11-09 NAME bzw - BZFlag world file format DESCRIPTION The BZFlag world file format describes a world environment that is used by the BZFlag game server, bzfs. X BZW file format The BZFlag world file format describes and environment that includes the game map, physical world attributes, and automatic world weapons. The map may contain a variety of "obstacles" like buildings, pyra- mids, and meshes. These obstacles make up the world that the BZFlag tanks will drive around in. Map attributes may be set to create worlds of various sizes, the default size is 800x800. Here is small example world: # simple world containing a box, pyramid, and mesh world name Simple World size 100.0 end box position -20 -20 0 size 10 20 10 end pyramid position 20 20 0 size 10 10 20 end mesh vertex -10 0 0 vertex 10 0 0 vertex 0 10 0 face vertices 0 1 2 endface end The .bzw file is a plain text file with a relatively simple file format. The format of this text file con- sists of any number of objects listed in any order (except that physics, textureMatrix, dynamicColor, and material must come before they are referenced) separated by newlines and grouped into blocks of types. The list of world types consists of: world info options waterLevel dynamicColor textureMatrix transform material physics define group mesh meshbox meshpyr arc cone sphere tetra box pyramid link teleporter base text weapon zone Each object is described by placing the type on one line, the word end on a following line, and a list of attributes for that object, one per line, in between. The exceptions to the rule are define, face, and mesh weapons; which are concluded with enddef, endface, and endweapon. Attributes may be listed in any order. Attributes have default values, and if that is good enough, the attribute need not be listed. Words are always specified in lowercase. Line comments can be specified by placing a # sign at the start of the line. For documentation purposes, you can tag each object by adding a name attribute. There is no set limit to the number of times you may use any of the objects except for the world, and waterLevel objects, they can only be specified once. The options object contains command line arguments that are used to configure the server's game mode, but can not contain server specific options such as -p, -passwd, and -conf. In the following examples, the values are the defaults. The World object Header for the world. world name example_world size 400.0 flagHeight 10.0 end The Info object A block of text to provide information about the world. info author: bob name: bob_cool.bzw brief: bob's cool BZFlag map date: Jan 01, 2010 email: bob@bobland.bz url: http://bobland.bz/maps/cool/ license: http://creativecommons.org/licenses/by/3.0/us/ end The Options object A world file interface for setting command line options for BZFS. options -set _tankSpeed 36 -j +r -ms 3 +f GM{5} +f SW{5} end The Water Level object Sets how high the water is, in a matter of units. waterLevel name example_waterlevel height -1.0 # anything below 0 turns it off end The Group Definition object Defines a group, which may include other group instances This does not place any objects into the world, a group instance must be used to generate world objects from a group definition. define # You can add any object to a group definition, # except for the following types: # textureMatrix # dynamicColor # material # physics # weapon (use mesh weapons instead) # zone (use mesh face zones instead) enddef The Group Instantiation object Instantiates a group, and possibly modifies subobjects group # a valid group definition reference shift 0 0 0 # (repeatable) scale 1 1 1 # (repeatable) shear 0 0 0 # (repeatable) spin angle nx ny nz # (repeatable) # angle degrees about vector n team 0 # change all base colors within group tint 1 1 1 1 # hierarchically tints objects within this group drivethrough # make all subobjects drivethrough shootthrough # make all subobjects shootthrough ricochet # make all subobjects ricochet phydrv example_phydrv # reassign any valid physics drivers matref example_material # set material properties # (except for the color) matswap oldMat newMat # replace materials in the instance phydrvswap oldDrv newDrv # replace physicsDrivers in face objects textswap oldData newData # replace 'data' in text objects zoneswap oldText newText # replace lines in face zone objects weaponswap oldText newText # replace lines in mesh weapon objects end The Dynamic Color object dynamicColor name example_dyncol # States control ramp 2.0 0.1 0.2 0.3 0.5 # duration, startColor (repeatable) level 3.0 0.1 0.2 0.3 0.5 # duration, levelColor (repeatable) delay 0.0 # delay seconds for color states # BZDB variable control (overrides states control) varName _varname # the BZDB variable name varTime 1.0 # the transition time (in seconds) varNoAlpha # do not use the alpha channel # the BZDB variable should contain a valid color string. # it can also be suffixed with '@ ', which will # override the varTime value for that change. end The Texture Matrix object textureMatrix name example_texmat scale 0.0 0.0 1.0 1.0 # u/v freqs, u/v scales spin 0.0 # rotation freq shift 0.0 0.0 # u/v freqs center 0.5 0.5 # dynamic u/v center (for spin and scale) fixedscale 0.0 0.0 # time invariant u/v scale fixedspin 0.0 # time invariant rotation fixedshift 0.0 0.0 # time invariant u/v shift spinVar varName # BZDB variable, "freq" scaleVar varName # BZDB variable, "scaleU scaleV freqU freqV" shiftVar varName # BZDB variable, "freqU freqV" end Material Properties Material properties may be set on several types of objects, including meshes, mesh faces, arcs, cones, spheres, and tetras. Here are the properties: material name example_material resetmat # restore default values matref material_name # copy another material's properties ambient 0.2 0.2 0.2 1.0 # ambient color diffuse 1.0 1.0 1.0 1.0 # diffuse color (main color) color 1.0 1.0 1.0 1.0 # synonym for 'diffuse' specular 0.0 0.0 0.0 1.0 # specular color emission 0.0 0.0 0.0 1.0 # emission color shininess 0.0 # shininess (0.0 - 128.0) texture filename # set working texture # - non-interlaced PNG # - http:// or ftp:// hyperlinks can be used (no spaces) # - BZFlag default texture names can be used (.png not required) addtexture filename # add texture notextures # specify that no textures are to be used notexalpha # don't use the texture's alpha channel notexcolor # the color is not applied to the texture # if a texture is specified, but not found, the default texture # will be used. if the default texture is also not available, then # the color will be used (untextured) texautoscale 8 8 # world view generated texcoord scales spheremap # use spherical texture coordinate mapping texmat -1 # texture matrix (-1 for none) dyncol -1 # dynamic color (-1 for none) noradar # do not display on radar (except normal mode) noshadow # do not render shadows noculling # do not cull by face winding (double-sided) nosorting # do not do front-to-back alpha sorting nolighting # disable lighting noblending # disable blending alphathresh 0.0 # alpha thresholding value groupalpha # sort translucent faces as a group occluder # faces with this material will occlude end The Physics Driver object physics name example_phydrv relative # make relative to group transformations linear 0.0 0.0 0.0 # x/y/z linear velocities angular 0.0 0.0 0.0 # rotation freq, x/y coordinates radial 0.0 0.0 0.0 # outwards speed, x/y coordinates slide 0.0 # time until max velocity (> 0.0 enables) death Message goes here. # the 'death' property requires a non-blank message linearVar varName # BZDB variable, "vx vy vz" angularVar varName # BZDB variable, "av [px py]" radialVar varName # BZDB variable, "rv [px py]" slideVar varName # BZDB variable, "slideTime" deathVar varName # BZDB variable, "[deathMsg]" end The Mesh object mesh name example_mesh # Material properties applied to a mesh apply to all faces # that follow the setting. Mesh faces will alter their own # properties without affecting the state of the mesh properties. # The same pattern is used to apply physics drivers. vertex 100 200 300 # add a vertex (repeatable) normal 1.0 0 0 # add a normal (repeatable) texcoord 0.1 0.75 # add a texture coordinate (repeatable) inside 5.5 4.5 1.2 # add an inside point (repeatable) outside 0 0 1000 # add an outside point (repeatable) shift 0 0 0 # (repeatable) scale 1 1 1 # (repeatable) shear 0 0 0 # (repeatable) spin angle nx ny nz # (repeatable) phydrv example_phydrv # assign a physics driver smoothbounce # ricochets use normals noclusters # render each mesh face individually face # start a face (repeatable) # the front-face winding is counter-clockwise vertices 1 4 0 3 5 # list of vertices (requires at least three) normals 2 6 0 4 7 # list of normals (optional) texcoords 0 3 2 4 9 # list of texture coordinates (optional) phydrv example_phydrv # assign a physics driver # special parameters baseTeam 1 # the base team number # zone parameters zoneTeam 1 # equivalent to the zone 'team' parameter zoneSafety 0 1 2 3 # equivalent to the zone 'safety' parameter zoneFlag SW # equivalent to the zone 'flag' parameter zoneFixedFlag 1 GM # equivalent to the zone 'fixedFlag' parameter zoneHeight 1.0 GM # specify the zone's height (for weight factor) zoneWeight 0.0 GM # directly the zone's weight zoneCenter # spawns always occur in the zone's center # link parameters linkName myLink # the name use for linkage linkSrcTouch # touching the face will cause teleportation # (tanks do not have to pass through the face) linkSrcRebound # tanks rebound when the far side of the # link is blocked (instead of dropping) linkSrcNoGlow # do not render the foggy 'glow' linkSrcNoRadar # do not render as a teleporter in the radar linkSrcNoSound # do not play the teleport sound linkSrcNoEffect # do not render shot or tank teleported effects linkSrcCenter 0 # vertex index linkSrcSdir 0 # normal index ("Side" normal) linkSrcTdir 0 # normal index ("Top" normal) linkSrcPdir 0 # normal index ("Plane" normal) linkSrcSscale 1.0 linkSrcTscale 1.0 linkSrcPscale 0.0 linkDstCenter 0 # vertex index linkDstSdir 0 # normal index ("Side" normal) linkDstTdir 0 # normal index ("Top" normal) linkDstPdir 0 # normal index ("Plane" normal) linkDstSscale 1.0 linkDstTscale 1.0 linkDstPscale 0.0 endface # end the face # # Mesh weapons # You can attach weapons to mesh geometry. All of the normal # weapon parameters can be used, but the position, rotation, # and tilt parameters will be ignored (posVertex and dirNormal # are used instead). # weapon (repeatable) posVertex 0 # vertex index for the weapon's position dirNormal 0 # normal index for the weapon's direction endweapon # end the weapon # # This next element can be added to increase the rendering speed # of the mesh object. If the client is capable of using this data, # then it is used to draw the mesh instead of the face information. # drawInfo dlist # display list for all material sets decorative # older clients with not see this mesh angvel # rotation about initial Z axis extents sphere corner (repeatable) vertex 0.0 0.0 0.0 (repeatable) normal 0.0 0.0 0.0 (repeatable) texcoord 0.0 0.0 (repeatable) lod (repeatable) lengthPerPixel matref (repeatable) dlist # display list for this material set sphere points 0 (repeatable) lines 0 1 (repeatable) lineloop 0 1 (repeatable) linestrip 0 1 (repeatable) tris 0 1 2 (repeatable) tristrip 0 1 2 (repeatable) trifan 0 1 2 (repeatable) quads 0 1 2 3 (repeatable) quadstrip 0 1 2 3 (repeatable) polygon 0 1 2 (repeatable) end # matref end # lod end # drawInfo end # mesh The Arc object arc name example_arc divisions 16 # number of subdivisions flatshading # flat shading (smooth is default) angle 360 # the sweep angle ratio 1 # (outrad - inrad) / outrad position 0.0 0.0 0.0 size 10 10 10 rotation 0.0 shift 0 0 0 # (repeatable) scale 1 1 1 # (repeatable) shear 0 0 0 # (repeatable) spin angle nx ny nz # (repeatable) phydrv example_phydrv # assign a physics driver smoothbounce # ricochets use normals end The Cone object cone name example_cone divisions 16 # number of subdivisions flatshading # flat shading (smooth is default) angle 360 # the sweep angle position 0.0 0.0 0.0 size 10 10 10 rotation 0.0 shift 0 0 0 # (repeatable) scale 1 1 1 # (repeatable) shear 0 0 0 # (repeatable) spin angle nx ny nz # (repeatable) phydrv example_phydrv # assign a physics driver smoothbounce # ricochets use normals end The Sphere object sphere name example_sphere divisions 4 # number of subdivisions hemisphere # only generate the top half of the sphere flatshading # flat shading (smooth is default) position 0.0 0.0 10.0 size 10 10 10 radius 10 # sets all size values to this value rotation 0.0 shift 0 0 0 # (repeatable) scale 1 1 1 # (repeatable) shear 0 0 0 # (repeatable) spin angle nx ny nz # (repeatable) phydrv example_phydrv # assign a physics driver smoothbounce # ricochets use normals end The Tetrahedron object tetra name example_tetra # there must always be 4 vertices vertex -10.0 -5.0 0.0 vertex +10.0 -5.0 0.0 vertex 0.0 10.0 0.0 vertex 0.0 5.0 10.0 shift 0 0 0 # (repeatable) scale 1 1 1 # (repeatable) shear 0 0 0 # (repeatable) spin angle nx ny nz # (repeatable) end The Box object Adds a simple block. box name example_box position 0.0 0.0 0.0 size 30.0 30.0 9.42 rotation 0.0 end The Pyramid object Adds a triangular shaped object. pyramid name example_pyramid position 0.0 0.0 0.0 size 8.2 8.2 10.25 rotation 0.0 end The Teleporter object Adds an object that places a tank at another teleporter in a different area when ran through. teleporter [name] # the [name] tag is used for linkage name example_teleporter position 0.0 0.0 0.0 size 5.06 4.48 20.16 rotation 0.0 border 1.12 texsize 0.0 # 0.0 sets it to (1.0 / border) end The Link object Adds a route to teleport between a linkSrc and a linkDst. # Teleporter names are terminated with either :f (forward) # or :b (backwards). The forwards link points to 0 degrees, # and the backwards link points to 180. Mesh defined links # use their face ':linkName' string instead of ':f' or ':b'. # Links are made by pattern matching the teleporter names. # The '*' and '?' globbing characters can be used to make # multiple matches. If there are multiple destination matches, # the destination will be selected randomly from the list # of unblocked candidates. If links are created in a group # definition, they can link to teleporters outside of the # definition using the absolute linking syntax (prefix the # teleporter name with the '/' character, for example: # '/other_group/shinyTele:f'). # NOTE: "bzfs -setforced debugLinks 3" will print the linkage table. link name example_link # this will link all teleporters randomly to all other teleporters src * dst * # cumulative labels addSrc src1 src2 ... addDst src1 src2 ... # physics parameters # make the output speed the same as the input speed sameSpeed shotSameSpeed tankSameSpeed # source position scale srcPosScale x y z shotSrcPosScale x y z tankSrcPosScale x y z # source velocity scale srcVelScale x y z shotSrcVelScale x y z tankSrcVelScale x y z # destination velocity offset (using linkDst's S/T/P vectors) dstVelOffset x y z shotDstVelOffset x y z tankDstVelOffset x y z # angle control tankAngle degrees tankAngleOffset degrees tankAngleScale scale tankAngVel degrees_per_second tankAngVelOffset degrees_per_second tankAngVelScale scale # speed blocks shotMinSpeed speed shotMaxSpeed speed tankMinSpeed speed tankMaxSpeed speed # angle blocks shotMinAngle degrees shotMaxAngle degrees tankMinAngle degrees tankMaxAngle degrees # team blocks blockTeams 1 2 3 shotBlockTeams 1 2 3 tankBlockTeams 1 2 3 allowTeams 1 2 3 shotAllowTeams 1 2 3 tankAllowTeams 1 2 3 # flag blocks shotBlockFlags GM ST OO tankBlockFlags GM ST OO shotAllowFlags GM ST OO tankAllowFlags GM ST OO # BZDB variable blocks blockVar varName shotBlockVar varName tankBlockVar varName # Pass messages passText pass message for shots and tanks shotPassText pass message for shots tankPassText pass message for tanks tankPassSound soundFile # pass sound for tanks ('none' to disable) end # or, to link between known teleporters examp_tele1(front) and examp_tele2(back) link name example_realLink src examp_tele1:f dst examp_tele2:b end # you can also use the linkSet object, which allows you to define multiple links in one block, re-using the state within the block. linkSet # this state will be used by all links shotBlockFlags ST CL tankBlockFlags ST CL srcPosScale 0 0 0 addSrc centerTele1:* addSrc centerTele2:* dst teleTeam1:* allowTeams 1 addBiDir # adds bidirectional links between current srcs and dsts dst teleTeam2:* allowTeams 2 addBiDir # adds bidirectional links between current srcs and dsts blockTeams # reset the team blocking state src topTele:* # reset the srcs dst voidTele:* # reset the dsts addLink # adds a single unidirectional link end The Base object Creates a team base where the corresponding team's flag is stored. The oncap option will fire a world weapon of the specified type when the team flag for this base is captured. base name example_base position 0.0 0.0 0.0 size 60.0 60.0 0.0 rotation 0.0 color 0 oncap V end The Text object Creates a text message in the world. Although text objects can not be grouped, they can still use all of the transformation keywords (shift, scale, spin, shear, etc...) Text objects can also use all of the material keywords, but some of them will not do anything (ex: texture). The 'data' value (when not being used as a BZDB variable), can use the following escape characters: short named \\ backslash \n newline \e escape \s space \r red \g green \b blue \y yellow \p purple \c cyan \o orange \w white \d black \+ bright \- dim \* blink \/ noblink \_ under \~ nounder \! reset \# fullreset The 'short' escapes style: '\rred \!then \bblue' The 'named' escapes style: '\(red)red \(reset)then \(blue)blue' text name example_text data my text string # the text, or the bzdb variable name variable # use 'data' as a BZDB variable name font myFontName # the font name, can use URLs justify 0.0 # horizontal justification # 0.0 -> left justify # 0.5 -> center justify # 1.0 -> right justify fontSize 18.0 # the resolution of the font lineSpace 1.1 # vertical space between lines fixedWidth 0.0 # text width control # if > 0, the initial horizontal width (relative to a height of 1) # if < 0, the longest of the lines (useless for single lines) upright # a shortcut for 'spin 90 1 0 0' billboard # orients the text towards the screen polyoffset 0.0 0.0 # polygon offset factor and units lengthPerPixel 0.0 # draw distance cutoff length end The Weapon object Creates a world weapon, or a weapon fired automatically by the world. The weapon can either be timed or be event driven. Timed weapons should use the initdelay and delay fields. Event driven weapons need to use the trigger option to define what the trigger event is. Valid trigger events are; OnCap, for flag capture events. OnSpawn, for player spawn events. OnDie, for player death events. None, no trigger is used. If the weapon is to be triggered only for a specific team then the eventteam option should be used with a team number (1 to 4). A eventteam value of -1 will trigger this weapon for any team. -1 is the default eventteam value. NOTE: see 'The Mesh object', it accepts weapon/endweapon blocks weapon name example_weapon position 0.0 0.0 0.0 rotation 0.0 tilt 0.0 initdelay 10.0 delay 10.0 3.0 5.0 3.0 type V trigger flagcap eventteam V end The Zone object Specifies a certain range in the world, and what attributes that range has. NOTE: see 'The Mesh object', its faces can be used to specify zones. zone name example_zone position 0.0 0.0 0.0 size 1.0 1.0 1.0 rotation 0.0 # where players may spawn team 0 1 2 3 4 # where flag may spawn flag GM SW good bad # dropped team flags will fly to the closest safety zone safety 1 2 3 4 # attach a flag to this zone (always spawn in this zone) # (the 'fixedFlag' keyword is a synonym) zoneflag GM 3 # type, count (type can be a team flag, ex: R*) end FILE SYNTAX The symbol '?' means that the item is optional. The notation {a..b} means that the number of times the item can be present must be between 'a' and 'b', where '*' mean infinity. ('?' is equivalent to {0..1}) angle := 2dpoint := 3dpoint := rgbColor := alpha := rgbaColor := rgbColor alpha? | alpha? (BZWReader.cxx/parseNormalObject) allObjects := "box" | "pyramid" | "base" | "link" | "teleporter" | "mesh" | "arc" | "meshbox" | "cone" | "meshpyr" | "sphere" | "tetra" | "text" | "weapon" | "zone" | "waterLevel" | "dynamicColor" | "textureMatrix" | "material" | "physics" | "transform" (BZWReader.cxx/BZWReader::readWorldStream) Note: Blank lines and lines starting with # are discarded. worldStream := "end" | allObjects | "define" | "enddef" | "group" | "teleporter" ? | "info" | "options" | "include" | "world" (ParseMaterial.cxx/parseMaterials) material := object | "matref" | "resetmat" | "dyncol" | "ambient" rgbaColor | ("diffuse" | "color") rgbaColor | "specular" rgbaColor | "emission" rgbaColor | "shininess" | "texture | "notextures" | "addtexture" | "texautoscale" | "texmat" | "notexalpha" | "notexcolor" | "spheremap" | "noradar" | "noshadow" | "noculling" | "nosorting" | "nolighting" | "alphathresh" | "groupalpha" | "occluder" | "shader" # NOT IMPLEMENTED | "addshader" # NOT IMPLEMENTED | "noshaders" # NOT IMPLEMENTED (WorldFileObject:.cxx/WorldFileObject::read) object := "name" (WorldFileLocation.cxx/readWorldFileLocation::read) location := ("pos" | "position") 3dpoint | "size" 3dpoint | ("rot" | "rotation") | "shift" 3dpoint | "scale" 3dpoint | "shear" 3dpoint | "spin" angle 3dpoint | "xform" | object (WorldFileObstacle.cxx/WorldFileObstacle::read) obstacle := "drivethrough" | "shootthrough" | "passable" | "ricochet" | location (CustomArc.cxx/CustomArc::read) meshbox := "divisions" | "angle" angle | "ratio" | "texsize" | "phydrv" | "smoothbounce" | "flatshading" | material | ("top" | "bottom" | "inside" | "outside" | "startside" | "endside") material | obstacle arc := "divisions" | "angle" angle | "ratio" | "texsize" | "phydrv" | "smoothbounce" | "flatshading" | material | ("top" | "bottom" | "inside" | "outside" | "startside" | "endside") material | obstacle (CustomBase.cxx/CustomBase::read) base := "color" | obstacle (CustomBox.cxx) box := obstacle (CustomCone.cxx/CustomCone::read) meshpyr := "divisions" | "angle" | "texsize" | "phydrv" | "smoothbounce" | "flatshading" | material | ("edge" | "bottom" | "startside" | "endside") material | "flipz" | obstacle cone := "divisions" | "angle" | "texsize" | "phydrv" | "smoothbounce" | "flatshading" | material | ("edge" | "bottom" | "startside" | "endside") material | obstacle (CustomDynamicColor.cxx/CustomDynamicColor::read) dynamicColor := object | "delay" | "ramp" | "level" | "varName" | "varTime" | "varNoAlpha" (CustomGate.cxx/CustomGate::read) teleporter := "border" "texsize" | obstacle (CustomGroup.cxx/CustomGroup::read) group := "team" | "tint" rgbaColor | "phydrv" | "matref" | obstacle (CustomLink.cxx/CustomLink::read) link_spec := | (":f" | ":b")? link := | ("src" | "from") {1..*} | ("dst" | "to") {1..*} | "addSrc" {1..*} | "addDst" {1..*} | "sameSpeed" | "shotSameSpeed" | "tankSameSpeed" | "srcPosScale" 3dpoint | "shotSrcPosScale" 3dpoint | "tankSrcPosScale" 3dpoint | "srcVelScale" 3dpoint | "shotSrcVelScale" 3dpoint | "tankSrcVelScale" 3dpoint | "dstVelOffset" 3dpoint | "shotDstVelOffset" 3dpoint | "tankDstVelOffset" 3dpoint | "tankAngle" | "tankAngleOffset" | "tankAngleScale" | "tankAngVel" | "tankAngVelOffset" | "tankAngVelScale" | "shotMinSpeed" | "tankMinSpeed" | "shotMaxSpeed" | "tankMaxSpeed" | "tankMaxSpeed" | "shotMinAngle" | "tankMinAngle" | "shotMaxAngle" | "tankMaxAngle" | "blockTeams" {0..*} | "shotBlockTeams" {0..*} | "tankBlockTeams" {0..*} | "allowTeams" {0..*} | "shotAllowTeams" {0..*} | "tankAllowTeams" {0..*} | "shotBlockFlags" {0..*} | "tankBlockFlags" {0..*} | "shotAllowFlags" {0..*} | "tankAllowFlags" {0..*} | "blockVar" | "shotBlockVar" | "tankBlockVar" | "shotPassText" | "tankPassText" | "tankPassSound" | object (MeshDrawInfo.cxx/MeshDrawInfo::parseDrawCmd) drawInfoCmd := "points" + | "lines" {2}* | "lineloop" + | "linestrip" {3}* | "tristrip" + | "trifan" + | "quads" {4}* | "quadstrip" {2}+ | "polygon" {3}* (MeshDrawInfo.cxx/MeshDrawInfo::parseDrawSet) drawInfoSet := "matref" | "dlist" | "sphere" 3dpoint | drawInfoCmd (MeshDrawInfo.cxx/MeshDrawInfo::parseDrawLod) drawInfoLod := "lod" | "lengthPerPixel" | drawInfoSet (MeshDrawInfo.cxx/MeshDrawInfo::parse) drawInfo := "drawInfo" | "dlist" | "decorative" | "angvel" | "extents" 3dpoint 3dpoint | "sphere" 3dpoint | "corner" | "vertex" 3dpoint | "normal" 3dpoint | "texcoord" | drawInfoLod (CustomMesh.cxx/CustomMesh::read) mesh := "face" | face | "endface" | "weapon" | meshWeapon | "endweapon" | "inside" 3dpoint | "outside" 3dpoint | "vertex" 3dpoint | "normal" 3dpoint | "texcoord" | "phydrv" | "smoothbounce" | "noclusters" | drawInfo | material | obstacle (CustomMeshFace.cxx/CustomMeshFace::read) face := "vertices" {3..*} | "normals" {3..*} | "texcoords" {3..*} | "phydrv" | "smoothbounce" | "noclusters" | "drivethrough" | "shootthrough" | "passable" | "ricochet" | "linkName" | "linkSrcNoGlow" | "linkSrcNoRadar" | "linkSrcNoSound" | "linkSrcNoEffect" | "linkSrcCenter" 3dpoint | "linkSrcSdir" 3dpoint | "linkSrcTdir" 3dpoint | "linkSrcPdir" 3dpoint | "linkSrcSscale" | "linkSrcTscale" | "linkSrcPscale" | "linkDstCenter" 3dpoint | "linkDstSdir" 3dpoint | "linkDstTdir" 3dpoint | "linkDstPdir" 3dpoint | "linkDstSscale" | "linkDstTscale" | "linkDstPscale" | "zoneTeam" {1..*} | "zoneSafety" {1..*} | "zoneFlag" ("good" | "bad" | ){1..*} | "zoneFixedFlag" <"good" | "bad" | flag_short_name> ? | "zoneHeight" | "zoneWeight" | "zoneCenter" | material (CustomWeapon.cxx/CustomWeapon::read) meshWeapon := weapon | "posVertex" | "dirNormal" (CustomMeshTransform.cxx/CustomMeshTransform::read) transform := "shift" 3dpoint | "scale" 3dpoint | "shear" 3dpoint | "spin" angle 3dpoint | "xform" | object (CustomPhysicsDriver.cxx/CustomPhysicsDriver::read) physics := "linear" 3dpoint | "angular" 2dpoint | "radial" 2dpoint | "slide" | "death" | "linearVar" | "angularVar" | "radialVar" | "slideVar" | "deathVar" | object (CustomPyramid.cxx/CustomPyramid::read) pyramid := "flipz" | obstacle (CustomSphere.cxx/CustomSphere::read) sphere := "divisions" | "radius" | ("hemi" | "hemisphere") | "texsize" | "phydrv" | "smoothbounce" | "flatshading" | material | ("edge" | "bottom") material | obstacle (CustomTetra.cxx/CustomTetra::read) Note: At most 4 vertices can be specified. Note2: material will apply to all vertices when specified first, otherwise like "normals" and "texco- ords" they apply to the previous vertex. tetra := "vertex" 3dpoint | "normals" 3dpoint | "texcoords" 2dpoint | material | obstacle (CustomTextureMatrix.cxx/CustomTextureMatrix::read) textureMatrix := "fixedshift" 2dpoint | "fixedscale" 2dpoint | "fixedspin" angle | "fixedcenter" 2dpoint | "shift" | "spin" | "scale" | "center" 2dpoint | "spinVar" | "scaleVar" | "shiftVar" | object (CustomWaterLevel.cxx/CustomWaterLevel::read) waterLevel := "height" | material | object (CustomWeapon.cxx/CustomWeapon::read) weapon := "initdelay" | "delay" {1..*} | "type" | location (CustomWorld.cxx/CustomWorld::read) world := "size" | "flagHeight" | object (CustomWorldText.cxx/CustomWorldText::read) text := "data" | "bzdb" | "font" | "fontsize" | "justify" | "linespace" | "fixedwidth" | "polyoffset" | "billboard" | "lengthPerPixel" | material | location (CustomZone.cxx/CustomZone::read) zone := "team" {1..*} | "safety" {1..*} | "flag" ("good" | "bad" | ){1..*} | ("fixedFlag" | "zoneflag") <"good" | "bad" | flag_short_name> ? | "height" | "weight" | "center" | location SEE ALSO bzflag(6), bzadmin(6), bzfs(6) Map Making on the BZFlag Wiki: bzw-@BZFLAG_VERSION@ 2.99 @BZFLAG_DATE@ 7-11--0 bzw(5)