Setting Up Hammer to Create PV Maps
Getting Hammer set up so that you can make maps for PV is simply a matter of going to the steam\steamapps\youraccount\sorcesdk\bin\orangebox\bin folder, opening the GameConfig.txt file and adding the following to the file after the rest of the games listed.
"Project Valkyrie"
{
"GameDir" "c:\PATHTOSTEAM\steamapps\sourcemods\3mm"
"hammer"
{
"GameData0" "c:\PATHTOSTEAM\steamapps\sourcemods\3mm\_fgd\3mm.fgd"
"TextureFormat" "5"
"MapFormat" "4"
"DefaultTextureScale" "0.250000"
"DefaultLightmapScale" "16"
"GameExe" "c:\PATHTOSTEAM\steamapps\YOURACCOUNTNAME\team fortress 2\hl2.exe"
"DefaultSolidEntity" "func_detail"
"DefaultPointEntity" "info_player_deathmatch"
"BSP" "c:\PATHTOSTEAM\steamapps\YOURACCOUNTNAME\sourcesdk\bin\orangebox\bin\vbsp.exe"
"Vis" "c:\PATHTOSTEAM\steamapps\YOURACCOUNTNAME\sourcesdk\bin\orangebox\bin\vvis.exe"
"Light" "c:\PATHTOSTEAM\steamapps\YOURACCOUNTNAME\sourcesdk\bin\orangebox\bin\vrad.exe"
"GameExeDir" "c:\PATHTOSTEAM\steamapps\YOURACCOUNTNAME\team fortress 2"
"MapDir" "c:\PATHTOSTEAM\steamapps\sourcemods\3mm\mapsrc"
"BSPDir" "c:\PATHTOSTEAM\steamapps\sourcemods\3mm\maps"
"CordonTexture" "tools\toolsskybox"
"MaterialExcludeCount" "0"
}
}
Make sure you put the above in the right place in the file: it should come just before the final three lines which read
}
"SDKVersion" "3"
}
Spawning:
Project: Valkyrie handles player spawning in the same way as HL2:DM and most other Source based games (at least from the Level Designer's perspective). Each map must contain at least eight info_player_deathmatch entities. The player will spawn randomly at one of these info_player_deathmatch entities, facing in the direction that is defined by the angles of the entity.
Morph boosters:
In order to give the level designers a little control over the movement and flow of the player in morphball form: we coded an entity called 'func_morphball_booster'. This brush-based entity has two 'modes' which can be switched between by ticking a flag called 'velocity instead of force'. When this flag is ticked the entity will push the ball towards an info_target, which is named in the 'Target to point boost towards' key. The amount of force that will be applied by the push is determined by the 'speed of boost' key.
When the 'velocity instead of force' flag is ticked, the entity will set the speed of the morphball to the value defined in 'speed of boost' and push the entity towards the target. This is useful for levitating the ball (for example I have used it to levitate the player out of the lava tubes in Twin Bridges).
Morph Blockers:
Func_morphball_blocker is a simple entity we created that works just like a brush with the 'toolsplayerclip' texture applied to it. However instead of blocking the player, it blocks only the morphball. You will need to place this brush based entity wherever you want to stop the morphball from going, because toolsplayerclip doesn't stop the morphball.
Morph Pipes:
A lot of people have been asking how I made the morphball pipes that feature in Twin Bridges so I decided to include a mini-tutorial here in this document.
Before you can really understand the morphpipes you need to know a little bit about displacements and the subdivide function. To get you started I suggest you read the following tutorial which I have found to be most useful in my own studies http://www.interlopers.net/index.php?pa ... ls&id=2119
If you feel that you already know plenty about displacements then you can just ignore that tutorial. Soooo lets get started.
A simple, straight, morph pipe with no bends in it is simply four 8 unit thick brushes arranged so that they overlap at the corners by 8 units and form a 64x64 unit hole running down the centre. You then take the verts at each internal corner and drag them towards the centre so that the brushes meet at a diagonal line. This ensures that the internal edges are identical and line up (a necessary requirement for subdivision). Now select the four internal faces and turn them into power of 3 displacements. Finally, with all four displaced faces selected, click subdivide. This creates a straight tube visible only from the inside.
For a visual aid I whipped up this image in paint for you double quick:

If you want the pipe to be visible from the outside as well, you need to displace the four outside faces as well. Select first the four internal faces together and click subdivide. Now select the four outside faces together and click subdivide again. This creates a tube that appears correctly both from the inside and the outside.
If you want the tube to have rounded ends like the glass pipes that go out across the lava in Twin bridges, you displace the end faces as well as the four internal faces and the four external faces, select them all together and click subdivide. That would round out the ends.
To make the pipes that exit into brushwork I have mainly used just the four internal faces and the four end faces and subdivided because that means you can just make a nice neat 80 unit square hole and align the ends of the tube with that. The other way is to select only the internal edges because they will end in a neat 64 unit square. Those are easier to access because there's no lip, but they don't look as good.
Making pipes go around corners is easy if you use my method too. All you need to do is rotate the pipe you already have by 90 degrees, lay it so that it overlaps the existing pipe, and then carve at 45 degrees across the intersection with both pipes selected. Then you just delete the overlapping brushwork, displace the relevant faces, and subdivide.
See this screenshot if that made no sense:

The rest you can probably work out for yourselves. If not just ask in the mapping forum at viewforum.php?f=11 and I'll do my best to answer your question.
The Fighter (Intermediate to Advanced)
I have used two kinds of fighter in Twin Bridges. One type has an engine fireup animation using particles and the other is the same fighter model but scaled for the skybox, with a smoke trail that also uses particles. You will need to know about making brushes follow a set of paths and you will need to know how to use the input/output system.
To use either of these entities simply place a prop_dynamic entity and set the model for either the launch fighter (models/props/twinbridges/fighter/phoenix.mdl) or the skybox fighter (models/props/twinbridges/fighter/phoenix_skybox.mdl).
The movement for both of these entities is handled by parenting the model to a func_tracktrain with the nodraw texture applied and then having the tracktrain follow a set of path_tracks. You can then use the I/O system to trigger animations in the models when the train passes certain path_tracks.
So for example to trigger the launch fighter's engines to warm up you need to add an output to the path track where you want the warmup to happen. This output says: onpass > XXXX (where XXXX = the name of the prop_dynamic) > setanimation > launch. You should also add an output that tells the func_tracktrain to stop and then a third output that tells the func_tracktrain to start again at exactly the right moment (which just happens to be 9.5 seconds).
The animation to trigger for the skybox fighter smoke trails is fly, but you must set the animation to idle when the fighter is not visible or it will eventually fill the whole skybox up with smoke, and trust me, you don't want that.
The Cargo Ship
The cargo ship works in much the same way as the fighters, it's a func_dynamic parented to func_tracktrain. I've then encased it in a trigger hurt which is set to the damage type CARGOSHIP (this gives that funny 'X is not cargo' message when you get killed by it). I then used outputs from the path_tracks to stop the cargo ship when it's on the pad and to disable the trigger_hurt when the cargo ship is stopped.
The Shooter
We also coded up a nice little entity called env_projectile_launcher_skybox that works as a turret to randomly shoot projectiles up into the sky. Simply place one of these in the map and give it a target to make it work. You can set it with various options to fire at different random intervals and for different lengths of time. There are also some nifty outputs that let you trigger events when it starts firing, when it stops firing, or on every single projectile it fires. All of the details are in the help file for the entity so I see no need to go into further detail on the keys here.
The way I did it in Twin Bridges is to have the four projectile launchers all targeted on the same entity and have that entity moving slowly along a path (again by tying it to a func_tracktrain) to give the effect of the launchers tracking an aerial vehicle high above the level.
Lava
There are two special lava textures in Twin Bridges. These take advantage of advances in the Orange Box vmt code to do some cool stuff that I won't go into here. Basically the textures are: maps/lava and maps/lava_superhot
Both of these textures should be applied to a displacement surface for best effect and the displacement surface should have No Physics Collision, No Hull Collision and No Ray Collision checked so that neither the morph ball nor the player model can just walk on top of it. You then place a solid brush beneath the surface to create the effect of the player sinking a small distance into the lava.
The damage is done using a trigger_hurt with the damage type set to LAVA.
Pickup list
pickup_energy_shard
pickup_energy_small
pickup_energy_large
pickup_missile_pack
pickup_supermissile_pack
powerup_megaenergy
powerup_supercharge
Custom Sounds
twinbridges/lava.wav
twinbridges/lava2.wav
twinbridges/lava3.wav
twinbridges/beep2.wav
twinbridges/beep3.wav
twinbridges/beep4.wav
twinbridges/electrichumloud.wav
twinbridges/flyby_mix2.wav (that's the fighters going overhead)
twinbridges/ship_launch.wav (that's for the fighter launch, trigger it at the same time as the animation)
Soundscapes
Twinbridges.bridges
Twinbridges.hangarorlaunch

