allowskip (boolean) (optional, default: true)
Whether the user may skip this level.
autobounds (boolean) (optional, default: false)
If true, the camera bounds are limited to the Explored Area. If false, the <scene> bounds are fixed.
ballsrequired (integer) (optional, default: 1)
Number of balls required in the pipe to exit the level. Not used for levels where there is no levelexit
cursor1color (also 2, 3, 4) (RGB) (optional, default null)
1 for the default cursor colour. 2, 3, 4 are used in manymouse mode in Linux & Wii versions. Used by the levels in Chapter 4 where they are set to 0,255,0; 0,255,255; 0,0,255; 255,0,0.
letterboxed (boolean) (optional, default: false)
Whether to letterbox the display (16:9). false on levels, true on islands.
retrytime (float) (optional, default: 0 )
Retry button will be lit after there are fewer available balls (i.e. suckable, in the pipe/@filter list, not attached or detachable) than ballsrequired or the given time span (i.e. retrytime seconds) has elapsed if retrytime isn't set to zero.
strandgeom (boolean) (optional, default: false)
Whether ball strands interact with geometry. If true, prevents building strands through geometry.
textcolor (RGB) (optional, default: 255,255,255)
Colour of various text effects.
"metres to go", "Made It!", ball count shown at the pipe, !'s from signposts and waking Goo Balls
texteffects (boolean) (optional, default: true)
If set to false, prevents the display of the "metres to go" and "Made it!" text effects.
timebugprobability (float) (optional, default: ~0.5)
The probability per move that a new time bug will appear. It seems that moving the same balls repeatedly will not trigger a new time bug; there must be some clever logic to prevent people stocking up on time bugs..
visualdebug (boolean) (optional, default: false)
When enabled, shows a translucent overlay detailing geometry, balls (including their alignment), and the level exit.
zoomoutlimit (float) (optional, default 0 )
Minimum zoom in this level. Any camera zoom smaller than this will be set to this value.

Child Elements

2 camera
0-1 music
0-1 loopsound
0-n signpost
0-1 pipe
0-n BallInstance
0-n Strand
0-2 levelexit
0-n endoncollision
0-n endonmessage
0-1 endonnogeom
0-n fire
0-1 targetheight


Specify a camera for the given aspect ratio. The game normally uses zoom levels of 1.0 or 0.889 depending on the type of level.


aspect (string) (required)
The aspect ratio under which this camera will be used. Valid values: normal or widescreen.
endpos (2D) (optional, default null)
The camera position upon level completion, while the score shows.
endzoom (float) (optional, default null)
The camera zoom level upon level completion, while the score shows.

Child Elements

1-n poi


POIs specify how the camera moves when the level loads. The last POI dictates the position and zoom of the camera during play. When retrying the level, the game skips directly to the last POI.


pause (float) (required)
How long to display this POI before travelling to the next (or, for the final POI, before allowing play).
pos (2D) (required)
The camera centre position (in world coordinates) for this POI.
traveltime (float) (required)
How long the camera takes to move to the next POI. Irrelevant for the final POI.
zoom (float) (required)
The camera zoom level for this POI.


Defines the background music for this level.


id (resource) (required)
The resource ID of the music to play in the background.


An additional background soundtrack for the level, played on top of the music. Typically used to provide atmospheric effects such as fire.


id (resource) (required)
The resource ID of the sound to play in the background.


A signpost defines a clickable image. Note that the signpost image only includes the actual board. You'll want to add a corresponding signpost pole in a <SceneLayer> on the <scene> as well.


alpha (float) (required)
The opacity of the signpost image, where 1 is completely opaque. Note that all game files currently use a value of 1.
colorize (RGB) (required)
Specifies the colour factor of each RGB component. Most levels use 255,255,255 to use the full colour. "Darker" levels like UpperShaft use 128,128,128 to remove some of the vibrant colour. "Silhouette" levels like ObservatoryObservationStation use 0,0,0 to remove all colour and display only in greyscale.
depth (float) (required)
The visual depth of the signpost image. Affects layering and perspective.
image (resource) (required)
The resource ID of the signpost image.
name (string) (required)
An ID for the signpost that may be referenced elsewhere.
particles (string) (optional, default null)
A particle effect to apply at the signpost's coordinates/depth. Must be a valid particle generator. The game uses this exclusively to apply the effect signpostAlertMom (little black rising bubbles) to MOM's signposts.
scalex (float) (required)
X-scaling of the signpost image.
scaley (float) (required)
Y-scaling of the signpost image.
text (string) (required)
The contents of the signpost to display - a valid string from text.xml.
x (float) (required)
X-position (in world coordinates) of the signpost image.
y (float) (required)
Y-position (in world coordinates) of the signpost image.


