Left 4 Dead 2/Scripting: Difference between revisions
Rayman1103 (talk | contribs) |
Rayman1103 (talk | contribs) m (→L4D2 Client) |
||
Line 56: | Line 56: | ||
**Mutators | **Mutators | ||
***Will automatically run the script with the same name as the game mode. | ***Will automatically run the script with the same name as the game mode. | ||
***For example, running a map <code>map <map name> | ***For example, running a map <code>map <map name> mutation12</code> will automatically load realismversus script. | ||
*Events | *Events | ||
**Finale | **Finale |
Revision as of 06:32, 9 August 2011
Left 4 Dead 2 vscripts are Squirrel language-based scripts that can be run in-game to perform various in-game tasks and changes.
For examples, please see L4D2 Vscript Examples.

Description
Left 4 Dead 2 vscripts are written in Squirrel, a compilable scripting language similar to Lua.
Some uses of vscripts include:
- Director manipulation - onslaughts, reserved wanderers, complete emptiness/silence, prohibition of boss infected (tanks and witches), direction of mobs, specific spawning behavior
- Finale - Custom sequences of events, Gauntlet and Scavenge Logic
- Mini-games found in Dark Carnival - entity manipulation, counters, timers, prop spawning
- Model manipulation - green diesel cans attached to survivors in Hard Rain
- Mutations
- Much more!
The file extensions of vscripts are .nut and .nuc, where .nut files are human readable using a text editor. Official .nuc script files are located in scripts/vscripts in the following locations:

- Within left 4 dead 2\left4dead2\pak01_dir.vpk
- left 4 dead 2\left4dead2_dlc1\pak01_dir.vpk
- April 22, 2010 The Passing update
- left 4 dead 2\left4dead2_dlc2\pak01_dir.vpk
- October 5, 2010 The Sacrifice update
- left 4 dead 2\update\pak01_dir.vpk
- this is where mutations are updated/replaced almost weekly.
Some entities that accept vscripts as inputs or as a setting include info_director, logic_script, and trigger_finale.
Decrypting nuc-files
.Nuc files are ICE encrypted .nut files. The encryption key is SDhfi878. You can use VICE to decode them.
Packages with deciphered official scripts are also available.
Practicing the Squirrel language
Developers that would like to practice Squirrel can quickly set up an environment to do so. It can be as simple as opening up L4D2 and executing scripts from the console. One can also set up a light-weight squirrel interpretor from Windows Command Prompt:
Windows Command Prompt
- Download and extract the Squirrel interpretor binary (Version 2.2, 32-Bit) to any folder. sq.exe is the interpretor. sq.exe can also be created by compiling from source code.
- Any scripts within that folder are executed with the command
sq filename.nut
via Windows Command PromptTip:There are sample scripts included with the compiled binary. Try running something simple first, like the "Hello, World!" script.
sq hello.nut
- Optional: Set up a path to sq.exe within the Environment Variables in Windows. This allows convenient execution of .NUT scripts from any folder from the Command Prompt. Go to System Properties via the Control Panel, select the Advanced tab, and click the Environmental Variables button. Under System Variables select the Variable "Path" and click on the Edit button. Add the full path to sq.exe (for example, C:\Squirrel, where sq.exe is located in C:\Squirrel) to the other paths to the Variable Value. Restart the Command Prompt and
sq filename.nut
should be able to work from any folder.
Documentation and generic sample scripts can always be found at the official Squirrel Language site.
L4D2 Client
- info_director
- Loads DirectorOptions such as onslaughts, panic events, infected limits, etc.
- Can be loaded in console with ent_fire command
ent_fire <targetname of info_director> BeginScript <name of script>
- logic_script
- The vscript that is set up in the logic_script will load automatically on load
- The vscript can be reloaded with console command
script_reload_code
- Entity features thinkfunction, an interesting keyvalue that calls a user-defined function every 0.1 seconds
- Game Modes Todo: see if it also applies to coop, versus, etc.
- Scavenge
- A per-map script is loaded automatically during Scavenge Mode
- Name the script <map name>_scavenge.nut.
- For example, c1m4_atrium_scavenge.nut.
- Mutators
- Will automatically run the script with the same name as the game mode.
- For example, running a map
map <map name> mutation12
will automatically load realismversus script.
- Scavenge
- Events
- Finale
- "Script" KeyValue of trigger_finale does not need to be set up
- Automatically loads <map name>_finale.nut script on finale trigger
- Known to work in this fashion in Custom and Scavenge finale type (set up in trigger_finale)
- Finale
Scripting samples
Please see L4D2 Vscript Examples.
Director options
This is by no means an exaustive list of all the director options. Additions and updates can be found in the Steam Forums (Broken link)
- AlwaysAllowWanderers = true|false
- BehindSurvivorsSpawnDistance = Appears to require PreferredSpecialDirection = SPAWN_BEHIND_SURVIVORS
- BileMobSize = NUM ? Doesn't seem to do anything
- BoomerLimit = maximum number of boomers allowed
- BuildUpMinInterval
- ChargerLimit =maximum number of chargers allowed
- CommonLimit = maximum number of commons allowed
- DisallowThreatType = ZOMBIE_WITCH, ZOMBIE_TANK (other values???) Ex: c8m1_apartment.nut
- EscapeSpawnTanks
- HordeEscapeCommonLimit = number of commons allowed when the escape vehicle has arrived
- HunterLimit = maximum number of hunters allowed
- 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 ???
- MaxSpecials = number of specials allowed at once
- MegaMobMaxSize = maximum megamob size
- MegaMobMinSize = minimum megamob size
- MinimumStageTime = in seconds Ex: c1m4_delay.nut Todo: possibly finale or custom panic event specific
- MobMaxPending = not sure
- 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 less 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
- 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

