Exits and Pipes

There are a number of ways you can complete a level in World of Goo, but by far the commonest is the pipe. see also Ending Levels without a pipe
However it's not the pipe that actually ends the level, it's a levelexit item, but you'll need both.

At it's simplest...

When the Editor creates a new level it includes a levelexit
Move this to where you want it and click the AutoPipe button on the toolbar, and you're almost done!
You just need to set how many balls are required to complete the level... see [ballsrequired]

If you want a little more than the "simplest"...

Pipes in detail

A pipe item is purely visual, it doesn't actually DO anything to the Goo Balls. A pipe just shows the player where they are aiming for, and becomes animated when the exit is open and Goo Balls are collected.
They have a type attibute which controls the colour of the pipe, but it does not affect what types of Goo Balls can or cannot be collected.

Pipes have child vertexes

The vertex items tell the game where to place the mouth of the pipe, where the bends are and where the pipe ends. You can have as many vertexes (bends) in the pipe as you like. However, pipes can only ever run horizontally or vertically and if there is a bend they MUST turn, if they go straight on (or turn back on themselves) the game crashes. The Editor will help you with this.

The first vertex listed is the mouth, it can be moved freely and should be positioned at (or close to) the centre of the levelexit. You should always position this first. Any other vertexes will "snap" into allowed positions as you drag. [Video that shows all of the above stuff about vertexes]

The levelexit

As mentioned above pipes are just visual items, it's levelexits that do all the real work. They control the opening / closing of the pipe, they suck Goo Balls towards their centre when the exit it open, and they allow balls into the pipe (or not). They also display the small puffs of air sucking towards the centre.
The radius attribute affects two functions of the pipe. It sets the detection distance for opening the pipe, if there is an attached Goo Ball within the radius, then the exit and pipe open. It also sets the suction range, (almost*) all Goo Balls within the radius are sucked towards the centre.
But not all Goo Balls will be collected.
Whether or not a Goo Ball is collected is controlled by two things. Some types of Goo Ball can never be collected (those tagged suckable=false; Pokey, Beauty, BlockHead etc). All other Goo Balls can be collected, and you can use the filter attribute to control which are "allowed" in this level.

If filter is empty or missing, then any "suckable" Goo Ball will be collected. Otherwise filter can be set to allow one (or more) specific types of Goo Ball into the exit. When more than one type of Goo Ball is allowed the types should be comma-seperated common,Ivy for example.

Notes

If I have a levelexit do I really need a pipe?
Yes you do. If you don't have a pipe the game crashes when you open the exit.
What does Autopipe do?
Autopipe is just a quick way of getting a simple pipe into your level. What it does is...
Add a pipe item - if there isn't one
Add a vertex exactly at the centre of the levelexit
Add another vertex outside the nearest edge of the level (calculated from scenebounds - link)
NB: Any existing vertexes will be removed, the Editor will warn you of this.
Pipes depth and id attributes
Pipes have a depth attribute, however it appears to be completely ignored by the game. Despite the fact that several pipes in the original levels have non-zero depths, testing reveals that pipes are always drawn at depth=0
Pipes also have an id attribute which has no effect or function on the game.
Given this, both depth and id will be removed in future versions of the Editor.
* About sucked balls
Goo Balls with stacking=true (BlockHead, RectHead, WindowSquare, WindowRect) are immune to the suction of the pipe. And strangely, lose all solidity and cannot be stacked when they are within the radius of an open pipe.
antigrav balls, like balloon, are also immune to the suction when attached. This can make them difficult to get into the pipe.
About the suction
The suction from the levelexit is equivalent to a radialforcefield set to type=gravity with forceatcenter=-40 and forceatedge=-40 and with a high dampening factor. [Link to RadialForceField] Note: this forcefield is set to antigrav=true, which produces odd effects if an antigrav-enabled ball has suckable

Custom Pipes

In addition to the 4 "normal" pipes ('Grey','BLACK','BEAUTY' and 'ISH') it is possible to add your own custom pipes.
You could simply override the original graphics with your own, but this would also change the pipes throughout the original levels. So if you want to keep your special pipes "to yourself" and only use them in your levels... here's how.

Choose a name for your pipe

Something descriptive and "unique"... certainly nothing that has been used before. I used LEMON and since it is case-sensitive you are best sticking to UPPERCASE like the original types.

Create the new graphics

You will almost certainly need to create images for the open and closed mouth and the pipe itself, and it will be easiest if you keep the original naming convention for these images

pipe_horiz_{PIPENAME}
pipeCap_closed_{PIPENAME}
pipeCap_{PIPENAME}


You could also create new images for the bends or corners, although for LEMON I just used the original black corner graphics that are used on the Grey,Black and Beauty pipes.

Add the Pipe Resources

If you plan to use this pipe in just 1 or 2 levels, you should add the resources to the level directly. Import the pipe images into your level then change the resource ids to match the list below. WooGLE will then automatically include the pipe resources and graphics in the goomod.

If you plan to make a level pack or chapter which uses the custom pipe many times, you should add the resources to the global properties/resources.xml.bin. However, you will need to add a merge file and all the necessary graphics to the goomod yourself.

