Talk:L4D2 Soundscripts

From Valve Developer Community
Jump to: navigation, search

Preliminary data

I've been having a lot of trouble with this, so I'll have to keep things in discussion first. There's still a lot to learn about sound, but I think it's a very interesting aspect of a campaign that should be dealt with. There are interesting snippets that need testing. As a side note, I'm not sure if it will be appropriate to cover soundscapes in this article, as well.

Unique to L4D Series (or maybe just L4D2)

  • Dynamic music
  • Mixing channels
  • Blockable channels
  •  ?gamedata?

Gamedata

Following are examples of use of gamedata in soundscript entries. Compiled together in this section to possibly get a list out of it. Out of all the official soundscripts, the following scripts uses gamedata. Note that while gamedata is the main focus here, there are also really interesting questions that crop up re: general soundscript entries. It gets very interesting when we hit the music script entries!

game_sounds_doors.txt

Priority = Interesting is the only gamedata used in this script.

"WoodenDoor.Break"
{
	"volume"		"1.0"
	"soundlevel"	"SNDLVL_90dB"
	"pitch"			"95,105"

	"GameData"
	{
		"Priority"	"Interesting"
	}

	"rndwave"
	{
		"wave" "physics/wood/wood_crate_break4.wav"
		"wave" "physics/wood/wood_crate_break5.wav"
	}
}

game_sounds_infected_common.txt

Priority = Interesting & Important used in this script. Also interesting is the use of $gender variable.

"Zombie.IgniteScream"
{
	"channel"		"CHAN_VOICE"
	"soundlevel"		"SNDLVL_70dB"
	"volume"		"0.80"
	"pitch"		"90,110"
	"GameData"
	{
		"Priority"	"Interesting"
	}

	"rndwave"
	{
		"wave"		"npc/infected/action/die/mp/squeal_1.wav"
		"wave"		"npc/infected/action/die/mp/squeal_2.wav"
		"wave"		"npc/infected/action/die/mp/squeal_3.wav"
		"wave"		"npc/infected/action/die/mp/squeal_4.wav"
		"wave"		"npc/infected/action/Ignite/Ignite01.wav"
		"wave"		"npc/infected/action/Ignite/Ignite07.wav"
		"wave"		"npc/infected/action/Ignite/Ignite08.wav"
		"wave"		"npc/infected/action/Ignite/Ignite09.wav"
		"wave"		"npc/infected/action/Ignite/$gender/Ignite11.wav"
		"wave"		"npc/infected/action/Ignite/$gender/Ignite12.wav"
		"wave"		"npc/infected/action/Ignite/$gender/Ignite13.wav"
		"wave"		"npc/infected/action/Ignite/$gender/Ignite14.wav"
		"wave"		"npc/infected/action/Ignite/$gender/Ignite10.wav"
	}
}

// raging mad, running through the streets, NO SPECIFIC VICTIM
"Zombie.Rage"
{
	"channel"		"CHAN_VOICE"
	"soundlevel"		"SNDLVL_85dB"
	"volume"		"0.85"
	"pitch"		"95,105"
	"GameData"
	{
		"Priority"	"Important"
	}

	"rndwave"
	{
		"wave"		"npc/infected/action/rage/$gender/rage_50.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_51.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_52.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_53.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_54.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_55.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_56.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_57.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_58.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_59.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_60.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_61.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_62.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_64.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_65.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_66.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_67.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_68.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_69.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_70.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_71.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_72.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_73.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_74.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_75.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_76.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_77.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_78.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_79.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_80.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_81.wav"
		"wave"		"npc/infected/action/rage/$gender/rage_82.wav"
	}
}

game_sounds_infected_special.txt

Priority = Interesting & Critical. Critical is used for WitchZombie.Scream, for example.

// This plays 25% of "Yell" during engagement
"HulkZombie.Growl"
{
	"channel"		"CHAN_VOICE"
	"volume"		"1"
	"soundlevel"	"SNDLVL_115dB"
	"pitch"			"92, 100"

	"GameData"
	{
		"Priority"	"Interesting"
	}

	"rndwave"
	{
		"wave"	"player/tank/voice/idle/Tank_Growl_01.wav"
		"wave"	"player/tank/voice/idle/Tank_Growl_02.wav"
		"wave"	"player/tank/voice/idle/Tank_Growl_03.wav"
		"wave"	"player/tank/voice/idle/Tank_Growl_09.wav"
		"wave"	"player/tank/voice/idle/Tank_Growl_10.wav"
		"wave"	"player/tank/voice/idle/Tank_Growl_11.wav"
		"wave"	"player/tank/voice/idle/Tank_Growl_12.wav"
	}
}

"BoomerZombie.Fall"
{
	"channel"		"CHAN_BODY"  // "CHAN_STATIC"
	"volume"		"1"
	"soundlevel"	"SNDLVL_75dB"
	"pitch"			"95, 105"

	"GameData"
	{
		"Priority"	"Critical"
	}

	"wave"	"player/Boomer/fall/boomer_dive_01.wav"
}

game_sounds_music.txt