- PreferredSpecialDirection

SPAWN_SPECIALS_ANYWHERE
SPAWN_SPECIALS_IN_FRONT_OF_SURVIVORS- 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
- 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
- TankLimit = maximum number of tanks allowed (for example, used in c7m3_port.nut)
- TankRunSpawnDelay = in seconds Todo: Test in different modes, maybe specific only to mutation scripts.
- TempHealthDecayRate = 0.27 // pain_pills_decay_rate default, higher values equals quicker decay
- WitchLimit = maximum number of witches allowed (used in c7m3_port.nut)
- ZombieSpawnRange = How far away can zombies spawn?
- ZombieSpawnInFog = true|false
- 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.
- function OnBeginCustomFinaleStage()
- 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:
function OnBeginCustomFinaleStage( num, type ) { printl( "Beginning custom finale stage " + num + " of type " + type ); // set options as wanted for the stage }
Gauntlet Specific/Related
- GauntletMovementThreshold
- GauntletMovementTimerLength
- GauntletMovementBonus
- GauntletMovementBonusMax
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_BaseCommonAttackDamage
- cm_BaseSpecialLimit
- cm_CommonLimit
- cm_DominatorLimit
- cm_FirstManOut Related to a broken mutation
- cm_frustrationTimer
- cm_SingleScavengeCluster Used for scavenge cans to spawn one-by-one
- cm_SpecialRespawnInterval
- cm_SpecialSlotCountdownTime
- cm_TankLimit
- cm_TankRun Used in Taaank! mutation (mutation19.nut)
- cm_TempHealthOnly Only temporary health
- cm_HeadshotOnly
- cm_HealingGnome
- cm_InfiniteFuel
- cm_MaxSpecials
- cm_NoRescueClosets
- cm_NoSurvivorBots
- cm_ProhibitBosses
- cm_ShouldHurry
- 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()
- Propably a bot related function or spawn related, not sure
Finale scripts
Some variables in DirectorOptions can only be used during finales.
A normal finale consists of X number of stages
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 - 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 to the director (a goal of your choice, like a certain trigger volume, timer, random value, etc.). Otherwise, the onslaught will not end.
You can also specify custom game sounds for a stage by adding a key, for instance A_CustomFinaleMusic1 = "C2M5.BadManTank2"
An example custom finale script:
PANIC <- 0 TANK <- 1 DELAY <- 2 ONSLAUGHT <- 3 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 }
Overview of Squirrel in L4D2
The following are available in L4D2 by default.[1][2]
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.
Variables
Classes
CDirector
Game Instance: Director
- Class Methods
- Clear() - Wipe Director Options
- GetAveragedSurvivorSpan() - Get the distance between the lead and trailing survivors, smoothed over time
- GetAveragedSurvivorSpeed() - Get the rate at which the lead survivor is moving along the flow, smoothed over time
- GetCommonInfectedCount() - GetCommonInfectedCount (no longer is there a need to count another way)
- GetFurthestSurvivorFlow() - Get the maximum distance along the flow that the survivors have reached
- GetGameMode() - Get the current game mode "versus", "coop", etc.
- GetPendingMobCount() - Returns the number of infected waiting to spawn
- HasAnySurvivorLeftSafeArea() - True when one or more survivors have left the starting safe area
- IsAnySurvivorInCombat() - Returns true if any survivor recently dealt or took damage
- IsPlayingOnConsole() - Returns true if player is running the client on a console like Xbox 360
- IsSinglePlayerGame() - Return true if game is in single player
- IsTankInPlay() - Returns true if any tanks are aggro on survivors
- IsValid()
- L4D1SurvivorGiveItem() - This makes l4d1 survivors give an item
- PlayMegaMobWarningSounds() - Plays a horde scream sound and asks survivors to speak 'incoming horde' lines
- ResetMobTimer() - Trigger a mob as soon as possible when in BUILD_UP (refer to
director_debug 1
) - UserDefinedEvent1()-UserDefinedEvent4() - Generic "user defined script event" hook that can be fired from Squirrel and fires outputs on the director entity in the map, OnUserDefinedScriptEvent1-4. For an example, refer to c7m3_port_finale.nut and the info_director entity output list in c7m3_port.vmf.
- 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
CEntities
Game Instance: Entities
- Class Methods
- .FindByClassname (null|prev,classname) - Find entities by class name. Pass 'null' to start an iteration, or reference to a previously found entity to continue a search Continue an iteration over the list of entities, providing reference to a previously found entity
- .FindByClassnameNearest (classname, vector) - Find entities by class name nearest to a point
- .FindByClassnameWithin (null|prev,classname) - Find entities by class name within a radius. Pass 'null' to start an iteration, or reference to a previously found entity to continue a search
- .FindByModel (null|prev, modelname) - Find entities by model name. Pass 'null' to start an iteration, or reference to a previously found entity to continue a search
- .FindByName (null|prev, entname) - Find named entities. Pass 'null' to start an iteration, or reference to a previously found entity to continue a search.
- .FindByNameNearest (name, vector) ??? - Find entities by name nearest to a point
- .FindByNameWithin (null|prev, name, radius) ??? - Find entities by name within a radius. Pass 'null' to start an iteration, or reference to a previously found entity to continue a search
- .FindByTarget (null|prev, targetname) - Find entities by targetname. Pass 'null' to start an iteration, or reference to a previously found entity to continue a search
- .FindInSphere (null|prev, vector,radius) ??? - Find entities within a radius. Pass 'null' to start an iteration, or reference to a previously found entity to continue a search
- .IsValid() - whether entity is valid
- .First() - Begin an iteration over the list of entities
- .Next(null|prev) - Returns the next entity in the Entities list
CBaseEntity
Game Instance: N/A
- Class Methods
- .__KeyValueFromInt(key,int) - Sets a keyvalue from an integer, the keys available for all __KeyValue are from the DEFINE_KEYFIELD in baseentity.cpp (classname,rendermode, renderfx, etc.)
- .__KeyValueFromString(key,string) - Sets a keyvalue from a string, the keys available for all __KeyValue are from the DEFINE_KEYFIELD in baseentity.cpp (classname,rendermode, renderfx, etc.)
- .__KeyValueFromVector(key,vector) - Sets a keyvalue from a vector, the keys available for all __KeyValue are from the DEFINE_KEYFIELD in baseentity.cpp (classname,rendermode, renderfx, etc.)
- .ConnectOutput(outputname,functioname) - Adds an I/O connection that will call the named function when the specified output fires
- .DisconnectOutput(event) - Removes a connected script function from an I/O event
- .FirstMoveChild() - returns entity's first move child if exists
- .GetClassname() - returns classname
- .GetForwardVector() - returns Vector instance
- .GetHealth() - returns entity health
- .GetMoveParent() - If in hierarchy, retrieves the entity's parent
- .GetName() - returns targetname of entity (if entity is named)
- .GetOrigin() - returns origin vector
- .GetPreTemplateName - Get the entity name stripped of template unique decoration. ie myitem&0125 returns myitem
- .GetRootMoveParent() - If in hierarchy, walks up the hierarchy to find the root parent
- .GetScriptId() - Retrieve the unique identifier used to refer to the entity within the scripting system
- .GetScriptScope() - Retrieve the script-side data associated with an entity
- .GetVelocity() - returns velocity vector
- .IsValid() - whether entity is valid
- .NextMovePeer - returns next child entity
- .SetForwardVector(vector)
- .SetHealth(int) - sets entity health
- .SetOrigin(vector) - sets entity position in world
- .SetVelocity(vector) - sets entity velocity
- .ValidateScriptScope - Ensure that an entity's script scope has been created
CBaseAnimating
Extends CBaseEntity
- Class Methods
- .__KeyValueFromInt(key,int) - Sets a keyvalue from an integer, the keys available for all __KeyValue are from the DEFINE_KEYFIELD in baseentity.cpp (classname,rendermode, renderfx, etc)
- .__KeyValueFromString(key,string) - Sets a keyvalue from a string, the keys available for all __KeyValue are from the DEFINE_KEYFIELD in baseentity.cpp (classname,rendermode, renderfx, etc)
- .__KeyValueFromVector(key,vector) - Sets a keyvalue from a vector, the keys available for all __KeyValue are from the DEFINE_KEYFIELD in baseentity.cpp (classname,rendermode, renderfx, etc)
- .ConnectOutput(outputname,functioname) - Adds an I/O connection that will call the named function when the specified output fires
- .DisconnectOutput(event) - Removes a connected script function from an I/O event
- .FirstMoveChild() - returns entity's first move child if exists
- .GetClassname() - returns classname
- .GetForwardVector() - returns Vector instance
- .GetHealth() - returns entity health
- .GetMoveParent() - If in hierarchy, retrieves the entity's parent
- .GetName() - returns named (if entity is named)
- .GetOrigin() - returns origin vector
- .GetPreTemplateName - Get the entity name stripped of template unique decoration. ie myitem&0125 returns myitem
- .GetRootMoveParent() - If in hierarchy, walks up the hierarchy to find the root parent
- .GetScriptId() - Retrieve the unique identifier used to refer to the entity within the scripting system
- .GetScriptScope() - Retrieve the script-side data associated with an entity
- .GetVelocity() - returns velocity vector
- .IsValid() - whether entity is valid
- .NextMovePeer - returns next child entity
- .SetForwardVector(vector)
- .SetHealth(int) - sets entity health
- .SetOrigin(vector) - sets entity position in world
- .SetVelocity(vector) - sets entity velocity
- .ValidateScriptScope - Ensure that an entity's script scope has been created
Game Instance: NavMesh
- Class Methods
- .IsValid
- .UnblockRescueVehicleNav() - Removes the block for rescue vehicle. Normally is blocked before the finale is finished, but is necessary for bots to access like in the Atrium finale, c1m4_atrium.bsp.
CCallChainer
Game Instance: N/A
- Class Methods
- .chains
- .constructor
- .PostScriptExecute
- .prefix
- .scope
CSimpleCallChainer
- Class Methods
- .Call
- .chain
- .constructor
- .exactMatch
- .PostScriptExecute
- .prefix
- .scope
regxp
[Todo] Game Instance:
- Class Methods
Vector
Game Instance: None
- Class Methods
- .constructor
- .Cross
- .Dot
- .Length
- .Length2D
- .Length2DSqr
- .LengthSqr
- .Norm
- .ToKVString
Functions
- Assert(value, "optional message") - test value and if not true, throws exception, optionally with messsage
- ConnectOutputs(table) - sets output functions for entity by table TODO
- DebugDrawBox(Vector, Vector, Vector, int, int, int, int, float) - Draw a debug overlay box
- DebugDrawLine(Vector, Vector, int, int, int, bool, float) - Draw a debug overlay line
- Developer() - returns 1 or TRUE when in developer mode
- DoEntFire( target.tostring(), action, value, delay, activator, caller ) - Fire an event
- EntFire(target, action, value, delay, activator) - "ent_fire target event" - wrapper for DoEntFire() that sets activator and caller to null
- DoIncludeScript(string, caller) - Execute a script (internal)
- IncludeScript - Wrapper for DoIncludeScript
- GetFunctionSignature
- Msg("message here") - prints message to console
- printl("message") - prints message with carriage return
- RandomFloat() - Returns a random float
- RandomFloat(float, float) - Generate a random floating point number within a range, inclusive
- RandomInt() - Returns a random int between 0 and 32767
- RandomInt(int, int) - Generate a random integer within a range, inclusive
- RetrieveNativeSignature
- SendToConsole("string")- send a string to the console as a command
- ShowMessage("message") - Print a hud message on all clients
- Time() - Get the current server time
- DoUniqueString - Called by UniqueString, prob want to call that instead
- UniqueString() - Generate a string guaranteed to be unique across the life of the script VM, with an optional root string. Useful for adding data to tables when not sure what keys are already in use in that table.
Standard Squirrel library functions (consult official Squirrel language league for more details):
abs,
acos,
array,
asin ,
assert,
atan ,
atan2,
ceil,
collectgarbage,
compilestring,
cos,
exp ,
fabs ,
floor,
format,
getconsttable,
getroottable,
getstackinfos,
log,
log10,
lstrip,
pow,
print,
rand,
rstrip,
setconsttable,
seterrorhandler,
setroottable,
type,
sin,
split,
sqrt,
srand,
strip,
suspend,
tan
Constants
See also
- L4D2 Vscript Examples
- L4D2 Level Design/Boss Prohibition
- Left 4 Dead 2 Tool Updates
- Mutation Gametype (L4D2)
- trigger_finale
- info_director
- logic_script
- vscripts
External links
- Alternative Documentation
- Director Scripts - .nuc files (Steam forums)
- It's the vscript'ing documentation FAQ! (Steam forums)
- Tutorial - Writing a Mini Game - Tic Tac Toe - Part One (Steam Forums)
- Writing a Mini Game - Tic Tac Toe - Part One - Author's Website
- l4d2 - Vscript example - Tic-Tac-Toe - Video of early Prototype
- l4d2 - Vscript example - Tic-Tac-Toe - updated - Video of current version with "brutally misanthropic AI"
- Mutation scripts (Steam forums)
- Squirrel Binary for Windows
- Squirrel (programming language) - Wikipedia Article on Squirrel
Squirrel: The Programming Language - Documentation and Sample Code
- The AI Systems of Left 4 Dead by Michael Booth (PDF)
"Creating a "Money"/Point System" - Swarm Armory
- Deciphered Official Scripts