L4D2 Level Design/Gauntlet Finale: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (Adding info)
m (→‎director_gauntlet.nuc: Removed redundancy)
 
(17 intermediate revisions by 7 users not shown)
Line 1: Line 1:
Gauntlet Finales were introduced into Left 4 Dead 2 with The Parish campaign. Rather than having the player holdout at a specific location, the Gauntlet forces to player to hurry to the end of the level, where the rescue vehicle is already waiting for them. In The Parish, the players must run across a bridge to make it to the evac helicopter. This article will demonstrate how to successfully create a working Gauntlet Finale, and customize it to your liking.
{{LanguageBar}}
{{L4D2 level intro menu}}
{{update}}
{{stub}}
{{l4d2}} Gauntlet Finales were introduced in The Parish campaign. Rather than having the player holdout in an enclosed arena, gauntlets force players to run to the end of the level, where the rescue vehicle is already waiting for them. In The Parish, the players must run across a bridge to make it to a rescue helicopter.


The article assumes that you have a good grasp of working in Hammer and are familiar with the way Left 4 Dead entities work.
You may wish to follow along with the [[Decompiling Maps|decompiled map]] this article is based off of, c5m5_bridge.vmf.


==Safe Room==
== Overview ==
A gauntlet mainly consists of [[L4D Level Design/Finale Events Part 1|standard finale components]] with a few new additions and modifications:


This is where you'll begin your gauntlet, it all begins with a simple safe room. It's highly recommended you use an adequate amount of medkits, as well as throwables and secondary medical items. In The Parish, there are 8 medkits in the saferoom, four throwables, and one melee weapon.
*The [[trigger_finale]] uses "Gauntlet" as Finale Type setting.
*A [[info_target]], named "nav_flow_target" at the end of the map close to the rescue vehicle, but not on navmesh marked with [[List_of_L4D_Series_Nav_Mesh_Attributes|Rescue_Vehicle]]. Else it will be blocked and Nav Flow won't generate.
*Rescue closets are usually absent but should work if they are added. Consider adding one if there is combat before reaching the finale area.
*Finales depend on director_gauntlet.nuc vscript by default, even without setting the "Script File" field.<br>
{{note|Defining a different script in the "Script File" field will first run the default director_gauntlet and second it will launch whatever script you defined.}}


[[Image:l4d_hammer_checkpoint_08.jpg|thumb|right|320px|A simple safe room.]]
The gauntlet finale structure is not very flexible and workarounds should be taken into consideration. Only one tank is allowed before the escape vehicle is ready. director_debug 1 shows that it is considered an escape sequence by the second time GauntletStopPanic is fired at trigger_finale.


== director_gauntlet.nuc ==
This is the original Gauntlet Finale script, should you want to tweak it for your own purposes.
<source lang=js>
Msg("Initiating Gauntlet\n");


DirectorOptions <-
{
PanicForever = true
PausePanicWhenRelaxing = true


===Map Layout===
IntensityRelaxThreshold = 0.99
----
RelaxMinInterval = 25
RelaxMaxInterval = 35
RelaxMaxFlowTravel = 400


[[Image:Footlocker02.png|thumb|A Simple Safe Room.]]
LockTempo = 0
SpecialRespawnInterval = 20
PreTankMobMax = 20
ZombieSpawnRange = 3000
ZombieSpawnInFog = true


This is the most important part of the finale, the path the players take to their escape. It's important to keep in mind that the map needs many obstacles or walls for the infected to spawn behind, otherwise the finale will not function as intended. It's also important to keep in mind that players need help to know where they're going; either the map can be directionally linear such as The Parish Gauntlet, or it can be dynamic to your likings, just be sure to give the player hints where to go.
MobSpawnSize = 5
CommonLimit = 5


GauntletMovementThreshold = 500.0
GauntletMovementTimerLength = 5.0
GauntletMovementBonus = 2.0
GauntletMovementBonusMax = 30.0


===The Entities===
// length of bridge to test progress against.
----
BridgeSpan = 20000


MobSpawnMinTime = 5
MobSpawnMaxTime = 5


MobSpawnSizeMin = 5
MobSpawnSizeMax = 20


minSpeed = 50
maxSpeed = 200


===The Rescue Vehicle===
speedPenaltyZAdds = 15
----


CommonLimitMax = 30


function RecalculateLimits()
{
//Increase common limit based on progress 
    local progressPct = ( Director.GetFurthestSurvivorFlow() / BridgeSpan )
   
    if ( progressPct < 0.0 ) progressPct = 0.0;
    if ( progressPct > 1.0 ) progressPct = 1.0;
   
    MobSpawnSize = MobSpawnSizeMin + progressPct * ( MobSpawnSizeMax - MobSpawnSizeMin )


===The Navigation Mesh===
----


//Increase common limit based on speed 
    local speedPct = ( Director.GetAveragedSurvivorSpeed() - minSpeed ) / ( maxSpeed - minSpeed );


    if ( speedPct < 0.0 ) speedPct = 0.0;
    if ( speedPct > 1.0 ) speedPct = 1.0;


===Custom Gauntlets===
    MobSpawnSize = MobSpawnSize + speedPct * ( speedPenaltyZAdds );
----
   
    CommonLimit = MobSpawnSize * 1.5
   
    if ( CommonLimit > CommonLimitMax ) CommonLimit = CommonLimitMax;
   


}
}