Music is crucial in L4D Series, so there's a lot of interesting stuff involving gamedata. In summary (look at scripts for more meaningful info):

  • MusicDelayTime = <float> (in seconds)
  • MusicPriority = Low, Medium, High, CRITICAL
  • MusicTrack = checkpoint, overdub, ambient, safeAmbient, zombieIntro, zombat, zombat2, zombat2c, zombat3, ledge, ledgeHits, down, downHits, default, finaleStart, scavengeLevel, tank, tank2, witch, witchChoir, mobRules, PZAttack, hunterHits, smokerHits, boomerHits, chargerHits, chargerSlamHits, jockeyHits, spitterSpit, BoomerAlert, SmokerAlert, HunterAlert, ChargerAlert, SpitterAlert, JockeyAlert, mobsignal, zombiechoir, glimpse, jukebox, infection, concert
  • MusicAutoQueue = Event.MissionStart_BaseLoop_POSTFIX (defined in map properties in Hammer), Event.Zombat_1 (this can be any soundscript entry)
  • MusicParameters = AFTER_DEATH, NO_INTENSITY_TRACK, "AFTER_DEATH | AFTER_MISSION_END", INTENSITY_CELING
  • MusicMaster = PLAY_TO_END, PLAY_SPLIT, "PLAY_TO_END | DONT_DISENGAGE"
  • MusicDuckTrackList = all, tank
  • MusicBlockTrackList = zombat, zombat2, zombat3, zombatIntro, ambient, tank, finaleStart
  • MusicStopTrackList = zombat, zombat2, zombat3, zombatIntro, ambient, tank, concert1, concert2, finaleStart
  • MusicFadeOut = <float> (in seconds)
  • MusicTagTrack = zombat, scavengeLevel
  • MusicMasterDivTags = <int> or <float> = 8, 8.0, 1.0, 4.0
  • MusicTagDelay = <int> or <int, int> (?in seconds?)
  • MusicTagIndex = <int> = 0, 2
  • MusicTagDelayMult = <int> = 2
  • MusicMasterTags
Ex: "MusicMasterTags"

{ "loopStart" "108.197" }

"MusicMasterTags"

{ "tag1" "1.033" "tag2" "2.806" "tag3" "5.647" }

game_sounds_terror.txt

Priority = Interesting
Reaction = ChaseFromAnywhere

"InfectedChaseGoal.Attract"
{
	"channel"		"CHAN_STATIC"
	"volume"		"1.0"
	"soundlevel"	"SNDLVL_NORM"
	"pitch"			"PITCH_NORM"
	"wave" 			"common/null.wav"

	"GameData"
	{
		"Priority"	"Interesting"
		"Reaction"	"ChaseFromAnywhere"
	}
}

game_sounds_weapons.txt

Priority = Interesting
Reaction = SeekAndDestroy

"PipeBomb.TimerBeep"
{
	"channel"		"CHAN_STATIC"
	"soundlevel"		"SNDLVL_90dB"
	"volume"		"0.75"
	"wave"		"weapons/hegrenade/beep.wav"
	
	"GameData"
	{
		"Priority"	"Interesting"
		"Reaction"	"SeekAndDestroy"
	}
}

game_sounds_world.txt

"c1m4.ElevatorJingle"
{
	"channel"		"CHAN_STATIC"
	"volume"		"1"
	"soundlevel"		"SNDLVL_150dB"
	"pitch"			"100"
		
	// "wave"	"*)ambient/mall/elevator.wav"
	"wave"                 "common/null.wav"
	// GameData
	// {
		// "MusicDuckTrackList"    "zombat, zombat2, zombat3, ambient"
    // }
}

Official soundscripts to look through

game_sounds.txt
game_sounds_ambient_generic.txt
game_sounds_arenaheli.txt
game_sounds_biker.txt
game_sounds_bots.txt
game_sounds_coach.txt
game_sounds_doors.txt
game_sounds_gambler.txt
game_sounds_infected_common.txt
game_sounds_infected_special.txt
game_sounds_manager.txt
game_sounds_manifest.txt
game_sounds_mechanic.txt
game_sounds_melee_vo.txt
game_sounds_moustachio.txt
game_sounds_music.txt
game_sounds_namvet.txt
game_sounds_npc2.txt
game_sounds_npcs.txt
game_sounds_physics.txt
game_sounds_player.txt
game_sounds_producer.txt
game_sounds_soldier1.txt
game_sounds_soldier2.txt
game_sounds_teengirl.txt
game_sounds_terror.txt
game_sounds_virgil.txt
game_sounds_weapons.txt
game_sounds_whitaker.txt
game_sounds_world.txt
level_sounds_general.txt
soundmixers.txt

Other

  • I don't understand "sound priorities" (not sure if that is the proper terminology). To describe it, it is where the location of the sound file in the sound directory makes all the difference. One sound can drown out others, depending on their location.
  • Sound priorities appear to be independent of soundscript entries.
  • I thought scripts/soundmixers.txt would have dictated everything about priority, but directories with the same settings appear to have different priorities. Weird! I will need help or more time on explaining that.
  • How does Valve automatically generate these soundscripts?