id
path
IMAGE_GLOBAL_PIPE_{PIPENAME}
res/images/levelimages/pipe_horiz_{PIPENAME}
IMAGE_GLOBAL_PIPE_BEND_TL_{PIPENAME}
res/images/levelimages/pipe_bend_tl_{PIPENAME}
IMAGE_GLOBAL_PIPE_BEND_BR_{PIPENAME}
res/images/levelimages/pipe_bend_br_{PIPENAME}
IMAGE_GLOBAL_PIPE_BEND_TR_{PIPENAME}
res/images/levelimages/pipe_bend_tr_{PIPENAME}
IMAGE_GLOBAL_PIPE_BEND_BL_{PIPENAME}
res/images/levelimages/pipe_bend_bl_{PIPENAME}
IMAGE_GLOBAL_PIPE_CAP_OPEN_{PIPENAME}
res/images/levelimages/pipeCap_{PIPENAME}
IMAGE_GLOBAL_PIPE_CAP_CLOSED_{PIPENAME}
res/images/levelimages/pipeCap_closed_{PIPENAME}

Notes about image files:
The paths shown above are for example only, you may use any valid image file for any of the pipe resources.
The image files do not have to be in res/images/levelimages, and if this pipe will only be used in one level it would be best if you put the images in the level folder.
You can use the original black bend images by simply omitting the _{PIPENAME} from the paths for the BEND resources.

Set the pipe type

Finally you need to set the pipe's type attribute.
This must exactly match the {PIPENAME} you used in the resource ids.
NB: You can only enter a "custom" name into type in WooGLE v0.74 and above. If you use a "custom" pipe then it will display as bright red in the level view.

If you want a closer look, or a reference for creating your own pipe, you can download my Lemon Pipe Demo below

AttachmentSize
lemonpipe.goomod15.38 KB

Ending Levels

There are a number of ways you can complete a level in World of Goo, by far the commonest is the pipe, but if you want something a little different there are several other options.

In the original game these other types of "exit" were used almost exclusively on the final level of a chapter. If you use any of these exits you should be aware that on "completion" the player will not be returned to the Chapter 1 Island screen, but to the main World screen. Also these other exits do not display the normal end-of-level sequence (Continue Handle -> Tank -> Level Stats), they jump immediately to any cutscene* then to the World screen.

targetheight

This type of exit was used in "Reguritation Pumping Station", it has a single attribute y which specifies a height.
The level will end if any attached Goo Ball is above this height.
NB: If an attached Goo Ball begins the level above this height, the level will end immediately.

endoncollision

This type of exit was used in "Product Launcher" and "Observatory Observation Station".
The level will end when two particular geometry objects collide (touch).
id1 and id2 are the ids of the geometry objects which must collide. There is one other attribute delay, this specifies the number of seconds after the objects collide, until the level actually ends. During this time the level remains completely playable.

endonnogeom *NEW*

This end condition was not used in any of the original levels, but is in the game code and does work.
Simply, the level ends when there are no dynamic geometry objects remaining.
Dynamic objects can be destroyed in 2 ways...

  • Bombs and exploding Goos, if the geometry is tagged with break=
  • By other geometry tagged as geomkiller

Multiple End Conditions

You may add more than one end condition to your level. In this case if any one of the possible conditions are achieved.. the level will end.

endonmessage

This end condition is used in "Deliverance" and "MOM", and ends the level after a particular message is displayed. If an UndeletePill hits a Ballbuster or a [Mostly]Deadly, it shows the popup, and ends the level if you have endonmessage set to END_DELIVERANCE. Otherwise, it will crash.

*Note: cutscenes are unavailable in the current version of GooTool.

Multiple Exits

It is possible to have multiple levelexit items in a level - but if you don't understand exactly how they work, the results will be confusing, both to you and to the player.

Multiple Pipes

Even if you add multiple pipes to your level, World of Goo will only display the first one you add. WOG Editor now only allows you to add 1 pipe item.

That's not to say you can't have more than one pipe appearing in your level. You can add as many pipe images as you like using SceneLayers, but only the pipe item will be a "real" pipe, and only the "real" pipe will change from closed to "open mouth" when the exit is triggered.

But Remember.. Pipes don't DO anything

Pipes do not SUCK, Pipes do not COLLECT Goo... even 'real' pipes. It's the levelexits that DO things... pipes just look pretty.

Multiple levelexits

In a normal level, with a single levelexit item, the levelexit performs 3 different actions:

  • Trigger: Opens the exit and changes the pipe to the animated "open mouth"
  • Sucker: Pulls goos (free or attached) towards its centre
  • Collector: Accepts Goos and takes them out of the level (providing they match the filter property)

If you have two or more levelexit items in your level though, the first levelexit listed will only be the Sucker. It will not open the pipe when the Goo Balls get close, it will not collect any Goo Balls, and it will ONLY suck when the other exit tells it to. This exit is completely invisible.

The last levelexit listed will be the Trigger and the Collector. When the Goo Balls build close to this exit, it will open the pipe and collect balls. It will not Suck, but it will tell the first exit to suck. This exit will also show the little white "puffs" of air sucking into it.

Any additional levelexits do absolutely nothing.

So what use is an exit that doesn't suck? or one that ONLY sucks?

Well, both exits activate at the same time, when the Goos get to the last exit. This means that an action in one place (triggering the last exit) causes an effect somewhere else (Sucking at the first exit)

I used this effect to create a trap in Gotcha! but it could be used for other things, maybe even helping the Goo Balls somehow.

To be clear:

  • Only ONE exit can ever open the pipe (The last levelexit item added)
  • Only ONE exit can ever Suck (The first levelexit item added)
  • Only ONE exit can ever collect any Goos (The last levelexit item added)

If you only have one levelexit, then first and last are the same, so it does everything. If you have two: know which is which, and what they do.

This video explains the behaviour in the case of multiple exits: