L4D Mapping Notes

This page contains a rough collection of notes and incomplete articles related to L4D mapping. Most of the sections here will not likely be completed until after Left 4 Dead's SDK is released.'''
== Introduction Sequences ==
In the first chapter, to create the "zoom in effect" the game uses 4 "info_survivor_position" entities and 4 "point_viewcontrol_survivor" entities. Although leaving these 8 entities out won't create any problems, the introduction sequence should at least be considered as a final touch before releasing a map to the public.
* logic_choreographed_scene
* point_viewcontrol_multiplayer
* point_viewcontrol_survivor
* info_survivor_position
* env_fade
* Entity: logic_relay Name: relay_intro_start
:
	OnTrigger	director	ForceSurvivorPosition 	 	0.00	No
	OnTrigger	director	ReleaseSurvivorPosition	 	0.01	No
== The Director ==
Instead of fixed spawn points for enemies, Left 4 Dead uses the "Director" to place enemies and items in varying positions and quantities based upon each player's current situation, status, skill and location. 
* info_director 
:
	OnGameplayStart	relay_intro_start	Trigger	 	0.00	No
=== Creating areas for the infected to spawn. ===
The director will spawn infected that are out of the line of sight, so for particularly difficult maps have plenty of places out of sight. Sometimes a spawn area is outside the normal player boundary. To let the infected into the playable area, there must be a func_ladder on the back side of the barrier, for them to climb over.
== Item and weapon caches ==
Setting spawn flags to randomize the locations.
* weapon_molotov_spawn
* weapon_pipe_bomb_spawn
* weapon_pistol_spawn
* weapon_pain_pills_spawn
* weapon_ammo_spawn
* weapon_smg_spawn
* weapon_first_aid_kit_spawn
* weapon_hunting_rifle_spawn
* weapon_rifle_spawn
* weapon_autoshotgun_spawn
* weapon_pumpshotgun_spawn
* prop_physics
** for the green oxygen tank: models/props_equipment/oxygentank01.mdl
** for the red gas can: models/props_junk/gascan001a.mdl
** for the white propane tank: models/props_junk/propanecanister001a.mdl
** for the fireworks: models/props_junk/explosive_box001.mdl
== Panic events ==
Triggering the info_director and summoning the horde.
* info_game_event_proxy
* ambient_generic
* logic_timer
* Examples
** Car alarms
** Door alarms
** Fire alarms
** Smoke detectors
** Metal detectors
** Explosions
== Crescendo events ==
Intermediate objectives. "Crescendo Events" are much like smaller versions of the big finale battle at the end of each campaign, and occur at interesting places along the way. There setup is very similar to panic events, except that they cannot be skipped. An in-game example being the Waterworks part of No Mercy, the survivors must fend off a horde of infected while they wait for the lift to arrive.
* func_button
* filter_activator_team
* info_game_event_proxy
* logic_relay
:
	OnTrigger	director	PanicEvent	 	1.00	No
== One method for changing levels ==
Add a trigger_changelevel inside the safe house at the end of the level and have it come in contact with the floor space inside the room. The trigger brush doesn't necessarily have to overlap the floor space, but it does have to at least touch it, or a good portion of where the nav square(s) will be generated. If the trigger_changelevel doesn't come in contact with the floor space, you will have nav errors when the map is loaded and may have to manually mark the nav squares.
Make sure the info_landmark is named and that the landmark name is specified inside the trigger_changelevel settings along with the name of the next map to be loaded. For the prop_door_rotating_checkpoint, make sure the model is set to models/props_doors/checkpoint_door_02.mdl and the "Starts Open" option is checked inside the "flags" tab.
== More on building the navigation mesh ==
You need to have the map already compile and loaded, then open up the console in game and type the following:
: sv_cheats 1
: nav_edit 1
: nav_mark_walkable
: nav_generate
: nav_analyze
: nav_edit 0
: sv_cheats 0
The map is reloaded twice during the process, once after nav_generate and again after nav_analyze, but the game should stay in edit mode when the map is reloaded. 
Keep in mind, while the console commands above will build a basic mesh, it will be far from perfect and thus should only be used for testing purposes. A good nav mesh should be thoroughly examined and edited before releasing a map, which can often be a good deal of work depending on the map's structure. For this reason, its recommended that you save fine tuning the mesh until after you are completely finished with the map's layout. Significant changes in a maps structure may render an older nav mesh useless requiring it to be rebuilt from scratch.
== Nav Attribute Descriptions ==
* Relocated to L4D Level Design/Nav Attribute Descriptions
== The Nav GUI ==
* Fog: Whether or not the area has fog associated with it.
* Incoming/Outgoing: (Probably not L4D Specific) Likely used to select areas with incoming or outgoing path information.
* Max Light / Min Light: (Not L4D Specific) Used to select areas that have certain levels of light. (.25 max / 0 min for a dark place, 1 max / .75 min for a bright place)
* Place: (Probably not L4D Specific) "Place" is the term used in nav creation to name specific areas. This is likely a way to select named/unnamed areas only.
== Finale ==
Ending the campaign. In the final chapter of each campaign, the players must defend a position from an onslaught of Infected until a rescue vehicle arrives.
=== Setting up the radio ===
: Entity: trigger_finale
: Name: FinaleRadio
: World Model: models/props/terror/hamradio.mdl
: Start Disabled: No
: First Use Delay: 2
: Use Delay: 2
: Description: This single entity is responsible for starting the finale sequence after being triggered twice.
::
	FinaleEscapeStarted	EscapeRelay	Trigger	 	5.00	No