Defines the visual exit pipe. Note that this is purely cosmetic; a <levelexit> must exist to cause suction and allow balls to exit. Once sucked, the balls go along the defined pipe.


depth (float) (required)
The visual depth of the pipe.
id (string? integer?) (required)
An unique ID for this pipe in the level. Always 0 in game files.
type (string) (optional, default )
The type of balls this pipe will suck. Note that this is only decorative; it affects the visuals of the pipe. The filter on the levelexit affects the actual sucking. Known values (caps): ISH (only Bit and Pilot balls), BEAUTY (red pipe, only BeautyProduct and BeautyProductEye balls), and BLACK (only common_black balls, used by WeatherVane). These values appear to correspond directly to the IMAGE_GLOBAL_PIPE_xx_yy resources in the global resources.xml

Child Elements

2-n Vertex


A vertex in the exit pipe. The game will draw the pipe between these vertices. There must be at least two.
The vertices should form horizontal or vertical lines, not diagonal.
It isn't allowed to enlongate a line with a third vertex on the same axis. (e.g. 0,0 ; 100,0 ; 200,0)


x (float) (required)
X-position (in world coordinates) of this vertex.
y (float) (required)
Y-position (in world coordinates) of this vertex.


An instance of a ball that is present at level start.


angle (float) (required)
Angle of the ball, North=0 (degrees).
discovered (boolean) (optional, default true)
Whether the ball is discovered (false=sleeping ball).
id (string) (required)
Unique ID for the ball in this level, to be referenced by the <Strand>. The game uses integers beginning from 0, but any string is fine as long as it's unique.
type (string) (required)
The ball type ID of this ball instance (same as the directory name under res/balls/).
x (float) (required)
X-position (in world coordinates) of this ball.
y (float) (required)
Y-position (in world coordinates) of this ball.


A strand between two balls that is already connected at level start.


gb1 (string) (required)
ID of the first ball.
gb2 (string) (required)
ID of the second ball.


The actual point at which a pipe sucks. The <pipe> element only defines the visual appearance of the exit.


filter (string) (required)
A comma-separated list of the balls that will be accepted into this pipe. Empty string to allow all balls. Note that balls that have suckable="false" are automatically excluded.
id (string) (required)
ID of the exit. Generally "theExit".
pos (2D) (required)
X,Y coordinates (in world coordinates) of the exit.
radius (float? integer?) (required)
The suck radius (coordinates unknown - 75 seems unreasonable?) within which balls will be accepted. Always 75 in game levels.


If the level has no pipe, level completion can be triggered by collision of two geometry objects. This is used in the game levels ProductLauncher and ObservatoryObservationStation, both of which end when two geometries touch.


delay (float) (required)
Number of seconds to delay after the collision before the level ends.
id1 (string) (required)
ID of the first geometry object.
id2 (string) (required)
ID of the second geometry object.


If the level has no pipe, the level can end when a specific text message is displayed. This is used by MOM to end when MOM_DESTROY_11 ("I love you, MOM. Goodbye.") is chosen, and in Deliverance on END_DELIVERANCE string is triggered. Since in both cases the strings are programmatically triggered, this seems to be a hack to allow level end on hard-coded triggers.

id (string) (required)
Text string ID or programmatic trigger to end the level on.


This element appears in the game code, but is not used by any current levels, so its functionality, attributes and status is unknown.


A circular fire trigger that can ignite certain balls (whose burntime is set). Note that Ivy balls can "burn" too - they simply display a different particle effect which looks like poison instead.

depth (float) (required)
Visual depth of the particle generator.
particles (float) (required)
ID of the particle generator. Must be a valid particle generator in fx.xml.
radius (float) (required)
Radius (in world coordinates) within which balls will ignite. Does not affect the particle generator/visuals in any way, so it's possible to have a fire whose ignite radius doesn't correspond to its particle generator at all.
x (float) (required)
X-position (in world coordinates) of both the particle generator, and the ignite radius.
y (float) (required)
X-position (in world coordinates) of both the particle generator, and the ignite radius.


Triggers level end when the given height is used. Used by the game level RegurgitationPumpingStation to end the level when the structure flies to a certain height.

y (float) (required)
Y-height (in game coordinates) that a live ball must reach to trigger the end of the level.

Live Balls

The game appears to have a concept of "live" balls. This excludes balls that are sleeping, that are being thrown, or that are falling. Only live balls can trigger expansion of the view area with autobounds, or level exit on targetheight.

One could conjecture that it only includes balls that are in a structure, but that is not true for example in World of Goo Corporation, where a ball walking to one side will trigger bounds expansion.