|
|
Line 116: |
Line 116: |
| == Director scripts == | | == Director scripts == |
|
| |
|
| {{Merge|L4D2 Director Scripts}}
| | '''Main Article: [[L4D2 Director Scripts]]''' |
| | |
| {{Warning|}}NEVER use the = operator when trying to influence the director. Use <-. The difference is semantics. If you use =, it will throw an error if the table slot isn't defined (like if a previous script didn't define it). <-, on the other hand, will create the variable if it does not exist.
| |
| | |
| | |
| {{todo|There is a lot more where these came from.}}
| |
| *Director Enumerations {{note|These are (or some are) '''script specific''', hence the duplicate values.}}
| |
| **FINALE_CUSTOM_DELAY = 10
| |
| **FINALE_CUSTOM_PANIC = 7
| |
| **FINALE_CUSTOM_SCRIPTED = 9
| |
| **FINALE_CUSTOM_TANK = 8
| |
| **FINALE_FINAL_BOSS = 5
| |
| **FINALE_GAUNTLET_1 = 0
| |
| **FINALE_GAUNTLET_2 = 3
| |
| **FINALE_GAUNTLET_BOSS = 15
| |
| **FINALE_GAUNTLET_BOSS_INCOMING = 14
| |
| **FINALE_GAUNTLET_ESCAPE = 16
| |
| **FINALE_GAUNTLET_HORDE = 12
| |
| **FINALE_GAUNTLET_HORDE_BONUSTIME = 13
| |
| **FINALE_GAUNTLET_START = 11
| |
| **FINALE_HALFTIME_BOSS = 2
| |
| **FINALE_HORDE_ATTACK_1 = 1
| |
| **FINALE_HORDE_ATTACK_2 = 4
| |
| **FINALE_HORDE_ESCAPE = 6
| |
| **SPAWN_ABOVE_SURVIVORS = 6
| |
| **SPAWN_ANYWHERE = 0
| |
| **SPAWN_BEHIND_SURVIVORS = 1
| |
| **SPAWN_FAR_AWAY_FROM_SURVIVORS = 5
| |
| **SPAWN_IN_FRONT_OF_SURVIVORS = 7
| |
| **SPAWN_LARGE_VOLUME = 9
| |
| **SPAWN_NEAR_IT_VICTIM = 2
| |
| **SPAWN_NO_PREFERENCE = -1
| |
| **SPAWN_SPECIALS_ANYWHERE = 4
| |
| **SPAWN_SPECIALS_IN_FRONT_OF_SURVIVORS = 3
| |
| **SPAWN_VERSUS_FINALE_DISTANCE = 8
| |
| **ZOMBIE_TANK = 8
| |
| **ZOMBIE_WITCH = 7
| |
|
| |
|
| | {{todo|Add a short description of director scripts.}} |
|
| |
|
| === Director options === | | === Director options === |
|
| |
|
| This is by no means an exhaustive list of all the director options. Additions and updates can be found in the [http://forums.steampowered.com/forums/showthread.php?t=1238461 Steam Forums]
| | '''Please see [[L4D2 Director Scripts#DirectorOptions|L4D2 Director Scripts]] for a table of available options.''' |
| *'''A_CustomFinaleX''' = stage type (enumerated PANIC, ONSLAUGHT, DELAY, TANK); where X is the stage number. For scripted panic event or custom finale.
| |
| *'''A_CustomFinaleValueX''' = Value depends on the stage type. Please see example article or official decrypted scripts. For scripted panic event or custom finale.
| |
| *'''AllowCrescendoEvents''' = ??? (not sure what this does)
| |
| *'''AllowWitchesInCheckpoints''' = ??? (not sure what this does)
| |
| *'''AlwaysAllowWanderers''' = true|false
| |
| *'''BehindSurvivorsSpawnDistance''' = Appears to require ''PreferredSpecialDirection = SPAWN_BEHIND_SURVIVORS''
| |
| *'''BileMobSize''' = number of commons that spawn when a bile bomb is thrown. Appears to only work in finale. Found in Dead Center and The Sacrifice finales.
| |
| *'''BoomerLimit''' = maximum number of boomers allowed
| |
| *'''BuildUpMinInterval'''
| |
| *'''ChargerLimit''' = maximum number of chargers allowed
| |
| *'''ClearedWandererRespawnChance''' = percent chance (0-100) that cleared nav areas will get re-populated with wanderers.
| |
| *'''CommonLimit''' = maximum number of commons allowed
| |
| *'''DisallowThreatType''' = ZOMBIE_WITCH, ZOMBIE_TANK (other values???) Ex: c8m1_apartment.nut
| |
| *'''FallenSurvivorPotentialQuantity''' = int
| |
| *'''FallenSurvivorSpawnChance''' = float [0...1]
| |
| *'''DominatorLimit''' {{todo|confirm category/working}}
| |
| *'''GasCansOnBacks''' = true|false
| |
| *'''HunterLimit''' = maximum number of hunters allowed
| |
| *'''IgnoreNavThreatAreas''' = ??? (not sure what this does)
| |
| *'''InfectedFlags''' = INFECTED_FLAG_CANT_SEE_SURVIVORS, INFECTED_FLAG_CANT_HEAR_SURVIVORS, INFECTED_FLAG_CANT_FEEL_SURVIVORS
| |
| *'''IntensityRelaxAllowWanderersThreshold'''
| |
| *'''IntensityRelaxThreshold''' = All survivors must be below this intensity before a Peak is allowed to switch to Relax (in addition to the normal peak timer)
| |
| *'''IntensityThreshold'''
| |
| *'''JockeyLimit''' = maximum number of jockeys allowed
| |
| *'''LockTempo''' = (0/1) Endless panics consist of: spawn horde -> BUILD_UP -> SUSTAIN_PEAK -> RELAX -> spawn horde again. Locktempo = 1 removes the "BUILD_UP -> SUSTAIN_PEAK -> RELAX" bit making your hordes spawn constantly without a delay.
| |
| *'''MaxSpecials''' = number of specials allowed at once
| |
| *'''MegaMobMaxSize''' = maximum megamob size
| |
| *'''MegaMobMinSize''' = minimum megamob size
| |
| *'''MegaMobSize''' {{todo|confirm category/working}}
| |
| *'''MinimumStageTime''' = in seconds Ex: c1m4_delay.nut {{todo|possibly finale or custom panic event specific}}
| |
| *'''MobMaxPending''' = Guessing it's the maximum mob size that can be pending for spawn.
| |
| *'''MobMaxSize''' = max mob size
| |
| *'''MobMinSize''' = min mob size
| |
| *'''MobRechargeRate''' = Guessing it's the speed at which a mob regenerates (ie next mob)
| |
| *'''MobSpawnMaxTime''' = max time in seconds for mob spawn
| |
| *'''MobSpawnMinTime''' = min time in seconds? for mob spawn
| |
| *'''MobSpawnSize'''
| |
| *'''MusicDynamicMobScanStopSize''' = When see fewer than this many of a mob, music stops
| |
| *'''MusicDynamicMobSpawnSize''' = ???Spawning a mob this large can play music
| |
| *'''MusicDynamicMobStopSize''' = When a mob gets to this size we think about stopping the music
| |
| *'''NumReservedWanderers''' = the number of infected that cannot be absorbed
| |
| *'''PanicForever''' * this seems to only work in gauntlets
| |
| *'''PanicWavePauseMax''' (float) {{todo|confirm category/working}}
| |
| *'''PanicWavePauseMin''' (float) {{todo|confirm category/working}}
| |
| | |
| *'''PreferredMobDirection''' = SPAWN_ABOVE_SURVIVORS, SPAWN_ANYWHERE, SPAWN_BEHIND_SURVIVORS, SPAWN_FAR_AWAY_FROM_SURVIVORS, SPAWN_IN_FRONT_OF_SURVIVORS , SPAWN_LARGE_VOLUME, SPAWN_NEAR_IT_VICTIM, SPAWN_NO_PREFERENCE
| |
| | |
| {{note|SPAWN_NEAR_IT_VICTIM does not exist before a finale and will cause an error, so I'm assuming the director picks someone as IT when the finale starts. SPAWN_LARGE_VOLUME is what makes you be a mile away on DC finale.}}
| |
| | |
| *'''PreferredSpecialDirection '''
| |
| {{note|The same values for PreferredMobDirection appear to work, BUT I've also seen the following, I don't know if it's just redundancy or what.
| |
| SPAWN_SPECIALS_ANYWHERE
| |
| SPAWN_SPECIALS_IN_FRONT_OF_SURVIVORS}}
| |
| | |
| *'''PreTankMobMax''' = int {{todo|confirm category/working; possibly gauntlet specific}}
| |
| *'''ProhibitBosses''' = true|false - prohibit tanks/witches
| |
| *'''RelaxMaxFlowTravel''' = 600
| |
| *'''RelaxMaxInterval''' = 5
| |
| *'''RelaxMinInterval''' = 5
| |
| *'''ShouldAllowMobsWithTank''' = true|false
| |
| *'''ShouldAllowSpecialsWithTank''' = true|false
| |
| *'''ShouldConstrainLargeVolumeSpawn''' = true|false
| |
| *'''SmokerLimit''' = maximum number of smokers allowed
| |
| *'''SpawnDirectionMask''' = a bitfield (using SPAWNDIR_N, _NE, _E, etc) of directors to spawn from _relative to_ a map entity named "Compass" in your map. So the idea is that if you are making a mutation in a confined area, put the compass at the middle (angle determines north) and then you can spawn relative directions around it. Note this layers onto the SpawnSetRule - i.e. if you set a POSITIONAL rule south of the compass, and then set a SpawnDirectonMask of SPAWNDIR_N, the Director will never find a valid place to spawn (since the position is saying "pick from this radius south of here" and the mask is saying "now take that list of valid places and find one north")
| |
| *'''SpawnSetRule''' = SPAWN_FINALE, SPAWN_BATTLEFIELD, SPAWN_SURVIVORS, SPAWN_POSITIONAL
| |
| **SpawnSetRadius/SpawnSetPosition: A radius in units, a Vector(x,y,z) center point for POSITIONAL spawning
| |
| *'''SpecialInfectedAssault''' = ??? (not sure what this does)
| |
| *'''SpecialInitialSpawnDelayMin'''
| |
| *'''SpecialInitialSpawnDelayMax'''
| |
| *'''SpecialRespawnInterval''' = time in seconds for special respawns
| |
| *'''SpitterLimit''' = maximum number of spitters allowed
| |
| *'''SurvivorMaxIncapacitatedCount''' = Maximum amount of survivor incapacitating before dying
| |
| *'''SustainPeakMaxTime''' = in minutes
| |
| *'''SustainPeakMinTime''' = in minutes
| |
| *'''TankHitDamageModifierCoop''' = float (mutation1.nut Last Man on Earth) {todo|confirm category}}
| |
| *'''TankHitDamageModifierVersus''' = float {{todo|confirm category}}
| |
| *'''TankLimit''' = maximum number of tanks allowed (for example, used in c7m3_port.nut)
| |
| *'''TankRunSpawnDelay''' = in seconds (mutation19.nut Taaannnkk!) {{todo|confirm category}}
| |
| *'''TempHealthDecayRate''' = 0.27 // pain_pills_decay_rate default, higher values equals quicker decay
| |
| *'''TotalBoomers''' = number of boomers allowed in a wave
| |
| *'''TotalChargers''' = number of chargers allowed in a wave
| |
| *'''TotalHunters''' = number of hunters allowed in a wave
| |
| *'''TotalJockeys''' = number of jockeys allowed in a wave
| |
| *'''TotalSmokers''' = number of smokers allowed in a wave
| |
| *'''TotalSpecials''' = number of specials allowed in a wave
| |
| *'''TotalSpitters''' = number of spitters allowed in a wave
| |
| *'''WanderingZombieDensityModifier''' = float {{todo|confirm category/working}}
| |
| *'''WitchLimit''' = maximum number of witches allowed (used in c7m3_port.nut)
| |
| *'''ZombieSpawnRange''' = How far away can zombies spawn?
| |
| *'''ZombieSpawnInFog''' = true|false
| |
| *'''ZombieTankHealth''' = tanks health
| |
| | |
| *'''function Update()'''
| |
| :If you define an Update() function in your vscript, it will run repeatedly much like a Think() function, but ONLY a finale via [[trigger_finale]] is triggered, if you have multiple scripts that are running that define it, they all will be called. The use of Update() is also found in the Bleed Out mutation (mutation3.nut), but needs further testing to see see if it behaves the same way like during a finale.
| |
| | |
| ==== Finale Specific/Related ====
| |
| A normal finale consists of X number of stages. Some variables in DirectorOptions can only be used during finales.
| |
| *'''A_CustomFinale_StageCount''' = number of stages. Needs to be set for Versus scoring to function properly.
| |
| *'''A_CustomFinaleX''' = stage type (enumerated PANIC, ONSLAUGHT (AKA SCRIPTED), DELAY, TANK), where X is the stage number. Also used in scripted panic events.
| |
| *'''A_CustomFinaleValueX''' = Value depends on the stage type above. Also used in scripted panic events. Please see the example.
| |
| *'''A_CustomFinaleMusicX''' = [[Soundscript]] entry to play. For instance, <code>A_CustomFinaleMusic1 = "C2M5.BadManTank2"</code>. Note that c2m5_concert_finale.nut does not use this method and instead opted to use entities within the map instead. In the c2m5 script <code>A_CustomFinaleMusic4 = ""</code>, suggesting that no song is actually played automatically via script.
| |
| {{note|There is also a D_CustomFinale_StageCount, D_CustomFinaleX, etc. found in c3m4_plantation_finale.nut but the difference between A and D are unknown. B_, C_, and E_ are also available. These are likely used to allow multiple staged panic events and/or a finale in the same script.}}
| |
| *'''EnforceFinaleNavSpawnRules''' = ??? Likely used to enforce the finale spawning behavior without running a finale. {{todo|confirm category/working}}
| |
| *'''EscapeSpawnTanks''' = true|false
| |
| *'''HordeEscapeCommonLimit''' = number of commons allowed when the escape vehicle has arrived
| |
| *'''function OnBeginCustomFinaleStage( num, type )'''
| |
| :If defined, will be called on every stage change with the number, and type, this is how you would change director options between stages (spawn directions, etc). <code>num</code> refers to the finale stage number passed by the director and <code>type</code> is the stage type (PANIC, TANK, etc.).
| |
| *'''function OnChangeFinaleMusic()''' {{todo|confirm category/working}}
| |
| | |
| A stage can be one of 4 types (other values will break the finale and go right to ESCAPE):
| |
| *PANIC - a panic event, the value is the number of them (ie 2 would be 2 panic events in a row)
| |
| *TANK - spawn a tank(s), the value is the number of tanks to spawn
| |
| *DELAY - a delay, the value is the number of seconds to wait before proceeding to the next stage
| |
| *ONSLAUGHT/SCRIPTED - The value should be the name of a vscript to call or "" (which will do nothing), any bad value here will crash you to the desktop. Your onslaught script is responsible for sending an EndCustomScriptedStage input to the director (a goal of your choice, like a certain trigger volume, timer, random value, etc.). [[trigger_finale]] input AdvanceFinaleState may also work. Otherwise, the '''onslaught will not end.'''
| |
| | |
| An example custom finale script:
| |
| {{ScrollBox|<source lang=cpp>
| |
| ERROR <- -1
| |
| PANIC <- 0
| |
| TANK <- 1
| |
| DELAY <- 2
| |
| ONSLAUGHT <- 3 // In some vscripts (c8m5_rooftop_finale), ONSLAUGHT is labeled as SCRIPTED
| |
| | |
| DirectorOptions <-
| |
| {
| |
| //-----------------------------------------------------
| |
| CommonLimit = 10
| |
| A_CustomFinale_StageCount = 8
| |
|
| |
| A_CustomFinale1 = PANIC
| |
| A_CustomFinaleValue1 = 2 // two panic events
| |
|
| |
| A_CustomFinale2 = DELAY
| |
| A_CustomFinaleValue2 = 12 // delay for twelve seconds in addition to stage delay
| |
|
| |
| A_CustomFinale3 = TANK
| |
| A_CustomFinaleValue3 = 3 // 3 tanks!
| |
|
| |
| A_CustomFinale4 = DELAY
| |
| A_CustomFinaleValue4 = 12 // wait some more
| |
|
| |
| A_CustomFinale5 = ONSLAUGHT
| |
| A_CustomFinaleValue5 = "my_onslaught_script.nut" // run our onslaught script
| |
|
| |
| A_CustomFinale6 = DELAY
| |
| A_CustomFinaleValue6 = 15 // wait 15 seconds
| |
|
| |
| A_CustomFinale7 = TANK
| |
| A_CustomFinaleValue7 = 1 // one more tank
| |
| | |
| A_CustomFinale8 = DELAY
| |
| A_CustomFinaleValue8 = 10 // wait ten seconds ... rescue!
| |
|
| |
| SpecialRespawnInterval = 25
| |
| | |
| //-----------------------------------------------------
| |
| }
| |
| | |
| function OnBeginCustomFinaleStage( num, type )
| |
| {
| |
| printl( "Beginning custom finale stage " + num + " of type " + type );
| |
| MapScript.DirectorOptions.CommonLimit = num * 10 // increase commons by 10 linearly with stages
| |
| }</source>}}
| |
| | |
| ==== Gauntlet Specific/Related ====
| |
| Most of these can be found in director_gauntlet.nut
| |
| *'''CustomTankKiteDistance''' (3000 is the default) {{todo|confirm category/working}}
| |
| | |
| Movement Bonus related options. The Movement Bonus successively increases the delay between hordes when the survivors are not making progress toward the Gauntlet goal. The Current Bonus value ticks down every second, allows a horde to spawn when it reaches 0. When a horde spawns the Current Bonus is reset to the Movement Bonus value. The Movement Bonus increases at set intervals, and is reset when the survivors cross the Movement Threshold, which is then incremented. Use ''director_debug 1'' to see the values.
| |
| *'''GauntletMovementThreshold''' = float The amount of flow units the survivors can advance before the Movement Bonus is reset.
| |
| *'''GauntletMovementTimerLength''' = float The interval between each Movement Bonus increase, in seconds.
| |
| *'''GauntletMovementBonus''' = float The initial value, and the amount the movement Bonus increases each interval, in seconds.
| |
| *'''GauntletMovementBonusMax''' = float The maximum value that the Movement Bonus can reach.
| |
| | |
| ==== Mutation Specific/Related ====
| |
| Some of these values are mutation specific values of the global ones (cm_CommonLimit,cm_MaxSpecials, etc.), so use them if you are making a mutation, incase any map scripts are changing the global values.
| |
| | |
| *'''ActiveChallenge'''
| |
| *'''cm_AggressiveSpecials'''
| |
| *'''cm_AllowPillConversion'''
| |
| *'''cm_AllowSurvivorRescue'''
| |
| *'''cm_AutoReviveFromSpecialIncap''' Used by "The Last Man On Earth" and "Lone Gunman" mutations (mutation1.nut and mutation17.nut)
| |
| *'''cm_AutoSpawnInfectedGhosts'''
| |
| *'''cm_BaseCommonAttackDamage'''
| |
| *'''cm_BaseSpecialLimit'''
| |
| *'''cm_CommonLimit'''
| |
| *'''cm_DominatorLimit'''
| |
| *'''cm_FirstManOut''' Used by the "Room For One" mutation (mutation10.nut)
| |
| *'''cm_frustrationTimer'''
| |
| *'''cm_HeadshotOnly'''
| |
| *'''cm_HealingGnome'''
| |
| *'''cm_InfiniteFuel''' (mutation7.nut Chainsaw Massacre)
| |
| *'''cm_MaxSpecials'''
| |
| *'''cm_NoRescueClosets'''
| |
| *'''cm_NoSurvivorBots'''
| |
| *'''cm_ProhibitBosses'''
| |
| *'''cm_CommonLimit'''
| |
| *'''cm_ShouldEscortHumanPlayers'''
| |
| *'''cm_ShouldHurry'''
| |
| *'''cm_SingleScavengeCluster''' Used for scavenge cans to spawn one-by-one
| |
| *'''cm_SpecialRespawnInterval'''
| |
| *'''cm_SpecialSlotCountdownTime'''
| |
| *'''cm_SpecialsRetreatToCover'''
| |
| *'''cm_TankLimit'''
| |
| *'''cm_TankRun''' Used in Taaank! mutation (mutation19.nut)
| |
| *'''cm_TempHealthOnly''' Only temporary health
| |
| *'''cm_VIPTarget'''
| |
| *'''cm_WanderingZombieDensityModifier'''
| |
| *'''cm_WitchLimit'''
| |
| | |
| *'''function AllowWeaponSpawn()'''
| |
| :Returns true or false if the given classname is allowed to spawn, used by several mutations
| |
| *'''function ConvertWeaponSpawn()'''
| |
| :Converts a weapon spawn of given classname to another, used by several mutations
| |
| *'''function ConvertZombieClass()'''
| |
| :Converts one spawn into another, used by the tankss! mutation (mutation19.nut)
| |
| *'''function GetDefaultItem()'''
| |
| :ID starts from 0 and ends in an unknown point. Return a string of a weapon name to make it a default item for survivors. Used in several mutations
| |
| *'''function ShouldAvoidItem()'''
| |
| :Probably a bot related function or spawn related, not sure
| |
|
| |
|
| ==== Scavenge Specific/Related ==== | | == Mode and map scripts == |
| *'''ScavengeClusterBonusTime''' = float {{todo|confirm category/working}}
| |
| *'''ScavengeRoundInitialTime''' = float {{todo|confirm category/working}}
| |
| *'''ScavengeScoreBonusTime''' = float (used in mutation13.nut Follow the Liter)
| |
|
| |
|
| ==== Survival Specific/Related ====
| | {{todo}} |
| *'''SurvivalSetupTime''' = (Used in mutation15.nut for Survival Versus with setup time of 90 seconds)
| |
|
| |
|
| == Third party tools == | | == Third party tools == |