::FinaleEscapeStarted - ABOUT: Basically means "when the finale is finished, fire this output". This is usually used to trigger a relay to summon the rescue vehicle.
::
=== Adding the rescue vehicle ===
: Entity: logic_relay
: Name: EscapeRelay
: Description: Triggered once the finale sequence has been completed. Starts the escape vehicles animations and moves it to the RESCUE_VEHICLE nav squares. When the vehicle is in place, the func_brush entities used to reach the RESCUE_VEHICLE nav areas are enabled.
::
	OnTrigger	RescueBrush	Open 	 	0.10	No
	OnTrigger	FinaleRadio	FinaleEscapeVehicleReadyForSurvivors	 	3.50	No
::FinaleEscapeVehicleReadyForSurvivors - This "unlocks" the "RESCUE_VEHICLE" nav squares, upon which the survivor bots will rush towards them. Its a good idea to delay this to give the rescue vehicle enough time to get in position.
::
: Entity: func_door, Name: RescueBrush
::
	OnOpen	TriggerEscape 	Enable	 	3.10	No
	OnOpen	RescueBrushRamp	Enable	 	3.10	No
	OnOpen	RescueBrushGate	Close 	 	3.20	No
: Entity: func_door, Name: RescueBrushDr1
:: Starts Open: Yes
:: Parent: RescueBrush
: Entity: func_door, Name: RescueBrushDr2
:: Starts Open: Yes
:: Parent: RescueBrush
: Entity: func_brush, Name: RescueBrushRamp
:: Start Disabled: Yes
:: Solidity: Toggle
: Entity: trigger_multiple, Name: TriggerEscape
: Description: Set to be enabled after the rescue vehicle animation finishes. When activated, triggers the VehicleLeaveRelay.
::
	OnEntireTeamStartTouch	VehicleLeaveRelay	Trigger	 	0.00	No
: Entity: logic_relay, Name: VehicleLeaveRelay
: Description: Used for controlling the rescue vehicle exit animations and firing the OutroRelay
::
	OnTrigger	RescueBrushDr1 	Close 	 	0.00	No
	OnTrigger	RescueBrushDr2 	Close 	 	0.00	No
	OnTrigger	RescueGate 	Open 	 	0.00	No
	OnTrigger	RescueBrushRamp	Kill 	 	0.00	No
	OnTrigger	TriggerEscape 	Kill 	 	0.00	No
	OnTrigger	OutroRelay 	Trigger	 	0.00	No
=== Rolling the credits ===
: Entity: logic_relay, Name: OutroRelay
: Description: Ends the map and starts up the credits screen.
::
	OnTrigger	InstructorFinale	GenerateGameEvent 	 	0.00	No
	OnTrigger	FinaleRadio 	FinaleEscapeFinished 	 	4.00	No
	OnTrigger	FadeOutro 	Fade 	 	5.00	No
	OnTrigger	OutroStats 	RollStatsCrawl 	 	6.00	No
	OnTrigger	FinaleRadio 	FinaleEscapeForceSurvivorPositions	 	7.00	No
	OnTrigger	EndCamera 	Enable 	 	8.00	No
::FinaleEscapeForceSurvivorPositions - This enables the "info_survivor_position" entities to remove players from the battelfield.
: Entity: env_fade Name: FadeOutro
: Entity: env_outtro_stats Name: OutroStats
: Entity: info_game_event_proxy Name: InstructorFinale
: Entity: info_survivor_position Name: survivor_pos1
: Entity: info_survivor_position Name: survivor_pos2
: Entity: info_survivor_position Name: survivor_pos3
: Entity: info_survivor_position Name: survivor_pos4
: Entity: point_viewcontrol_multiplayer Name: EndCamera
== Notes ==
=== Doors ===
:Type: prop_door_rotating
:Frame Dimensions: width: 56, height: 104
:World Model: models/props_doors/doormainmetal01.mdl
Category:Left 4 Dead