Now that we know a little bit about how the editor is organized and how to find our way around the viewports, it's time to take a look at how to make BSP architecture.
First, a quick note about how the UnrealEd universe works. Although the 3d viewport looks empty, the entire universe starts out completely filled up. To make our levels, we have to carve holes into this filled up space which we can then add smaller parts back into. This system is an improvement over engines like Half Life's, where even a microscopic hole into the void can make a level unplayable.
The Active Brush and Primitive Shapes
This section of the toolbar at the left of the editor is used to create primitive shapes such as cubes and cylinders which we can manipulate to make our level. Right-clicking one of these brings up a property menu which can be used to adjust the number of sides, hollowness, etc. Pressing one of these buttons causes the red Active Brush to appear in the viewports, this brush is our "rubber stamp" that we use to create our architecture. It is only viewable in the editor and does not show up in the game.
Cube - Height, width, and breadth can be manually set in the property menu. If Hollow is set to True, the cube's Wall Thickness can be adjusted here too. In addition, the cube can be set to Tessellated, which shows each face as two triangles instead of one square.
Curved Staircase - Inner radius of the curve can be set, as well as the height and width of each step along with the number of steps. The total angle of the staircase can be set, as well as making it counter-clockwise instead of the default clockwise direction. An additional height to be added below the staircase can also be added.
Spiral Staircase - Inner radius of the curve can be set, as well as height, width and thickness of each step. The number of steps per 360 degrees and total number of steps can be set. The top and bottom surfaces can be set to either Sloped = True, which makes them a smooth ramp, or Sloped = False, which makes them stairs. A clockwise or counter-clockwise direction can also be set.
Linear Staircase - Height, width, and length of the steps can be set, as well as the number of steps and an additional height to be added to the bottom of the staircase.
BSP Based Terrain - I do not recommend using this primitive in UT2003, normal terrain looks much better, is easier to manipulate, and runs faster. Height, width, and breadth can be manually set in the property menu of BSP Based Terrain, as well as the number of width and depth segments.
Sheet - Height and width can be manually set, as well as the number of horizontal and vertical segments. The axis that the sheet is oriented to can also be set. IMPORTANT NOTE - No matter what the properties of sheets are set to, they can never be solid and will not block players or weapons. These are mainly used for 2d decorations like spider webs, and for zoning off a level.
Cylinder - Height, outer radius and number of sides can be set manually. If Hollow is set to True, inner radius can be adjusted as well. If AlignToSide is left True, the edges of the cylinder will line up with the grid. If set to False, the vertices at the corner will line up with the grid.
Cone - Height, outer radius, and number of sides can be set. If Hollow is set True, the inner radius and cap height can be set. AlignToSide can also be set as with cylinders.
Volumetric - These should not need to be used in most cases. They were used in UT1 to create the illusion of 3d fire and chains etc, which can be made with emitters or meshes in UT2003. Height and radius can be set as well as the number of sheets.
Sphere - As with BSP Based Terrain, I would not recommend using this primitive. Using static meshes would look better and run faster. Radius and sphere extrapolation can be set. Values larger than 4 can slow down or crash the editor.
Manipulating the Active Brush
Ok, now we can turn the Active Brush into the shape that we want, but these shapes are way too basic, and more importantly, it's always at the origin! In this section I will show you how to manipulate the Active Brush and do simple vertex editing to get the exact shape we want to use.
Moving the Active Brush - This is best done in one of the 2D viewports, it works the same in the 3D viewport but the direction is hard to control. To move the Active Brush, click on it to highlight it in one of the viewports. Hold Ctrl, then hold the left mouse button down and move the mouse to make the Active Brush move. Another way to move it is by holding Shift instead of Ctrl, this causes the camera to follow the movement. The change in position will not show up in the 3D viewport until you click on it. This can be changed by clicking on the joystick icon at the top of the viewport (NOT the one in the top toolbar that tests the level). Clicking this makes the viewport change to Realtime Preview mode, which among other things shows brush movements as they happen. This can be used in all four viewports, although if you have a slower computer you might only want to have the 3D viewport set to do this.
The brush automaticaly snaps to the grid when moving. For fine tuning, you can adjust the size of the grid using the scroll-box in the bottom toolbar. In addition, to the left and right of the scroll box are toggle buttons for turning the movement and rotation grids on or off. IMPORTANT NOTE - Turning the grids off is NOT RECOMMENDED. Doing so can cause slight misalignments in your brushes, which in addition to looking sloppy in game, will take more time for the engine to calculate (making it slower) and gives a greater chance for BSP errors (holes in your level) to form.
Rotating the Active Brush - Similar to moving the Active Brush. To rotate it, hold down Ctrl and the right mouse button, and move the mouse left for clockwise or right for counter-clockwise. Holding Shift instead of Ctrl causes the camera to rotate with the brush. If you want to rotate the brush around a different point, the brush origin (small red plus sign) can be moved by holding Alt and the left mouse button.
Selecting this button in the left toolbar lets you rotate the brush as well. The only added benefit to using this is that holding Ctrl with the left mouse button rotates it along another axis instead of moving it.
Be sure to select the camera button to be able to move the brush again, and to avoid accidentally rotating it.
Scaling the Active Brush - There are two ways to scale the Active Brush. The first way is by manually entering numbers in the Drawscale3D boxes in the bottom toolbar.
The boxes scale the brush in the X, Y and Z directions respectively. It is best to use whole numbers to avoid the same problems that turning the grid off would give us.
Selecting the Actor Scaling button in the left toolbar lets us do the adjusting more quickly, and it is easier to get the scale right. With this selected, highlight the Active Brush in one of the 2D viewports, then hold Ctrl. Now, holding the left mouse button and moving the mouse left and right scales the brush in the left and right direction, while holding the right mouse button and moving the mouse up and down scales it in the up and down direction. The direction is independent of the axis, so it works the same in all three of the 2D viewports. IMPORTANT NOTE - After scaling the Active Brush, it will stretch and distort if you try to rotate it. To keep it from doing this, after scaling the brush right click it and select Transform >> Transform Permanently. This "sets" the brush so that it can be rotated properly.
Another effect selecting the Actor Scaling button has is when you move the brush with the Shift button, it leaves behind a "ghost" showing you where the brush was while it is being moved.
Vertex Manipulation - Care must be taken when moving the Active Brush vertices. All of the vertices of a face must line up along a plane. If we were to take one of the top vertices of a cube and move it up as in the following picture, the top surface is no longer planar and a BSP error will appear in the game, most likely a Hall Of Mirrors (HOM) effect where the last image to be displayed in the affected area remains there in a repeating loop.
One way to move vertices is to simply click on it in the 3D viewport, then hold Alt and drag it in the 2D viewports with the left mouse button. Clicking on them in the 2D viewport only selects the top one, and if a bottom vertex is selected in a 2D viewport it will not move. Another problem, particularly with cylinders and cones, is that the vertices sometimes will not snap to the grid. In this case usually selecting another vertex then selecting the problem one again and moving it around will work. Also, after vertex manipulation, if you create another primitive sometimes it will be "knocked off" the grid, as in the following picture:
If this happens, the easiest way to correct it is to right click it and select Reset >> Move To Origin.
Another way to move vertices is to use the Vertex Editing button in the left toolbar. With this selected, both vertices can be selected and moved at the same time in the 2D viewports. Click on a corner to highlight the vertices, then hold Ctrl and move them with the left mouse button. Individual vertices can still be selected in the 3D viewport with this tool.
Taking Her Sweet Time Getting To The First Room
Once you have practiced creating and manipulating primitives using the Active Brush, it is time to make our first room. For simplicity's sake we'll start out with cube shapes. Right click the Cube primitive to bring up the property menu, then leave it at 256 for height, and put 1024 for width and breadth and hit Build. Remember that our universe starts out filled up, so we must now subtract our cube from it.
Hitting the subtract button in the left toolbar now would create our first room, but unless you have already selected a texture it will display the Default Texture. Go ahead and press the button (They look similar, but Subtract is the one on the top right) to see what it would look like.
Hit Undo to get rid of the subtraction (You might have to hit it a few times if you accidentally selected a polygon or vertex etc). How do we avoid using the default texture? If you remember from Part One of this tutorial, I showed you the browsers in the top toolbar. Press the button to open the Texture Browser now.
With the texture browser open, press the Open button and double click on the first file in the texture folder, which should be AbaddonArchitecture.utx. The file will load and the textures will be displayed in the browser. If you scroll down the list, you'll see that the selection looks kind of limited. This is because the browser is set by default to display only the first group in that texture package. To see the rest of them, you can use the toolbar just above the browser viewport.
Using the scroll box will display textures in the different groups, while pressing All displays all the textures in that file. For our room, it would save time to choose a wall texture since most of the surfaces are walls, so deselect All and select the Wall group. For this tutorial I will choose the first one in the group, but you can select any one you want, or open up another texture package altogether to find one you like. Click on the texture you have selected, then close the texture browser and hit the Subtract button. Move the Active Brush out of the way and you will see our room as a yellow brush in the 2D viewports, and in the 3D viewport we will see our first room.
Changing Textures - That's a little bit better, but the floor and ceiling don't look right at all. There are two different ways to change the textures on surfaces. The first way is to click on it in the 3D viewport (Holding Ctrl to select more than one), then clicking a texture in the Texture Browser. Another way is to select a texture in the Texture Browser, then hold Alt and click on a surface to apply the texture. Try replacing the textures on the floor and ceiling with better looking ones using each method.
An Important Note About Scale - Next we will learn how to scale and manipulate textures, but how do we know what will be the right size for the game? What does 256 units mean anyway? When I first started level editing, it didn't occur to me to use something to get the scale right, and a room I made ended up being enormous. From then on, I always placed a player in the editor so I could see exactly how big things were. To do this, open the Actor Browser and select Pawn >> UnrealPawn >> xPawn. Right click in any of the viewports and hit 'Add xPawn Here'. A Jugg will appear, which you can move and rotate the same way as you did the Active Brush. Move him so he's standing on the floor in the middle of the room. Now we're ready to adjust our textures.
Aligning Textures - As you start adding more rooms and decorations to your level, the textures will not always line up correctly. This is particularly true if you have scaled the Active Brush. It is always a good idea to align the textures on your brushes. To do this, right click the surface (Or hold Ctrl to select multiple surfaces and right click the last one) and select Alignment >> Planar Walls/Planar Floor, depending on which one it is. An even easier way to align the textures in our first room is to right click one of them and hit Select Surfaces >> Matching Brush, then right click again and hit Alignment >> Box. The wall textures may move and not look right anymore, but they can be adjusted later.
Adjusting Textures - Right now the most noticeable problem is our floor is way too big. To bring up the surface's properties so we can change this,we can use one of four ways:
1) Right click it in the 3D viewport and select Surface Properties.
2) Highlight it in the 3D viewport and hit the Surface Properties button in the top toolbar.
3) Highlight it and select View >> Surface Properties in the top menu.
4) Highlight it and hit F5.
Select the Pan/Rot/Scale tab to see the texture manipulation options. At the bottom is the Scaling box. You can either choose a value from the Simple scroll down box or enter your own value, which will scale both the U and V values by the same amount, or enter separate values into the U and V boxes below it. Clicking on Relative will change the scale by a percentage of what it is already at. For the texture I used, scaling it to .25 looks right.
Now to adjust our walls. You can either hold Ctrl and select all of them individually, or right click one and hit Select Surfaces >> Adjacent Walls. Open up their properties and select the Pan/Rot/Scale tab. Clicking on the Pan buttons will move the texture in the U (Side to side) or V (Up and down) directions, and holding Shift will pan it in the opposite direction, in case you missed the obvious note on the right hand side. For my wall texture, I scaled it down to .5 and panned it 256 V units to line it up correctly.
For the ceiling, experiment with the Rotation property. I left mine scaled to 1.0 and rotated it 45 degrees.
Textures can also be panned and rotated using the tools in the left toolbar. Using these buttons gives you better control over how the textures line up. For panning, hold on to Ctrl and use the left or right mouse buttons to pan in the U and V directions respectively. For rotating, hold Ctrl and use either mouse button to rotate it.
Now that we know how to make a room, try scaling the Active brush down and using the Add button (next to Subtract) to place a few pillars near the sides. If you move the Active Brush out of the way you will see that Adds are blue. Choose an appropriate texture for your pillars and align them properly. You can also use Subtracts to make hallways leading from your room to others. If we wanted to make another room at the end of the hallway exactly the same as our first one, we can easily duplicate it. There are two ways to select all of the brushes that make our room. The first one would be to hold Ctrl and click on each of them in the 2D views. Sometimes rooms get a bit complicated, and we may not be able to click on a brush in any of the 2D views. In this case we would use the other way of selecting them. Make sure you have the Camera button in the left toolbar selected, then move your mouse past one corner of the room, above or below and off to one side in one of the 2D viewports. Hold Ctrl and Alt, then left-click and drag your mouse to the opposite corner. You should see a red box form around the room. Let go of the mouse button and everything that has a vertex inside the box will be selected. Now that we have our room selected, right-click part of it and hit Duplicate. The duplication appears one grid unit below and to the right of the original. Now you can move them as one to the end of the hallway.
IMPORTANT NOTE - If you make any changes to BSP brushes or if you duplicate brushes, you will have to use the Rebuild button in the top toolbar to see your changes. Since we haven't added any lighting, only use the Build Geometry button for now.
Now we have learned how to create BSP architecture using the Active Brush, and more advanced use of BSP will be discussed in Part Four of this tutorial. But it is quite obvious that it would take forever to make levels with the amount of detail found in UT2003 with BSP architecture alone. This next section will discuss the use of Static Meshes, the most important change from UT to UT2003. Static meshes are rendered faster by the engine than BSP geometry, so they can have a much higher polygon count and add much more detail to your levels.
Important Note About Static Meshes - Static Meshes are additive only. They cannot be used to subtract from the level, and they cannot be subtracted from. If any part of a Static Mesh is visible, the engine will render all of its polygons, even if they are not visible to the player.
Open up the Static Mesh browser and open the first file in the Static Mesh folder, AbaddonHardware. The file will load and a mesh will be displayed in the viewport. Navigation in the viewport is the same as in the normal 3D viewport. The Static Mesh browser works the same way as the Texture Browser, with meshes divided into different groups. Use the scrollbar above the viewport to look through the groups, or press All to see all the meshes in that file.
Adding Static Meshes to our level is easy. Click on the one you want in the list on the left side of the Static Mesh browser. Now, in one of the viewports, right-click and select 'Add Static Mesh'. Be careful not to click on the player pawn we have added or any of the BSP brushes in the 2D viewports, it will not bring up the right menu. Now our static mesh can be seen in the viewports, a big mess of aqua lines in the 2D viewports, and colored green in the 3D viewport. Static Meshes can be moved the same way as anything else.
If we click somewhere else to deselect the mesh, it turns black in the 3D viewport. This is because we have not added any lights to our level. For now, click on the Textured view in the toolbar at the top of the 3D viewport, or click anywhere in the 3D viewport and hit Alt-6.
Scaling Static Meshes - There are several ways of scaling Static Meshes. The first way is by using the DrawScale3D boxes in the bottom toolbar. We don't have to be worried about Static Meshes creating holes in our level, so you can use decimal values here without worrying about it. The second way is by using the Actor Scaling tool in the left toolbar, the same way we scaled the Active Brush. Note that if you use this method, you will have to Build Geometry to see the changes. The third method scales the Static Mesh in all three directions at once. Right-click it and hit StaticMeshActor Properties, or just double click it. Click open the Display tab and scroll down to the DrawScale box. Values entered here will change the scale. Note that the DrawScale3D box below it is the same as the one in the bottom toolbar.
Negative values can be entered for static meshes, a value of -1 would mirror the mesh. This is useful for asymmetric ones.
Changing Static Mesh Textures - First, a quick note about changing textures on static meshes. The original texture for the static mesh will still be loaded, so changing textures slightly increases the amount of work the engine has to do. For the most part it is negligible, but try not to do an excessive amount of it.
To change the textures that the Static Mesh uses, open up its properties and click open the Display tab again. Scroll down to Skins. Click on it and two buttons will appear on the right, Empty and Add. Click Add and a box labeled  will appear below it with None written in it. Select a texture in the Texture Browser and hit Use in the  line, and the texture's name should appear in the box. Depending on how many textures were used to make the mesh, you might have to hit Add a few times and experiment with it to find the one you want to change. If the only one you want to change is the third one for example, you can leave the first two at None. If you change your mind you can either Clear that one line or hit Empty in the Skins line to delete them all.
Lighting is the easiest thing to learn, but the hardest to master. It takes a lot of practice to figure out how to make good lighting, and this is where a lot of your level making time in the editor should be spent. Now that we have reached this part of the tutorial, click on the Dynamic Lighting view in the 3D viewport toolbar.
To add a light to your level, right click in any of the viewports and hit 'Add Light Here'. This adds a point-source light to your level, meaning the rays are emitted from it in every direction. Hit the Build All button in the top toolbar to properly apply the lighting to the level, then double click the light so we can take a look at some of its properties.
Light Brightness - This value can be set between 0 and as high as you want, but the common end point is 255, the highest value you were able to set lights in the original UT. Lights brighter than this will wash out the textures of your level, and you will rarely need to use lights close to 255 brightness.
Light Hue - This changes the light color, can be set from 0 to 255. The following chart should help when deciding a light color.
Light Saturation - Setting a light color will not do much if it is still set at full saturation. The more toward 0 it is set, the more color will be in the light. This chart is an example using purple as the light hue:
The lightbulb in the viewports will show you what hue and saturation it is set to, this is another change from UT1 to UT2003, and is helpful for quickly finding sources of light in your level.
In general, you want to avoid the "disco lighting" syndrome. A lot of different colors in one room will not look good most of the time. There are exceptions of course, don't be afraid to experiment with good use of color in your maps, your personality and style should be reflected in the levels that you make.
The only things I want to cover for the second set of lighting properties are bSpecialLit, Light Effect, and Light Type. bSpecialLit is used when you want to light something up separately. Select a surface in one of your rooms and open up the Surface Properties box. In the Flags tab, there is a check box for Special Lit. Click it and close the property box, then rebuild lighting. You will notice that the surface is completely black now. This is because it will only be affected by lights with bSpecialLit set to True. Add another light to the room, and set bSpecialLit to True. Make it a different color than the one that is already there so you can see the difference, then Build Lighting.
Static Meshes can also be set to Special Lit. Open up its properties and click open the Lighting tab, then set bSpecialLit to True.
A light can also be set to use an effect in the Light Effects scroll box, but LE_TorchWaver, LE_FireWaver and LE_WateryShimmer are obsolete (Use Projectors instead). You can also set them to flicker or pulse by selecting one of the effects in the Light Type scroll box. Experiment to see what each one does. Once again, you will want to avoid overusing these effects.
Now that we have completed the basic visual aspects of level design, it is time to look at the gameplay. In part four of this tutorial, we will learn how to create simple paths for the player bots to use, and take a look at a few things in the Actor Browser. We will also look at a few advanced uses of BSP.
By now you should know enough to make all of the geometry for your level, and light it up properly. In this part of the tutorial we are going to make a simple path network to teach the bots how to navigate your level, and add weapons and items.
PlayerStarts and Items
Up until this point you have been unable to test your level, if you try it gives you an error telling you that there are no Player Starts. Let's go ahead and add those now. Open up the Actor Browser and go to NavigationPoint >> SmallNavigationPoint >> PlayerStart. Right click in your level and select 'Add PlayerStart Here'. If you rebuild now you might get an error message saying "Navigation point not on valid base, or too close to steep slope". This is caused by the PlayerStart actor being too high off of the ground. To have the editor correct it for you, right click on the PlayerStart and hit Align >> Align To Floor.
The PlayerStarts are directional, when you select one you can see the red arrow pointing from it. When a player starts at this location they will be facing in that direction, so it is a good idea to point them away from walls etc. One player start will not work for a multiplayer game, so we need to add a few more. Think about how many players you are designing your level for, then add a few more player starts than you need and spread them around the level. Try to start them in out of the way places so they don't start in high traffic areas where they can be spawn-killed easily.
Now we need some weapons and ammo. For the weapons, add an xPickUpBase >> xWeaponBase to your level. Open up its properties, and in the xWeaponBase tab is the selection box for what weapon it is. If you don't like having the base itself there, you can simply move it slightly underneath the floor. Also, if you don't like the sparkly effect coming from it, you can open up the PickUpBase tab and set SpiralEmitter to None. All of your ammo can be found in the Actor Browser under Pickup >> Ammo >> UTAmmoPickup, while things like Adrenaline and Shield Packs are under Pickup >> TournamentPickUp. Try not to add too much or too little ammo, and definitely do not overuse weapons like the Redeemer or items like Shield Packs.
This is enough for human opponents to be able to play your level, but bots will stand around for the most part, unless they see a weapon or item nearby. Computer AI is not smart enough to be able to figure the level out by itself, so we need to tell it how to navigate our level. More complicated things like Jumpspots and elevators will be not be covered here, but I will show you how to make a simple path network for the bots to follow. The actor we will be using is a NavigationPoint >> Pathnode. They use an apple icon (Don't ask, I have no idea either), and should be placed at intersections along the paths you want them to follow. Items and Weapons act as pathnodes as well, so you do not need to place one on top of them. In the following example picture, I have labeled the Player Starts purple, and the weapon, a rocket launcher, red. To make the bots able to run through all of the passages, I would place Path Nodes at the points marked by a green dot.
Once you have your nodes in place, either do a Build Paths or a Build All for the editor to create the path network. Once it is done, you can see the path network by right-clicking on any of the viewport toolbars and selecting View >> Show Paths. Do not worry about the color of the paths for now. If any of them do not connect, make sure they have a good line-of-sight to each other and that they are not too close to any walls. Let's take a look at how my example path network turned out:
Notice that the paths go through all of the passages in the level. When building your path network, you want the bots to act human, so place the Path Nodes how you would run through your level, not just right along the center of every hallway. If you would run from one corner of a hall to the opposite corner because it would be faster, put the Path Nodes so the bots will do the same thing. Do a lot of testing with your path network in place to make sure the bots do not get caught up on any of the level geometry or do not go down certain paths. You might have to move or add Path Nodes to fix any problems with your network.
For the last section of this tutorial, I will cover some more things you can do with BSP. We already know how to use Add and Subtract in that section of the toolbar, now let's see what else we can do.
Intersect and Deintersect - The two tools below Add and Subtract can be used to manipulate the Active Brush. To see the effects, create a small cube and place it at the corner of one of our pillars.
Pressing Intersect gets rid of all parts of the Active Brush that are in empty space:
Deintersect gets rid of all parts of the Active Brush that are in solid space:
This can be used to make complicated shapes with the Active Brush that we can use in other parts of the level. Note that any surface of the resulting Active Brush in contact with the level's geometry will keep the texture and texture settings of that surface even if you have a different one selected in the Texture Browser. You might need to change them once you add or subtract the Active Brush if it is not the one you want.
Add Special - Mostly unused, the only thing we are going to look at is Zone Portals. Let's take a look at our example map again, this time I've added a hallway and another room to the end. Press the Zone/Portal View button in the 3D viewport toolbar and you will see that the entire level is all one color group. The engine sees the entire level as one zone.
Zoning off a level helps the engine render BSP faster by helping it figure out what polygons it has to display. Zone sheets should be kept as small as possible, they should not be used in wide open spaces much. Good places for zone portals are hallways or doors between rooms. Create a sheet large enough to completely cover our hallway, then click the Add Special button. Select Zone Portal from the scroll box and hit Ok. The sheet will be displayed as a green brush. Click the Build All button and take a look at our level again:
Zoning off a level helps your level run a little faster in UT2003, but the majority of optimization comes from Antiportals, which will be discussed next.
Add Mover - Movers are a topic all their own and will not be discussed in this basic tutorial.
Add Antiportal - In UT2003, BSP does not occlude, meaning that although the player can not see through walls, the engine does, and it will render every mesh in the player's view even if it is in another room. To prevent this, we use Antiportals. Putting Antiportals in walls prevents the engine from seeing meshes in another room, although if any part of a mesh can be seen, the entire mesh will be rendered. Let's take a look at our example map, where I've added a tank mesh at one end of the room:
If we create a sheet with the Active Brush large enough to cover the entire mesh, it will disappear when we add an Antiportal:
Antiportals should be created as sheets. They are kind of picky, sometimes when you add them they won't block anything. I found that adding them right next to the surface of walls works good, also inside large static meshes to block ones behind them. Be careful not to add antiportals where they would block a mesh that the player is SUPPOSED to see, for instance in a doorway. As the player passes through the door, all the meshes on the other side would suddenly appear, which wouldn't look good. Also, remember that it takes time for the engine to calculate which meshes would not be seen, so make sure that using an Antiportal would be worth it. You would not want to use an Antiportal to block just one mesh with 8 triangles, for instance.
Add Volume - Volumes are used in UT2003 to change the physics in an area, or just to let the player know where they are. Volumes can be any shape. They will not be discussed here.
You now know enough to start making basic levels. In general you want to minimize using BSP, some levels only have the main subtraction brush with the entire level built from Static Meshes inside it. You want to keep your poly count as low as you can, this can be viewed by typing STAT RENDER in the Command line in the bottom toolbar and looking around your level in the 3D viewport with Realtime Preview on. The numbers you want to look at are BSP >> Render ms and StaticMesh >> Triangles ms. Using the same Static Mesh over and over takes less time for the engine to render than a lot of different static meshes with the same number of triangles, keep that in mind when making your levels. Use Antiportals to optimize your level after you have all the geometry finished to keep the framerate up.
There are plenty of tutorials out there that cover more advanced topics, take a look at my other tutorials to give you an idea of some things you can do in the editor. Keep practicing and you will be able to make great levels pretty quickly. If you are serious about game design, don't get discouraged at first. Above all, don't fall into cliches. Keeping your own style will set your levels apart and give the community unique maps to play. I hope this tutorial was helpful, if you have any questions feel free to email me at BAGZY2oo3@yahoo.co.uk.