function Update()
{
DirectorOptions.RecalculateLimits();
}
</source>


{{note|This article is a work-in-progress. It is currently being updated.}}
=== Tips ===
==== Bridge Span Value ====
The script has a "BridgeSpan" Setting which determines how long the Gauntlet area will be, which is used to calculate progression in Versus.<br>
This Value is in units, which can easily be taken in [[Hammer]] by just creating a brush entity with one side at the [[trigger_finale]] while the other is where the rescue vehicle will be.<br>
As seen in the picture below, this brush entity will be 20096.0 units wide. So the script is set to 20000 units to make the numbers round.
[[File:Gauntlet bridge span helper.png|1500px|left]]
{{clr}}
 
==See also==
[[L4D2 Level Design]]
 
{{NavBar|L4D2 Level Design/Scavenge Finale|L4D2 Level Design|L4D2 Level Design/Custom Finale}}
 
[[Category:Left 4 Dead 2]]

Latest revision as of 18:53, 5 August 2025

English (en)中文 (zh)Translate (Translate)
Broom icon.png
This article or section needs to be updated to include current information regarding the subject.
Remember to check for any notes left by the tagger at this article's talk page.

Stub

This article or section is a stub. You can help by expanding it.

Left 4 Dead 2 Gauntlet Finales were introduced in The Parish campaign. Rather than having the player holdout in an enclosed arena, gauntlets force players to run to the end of the level, where the rescue vehicle is already waiting for them. In The Parish, the players must run across a bridge to make it to a rescue helicopter.

You may wish to follow along with the decompiled map this article is based off of, c5m5_bridge.vmf.

Overview

A gauntlet mainly consists of standard finale components with a few new additions and modifications:

  • The trigger_finale uses "Gauntlet" as Finale Type setting.
  • A info_target, named "nav_flow_target" at the end of the map close to the rescue vehicle, but not on navmesh marked with Rescue_Vehicle. Else it will be blocked and Nav Flow won't generate.
  • Rescue closets are usually absent but should work if they are added. Consider adding one if there is combat before reaching the finale area.
  • Finales depend on director_gauntlet.nuc vscript by default, even without setting the "Script File" field.
Note.pngNote:Defining a different script in the "Script File" field will first run the default director_gauntlet and second it will launch whatever script you defined.

The gauntlet finale structure is not very flexible and workarounds should be taken into consideration. Only one tank is allowed before the escape vehicle is ready. director_debug 1 shows that it is considered an escape sequence by the second time GauntletStopPanic is fired at trigger_finale.

director_gauntlet.nuc

This is the original Gauntlet Finale script, should you want to tweak it for your own purposes.

Msg("Initiating Gauntlet\n");

DirectorOptions <-
{
	PanicForever = true
	PausePanicWhenRelaxing = true

	IntensityRelaxThreshold = 0.99
	RelaxMinInterval = 25
	RelaxMaxInterval = 35
	RelaxMaxFlowTravel = 400

	LockTempo = 0
	SpecialRespawnInterval = 20
	PreTankMobMax = 20
	ZombieSpawnRange = 3000
	ZombieSpawnInFog = true

	MobSpawnSize = 5
	CommonLimit = 5

	GauntletMovementThreshold = 500.0
	GauntletMovementTimerLength = 5.0
	GauntletMovementBonus = 2.0
	GauntletMovementBonusMax = 30.0

	// length of bridge to test progress against.
	BridgeSpan = 20000

	MobSpawnMinTime = 5
	MobSpawnMaxTime = 5

	MobSpawnSizeMin = 5
	MobSpawnSizeMax = 20

	minSpeed = 50
	maxSpeed = 200

	speedPenaltyZAdds = 15

	CommonLimitMax = 30

	function RecalculateLimits()
	{
	//Increase common limit based on progress  
	    local progressPct = ( Director.GetFurthestSurvivorFlow() / BridgeSpan )
	    
	    if ( progressPct < 0.0 ) progressPct = 0.0;
	    if ( progressPct > 1.0 ) progressPct = 1.0;
	    
	    MobSpawnSize = MobSpawnSizeMin + progressPct * ( MobSpawnSizeMax - MobSpawnSizeMin )


	//Increase common limit based on speed   
	    local speedPct = ( Director.GetAveragedSurvivorSpeed() - minSpeed ) / ( maxSpeed - minSpeed );

	    if ( speedPct < 0.0 ) speedPct = 0.0;
	    if ( speedPct > 1.0 ) speedPct = 1.0;

	    MobSpawnSize = MobSpawnSize + speedPct * ( speedPenaltyZAdds );
	    
	    CommonLimit = MobSpawnSize * 1.5
	    
	    if ( CommonLimit > CommonLimitMax ) CommonLimit = CommonLimitMax;
	    

	}
}

function Update()
{
	DirectorOptions.RecalculateLimits();
}

Tips

Bridge Span Value

The script has a "BridgeSpan" Setting which determines how long the Gauntlet area will be, which is used to calculate progression in Versus.
This Value is in units, which can easily be taken in Hammer by just creating a brush entity with one side at the trigger_finale while the other is where the rescue vehicle will be.
As seen in the picture below, this brush entity will be 20096.0 units wide. So the script is set to 20000 units to make the numbers round.

Gauntlet bridge span helper.png

See also

L4D2 Level Design