///////////////////////////////////////////////////////////////////// // // Example pop file for the map mvm_example. // // This pop file contains a sampling of wave types used in MVM and is commented. // ///////////////////////////////////////////////////////////////////// // // Helpful debug and console commands for developing MVM population scripts: // // sv_cheats 1 // Allows cheat commands. // god // Enables god mode for players. // nb_stop 1 // Stops all bots in place. // nb_blind 1 // Bots will not treat players as threats. // currency_give x // Give player x amount of game currency to be used on upgrades. // tf_populator_health_multiplier x.x // Multiplies health of enemy bots - example: tf_populator_health_multiplier 0.01 will set health of bots to 1% of normal. // tf_mvm_popfile abcd // Will load the .pop file of the specified name - example tf_mvm_popfile mvm_mapname_challenge2 will load mvm_mapname_challenge2.pop in the tf/scripts/population directory. // tf_mvm_jump_to_wave x // Will jump to the specified wave number of the current .pop file - example tf_mvm_jump_to_wave 6 will jump to wave 6. // tf_bot_flag_kill_on_touch 1 // When a bot picks up the flag, they die. // ///////////////////////////////////////////////////////////////////// // BEGIN POP FILE ///////////////////////////////////////////////////////////////////// #base robot_giant.pop // This pop file is marked to be included. These are other .pop files that contain templates for TFBots. In our WaveSpawns we can reference the templates in these pop files. #base robot_standard.pop // This pop file is marked to be included. These are other .pop files that contain templates for TFBots. In our WaveSpawns we can reference the templates in these pop files. WaveSchedule { StartingCurrency 600 // How much currency each player starts with. Normally 400 is a good starting point, but increased to 20k for the purpose of this test script. RespawnWaveTime 10 // This is the maximum respawn time, in seconds for players when they die. Starting at 2 seconds, it grows 2 seconds per wave. // In this case, wave 1 will have a respawn time of 2 seconds. Wave 2 - 4 seconds. Wave 3 - 6 seocnds, and so on until it hits the cap of 10 seconds for wave 5 and beyond. CanBotsAttackWhileInSpawnRoom no // Sets the robots to not attack players while they are inside of their respawn room volume. ///////////////// //MISSIONS ///////////////// Mission // This is a sentry buster mission. It creates sentry busters for any player sentries deemed too dangerous. { Objective DestroySentries InitialCooldown 5 // Amount of time once a wave starts before the mission becomes active. Where spawnbot_mission_sentrybuster // Entity at which to spawn. BeginAtWave 2 // The mission becomes active on this wave. RunForThisManyWaves 11 // It remains active for this many waves. Generally, this is the same as the total number of waves. CooldownTime 35 // This is the time, in seconds, between when Sentry Busters are allowed to spawn, should their spawning conditions be met. TFBot { Template T_TFBot_SentryBuster // This references a template to use for its TFBot. } } Mission // This is a sniper mission. This spawns sniper(s) at periodic intervals, it will not spawn more snipers unless its conditions are met, and all previous snipers from this mission are dead. { Objective Sniper InitialCooldown 10 // Amount of time once a wave starts before the mission becomes active. Where spawnbot_mission_sniper // Entity at which to spawn. BeginAtWave 3 // The mission becomes active on this wave. RunForThisManyWaves 3 // It remains active for this many waves. CooldownTime 35 // This is the time, in seconds, between when Sniper Missions are allowed to spawn, should their spawning conditions be met. DesiredCount 4 // Number of snipers to spawn each time this mission's criteria are met. TFBot { Class Sniper Skill Expert Name Sniper } } Mission // This is a spy mission. This spawns spy(s) at periodic intervals, it will not spawn more spies unless its conditions are met, and all previous spies from this mission are dead. { Objective Spy InitialCooldown 20 // Amount of time once a wave starts before the mission becomes active. Where spawnbot_mission_spy // Entity at which to spawn. BeginAtWave 3 // The mission becomes active on this wave. RunForThisManyWaves 1 // It remains active for this many waves. CooldownTime 15 // This is the time, in seconds, between when Sniper Missions are allowed to spawn, should their spawning conditions be met. DesiredCount 4 // Number of spies to spawn each time this mission's criteria are met. TFBot { Class Spy Skill Expert Name Spy } } Mission // This is a spy mission. This spawns spy(s) at periodic intervals, it will not spawn more spies unless its conditions are met, and all previous spies from this mission are dead. { Objective Engineer InitialCooldown 5 // Amount of time once a wave starts before the mission becomes active. Where spawnbot_mission_engineer // Entity at which to spawn. BeginAtWave 4 // The mission becomes active on this wave. RunForThisManyWaves 3 // It remains active for this many waves. CooldownTime 15 // This is the time, in seconds, between when Sniper Missions are allowed to spawn, should their spawning conditions be met. DesiredCount 2 // Number of spies to spawn each time this mission's criteria are met. TFBot { Class Engineer Skill Expert Name Engineer } } ///////////////// //WAVES ///////////////// //WAVE 1 Wave { StartWaveOutput // Output which occurs at moment the wave begins. { Target wave_start_relay // Name of the entity in the map to target. Action Trigger // Input to give the targeted entity. } DoneOutput // Output which occurrs at moment the wave is completed. { Target wave_finished_relay // Name of the entity in the map to target. Action trigger // Input to give the targeted entity. } Checkpoint Yes // Sets a checkpoint at the end of this wave. WaveSpawn { Name "wave1_scouts_1" Where spawnbot // Entity at which to spawn. TotalCount 15 // The total number of individual bots that will spawn. MaxActive 15 // The maximum number of bots, from this WaveSpawn, that can be alive in the world at any moment. SpawnCount 5 // Defines the number of bots to spawn at a time as a group. WaitBeforeStarting 0 // Amount of time to wait before spawning the first bot. WaitBetweenSpawns 10 // Amount of time to wait between spawning each group (defined by the spawncount) of bots. TotalCurrency 400 // Amount of money dropped by all of the bots in the WaveSpawn. Money is divided equally between each bot. RandomChoice // Contains a set of spawners and invokes one at random. { TFBot { Class Scout // Type of bot to spawn. Skill Normal // Skill level of bot. options are Easy, Normal, Hard, Expert in ascending difficulty. } TFBot { Template T_TFBot_Scout_Melee } TFBot { Template T_TFBot_Scout_Melee } TFBot { Template T_TFBot_Scout_Melee } } } WaveSpawn { Name "wave1_pyro_1" Where spawnbot WaitForAllSpawned "wave1_scouts_1" TotalCount 12 MaxActive 12 SpawnCount 3 WaitBeforeStarting 0 WaitBetweenSpawns 7 TotalCurrency 300 TFBot { Class Pyro Skill Easy } } WaveSpawn { Name "wave1_Giant_Soldier_1" Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 WaitBeforeStarting 1 WaitBetweenSpawns 1 TotalCurrency 100 TFBot { Template T_TFBot_Giant_Soldier } } } //WAVE 2 Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } Checkpoint Yes WaveSpawn { Name "wave2_Demo_1" Where spawnbot TotalCount 6 MaxActive 6 SpawnCount 2 WaitBeforeStarting 0 WaitBetweenSpawns 1 TotalCurrency 250 TFBot { class Demoman Skill Easy } } WaveSpawn { WaitForAllSpawned "wave2_Demo_1" TotalCount 1 WaitBeforeStarting 1 TotalCurrency 200 FirstSpawnOutput { Target boss_spawn_relay Action Trigger } Tank { Health 2400 Speed 70 Name "boss" StartingPathTrackNode "tank_path_a_1" OnKilledOutput { Target boss_dead_relay Action Trigger } OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } WaveSpawn{ Name "wave2_Heavy_1" WaitForAllSpawned "wave2_Demo_1" Where spawnbot TotalCount 8 MaxActive 8 SpawnCount 4 WaitBeforeStarting 3 WaitBetweenSpawns 10 TotalCurrency 225 TFBot { class HeavyWeapons Skill Easy } } WaveSpawn{ Name "wave2_Heavy_2" WaitForAllSpawned "wave2_Heavy_1" Where spawnbot TotalCount 6 MaxActive 6 SpawnCount 3 WaitBeforeStarting 3 WaitBetweenSpawns 5 TotalCurrency 150 TFBot { class HeavyWeapons Skill Hard } } WaveSpawn{ Name "wave2_Giant_Scout" WaitForAllSpawned "wave2_Heavy_1" Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 WaitBeforeStarting 3 WaitBetweenSpawns 0 TotalCurrency 25 TFBot { Template T_TFBot_Giant_Scout_Fast } } } //WAVE 3 Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } Checkpoint Yes WaveSpawn { TotalCount 1 WaitBeforeStarting 0 // Amount of time to wait before spawning the first bot. TotalCurrency 100 FirstSpawnOutput // Output which occurs at moment the first enemy is spawned. { Target boss_spawn_relay // Name of the entity in the map to target. Action Trigger // Input to give the targeted entity. } Tank { Health 16000 // Amount of health the enemy has. Good starting values for Tanks outside of testing are generally in the 25k to 35k range. Speed 72 // Speed of Tank in world units per seconds. Name "boss" StartingPathTrackNode "tank_path_a_1" // The path_track node in the level at which the Tank will spawn on the path the tank will follow. OnKilledOutput // Output which occurs at moment the enemy is destroyed. { Target boss_dead_relay // Name of the entity in the map to target. Action Trigger // Input to give the targeted entity. } OnBombDroppedOutput // Output which occurs at moment the tank drops its bomb. { Target boss_deploy_relay // Name of the entity in the map to target. Action Trigger // Input to give the targeted entity. } } } WaveSpawn { TotalCount 1 WaitBeforeStarting 25 // Amount of time to wait before spawning the first bot. TotalCurrency 100 FirstSpawnOutput // Output which occurs at moment the first enemy is spawned. { Target boss_spawn_relay // Name of the entity in the map to target. Action Trigger // Input to give the targeted entity. } Tank { Health 16000 // Amount of health the enemy has. Good starting values for Tanks outside of testing are generally in the 25k to 35k range. Speed 72 // Speed of Tank in world units per seconds. Name "boss" StartingPathTrackNode "tank_path_a_1" // The path_track node in the level at which the Tank will spawn on the path the tank will follow. OnKilledOutput // Output which occurs at moment the enemy is destroyed. { Target boss_dead_relay // Name of the entity in the map to target. Action Trigger // Input to give the targeted entity. } OnBombDroppedOutput // Output which occurs at moment the tank drops its bomb. { Target boss_deploy_relay // Name of the entity in the map to target. Action Trigger // Input to give the targeted entity. } } } WaveSpawn //10 demo spammers { Name "wave3_demo_1" Where spawnbot TotalCount 10 MaxActive 10 SpawnCount 2 WaitBeforeStarting 5 WaitBetweenSpawns 9 TotalCurrency 150 TFBot { Class Demoman Skill Easy WeaponRestrictions PrimaryOnly ItemAttributes { ItemName "TF_WEAPON_GRENADELAUNCHER" "fire rate bonus" 2.5 } } } WaveSpawn //heavy { Name "wave3_m_heavy_soldier_1" WaitForAllSpawned "wave3_demo_1" Where spawnbot TotalCount 14 MaxActive 10 SpawnCount 2 WaitBeforeStarting 5 WaitBetweenSpawns 9 TotalCurrency 150 TFBot { Class HeavyWeapons Skill Easy WeaponRestrictions PrimaryOnly BehaviorModifiers push } } WaveSpawn //Flank Soldiers { Name "wave3_Soldier_2" WaitForallSpawned "wave3_demo_1" Where spawnbot TotalCount 10 MaxActive 4 SpawnCount 2 WaitBeforeStarting 18 WaitBetweenSpawns 2 TotalCurrency 50 RandomChoice { TFBot { Class Soldier Skill Easy Tag nav_prefer_flank_right BehaviorModifiers push } TFBot { Class Soldier Skill Easy Tag nav_prefer_flank_left BehaviorModifiers push } } } } //WAVE 4 ///////////////////////////////////////////////////////////////////////////////////////////////////////// Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } Checkpoint Yes WaveSpawn { TotalCount 1 WaitBeforeStarting 0 // Amount of time to wait before spawning the first bot. TotalCurrency 200 FirstSpawnOutput { Target boss_spawn_relay Action Trigger } Tank { Health 30000 Speed 80 Name "boss" StartingPathTrackNode "tank_path_a_1" // The path_track node in the level at which the Tank will spawn on the path the tank will follow. OnKilledOutput { Target boss_dead_relay Action Trigger } OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } WaveSpawn { Where spawnbot TotalCount 20 MaxActive 10 SpawnCount 1 WaitBetweenSpawns 5 WaitBeforeStarting 5 TotalCurrency 550 Squad { TFBot { Template T_TFBot_Giant_Soldier } TFBot { Template T_TFBot_Medic_QuickUber // When a medic is supporting a squad leader, they do not take the standard formation. Instead, they attempt to hang back behind the squad leader while healing. } TFBot { Template T_TFBot_Medic_QuickUber // When a medic is supporting a squad leader, they do not take the standard formation. Instead, they attempt to hang back behind the squad leader while healing. } TFBot { Template T_TFBot_Medic_QuickUber // When a medic is supporting a squad leader, they do not take the standard formation. Instead, they attempt to hang back behind the squad leader while healing. } TFBot { Template T_TFBot_Medic_QuickUber // When a medic is supporting a squad leader, they do not take the standard formation. Instead, they attempt to hang back behind the squad leader while healing. } } } WaveSpawn //huntsman + sandman { Name "wave4_m_huntsman_sandman_1" Where spawnbot TotalCount 30 MaxActive 20 SpawnCount 5 WaitBeforeStarting 2 WaitBetweenSpawns 7 TotalCurrency 250 Squad { TFBot { Template T_TFBot_Scout_Sandman } TFBot { Template T_TFBot_Sniper_Huntsman } TFBot { Template T_TFBot_Sniper_Huntsman } TFBot { Template T_TFBot_Sniper_Huntsman } TFBot { Template T_TFBot_Sniper_Huntsman } } } WaveSpawn //Flank Soldiers { Name "wave4_Soldier_1" WaitForallSpawned "wave4_m_huntsman_sandman_1" Where spawnbot TotalCount 10 MaxActive 4 SpawnCount 2 WaitBeforeStarting 18 WaitBetweenSpawns 2 TotalCurrency 50 RandomChoice { TFBot { Class Soldier Skill Easy Tag nav_prefer_flank_right BehaviorModifiers push } TFBot { Class Soldier Skill Easy Tag nav_prefer_flank_left BehaviorModifiers push } } } } //WAVE 5 //Currency 1000 /////////////////////////////////////////////////////////////////////////////////////////////////////// Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } Checkpoint Yes WaveSpawn //pyros always fire { Name "wave4_pyro_alwayson" Where spawnbot TotalCount 14 MaxActive 14 SpawnCount 5 WaitBeforeStarting 0 WaitBetweenSpawns 6 TotalCurrency 100 TFBot { Attributes AlwaysFireWeapon Class Pyro Skill Easy } } WaveSpawn //rapid fire soldier giant { Name "wave4_rapid_soldier" Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 WaitBeforeStarting 0 WaitBetweenSpawns 0 TotalCurrency 200 TFBot { Template T_TFBot_Giant_Soldier_Spammer } } WaveSpawn //Soldiers with quickfix { Name "wave4_soldier_medics" WaitForAllSpawned "wave4_rapid_soldier" Where spawnbot TotalCount 40 MaxActive 12 SpawnCount 4 WaitBeforeStarting 28 WaitBetweenSpawns 8 TotalCurrency 200 Squad { TFBot { Class Soldier Skill Easy } TFBot { Template T_TFBot_Medic_BigHeal } } } WaveSpawn //Scouts { Name "wave4_scouts" WaitForAllSpawned "wave4_soldier_medics" Where spawnbot TotalCount 40 MaxActive 16 SpawnCount 4 WaitBeforeStarting 45 WaitBetweenSpawns 1 TotalCurrency 150 RandomChoice { TFBot { Class Scout Skill Easy WeaponRestrictions PrimaryOnly } TFBot { Class Scout Skill Easy WeaponRestrictions PrimaryOnly } TFBot { Class Scout Skill Easy WeaponRestrictions PrimaryOnly } TFBot { Template T_TFBot_Scout_Sandman } } } WaveSpawn //rapid fire soldier giant { Name "wave4_rapid_soldier2" Where spawnbot TotalCount 6 MaxActive 6 SpawnCount 6 WaitBeforeStarting 35 WaitBetweenSpawns 0 TotalCurrency 350 Squad { TFBot { Template T_TFBot_Giant_Soldier_Spammer } TFBot { Template T_TFBot_Medic_BigHeal } TFBot { Template T_TFBot_Medic_BigHeal } TFBot { Template T_TFBot_Medic_BigHeal } TFBot { Template T_TFBot_Medic_BigHeal } TFBot { Attributes AlwaysFireWeapon Class Pyro Skill Easy } } } } //WAVE 6 //Currency 700 /////////////////////////////////////////////////////////////////////////////////////////////////////// Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } Checkpoint Yes WaveSpawn //Scout melee { Name "wave6_scouts" Where spawnbot TotalCount 55 MaxActive 10 SpawnCount 6 WaitBeforeStarting 0 WaitBetweenSpawns 4 TotalCurrency 300 TFBot { Template T_TFBot_Scout_Melee } } WaveSpawn //Heavyweapons { Name "wave6_heavyweapons" Where spawnbot TotalCount 10 MaxActive 4 SpawnCount 1 WaitBeforeStarting 6 WaitBetweenSpawns 7 TotalCurrency 150 TFBot { Class Heavyweapons Skill Easy } } WaveSpawn //Demo flankers { Name "wave6_demos" Where spawnbot TotalCount 16 MaxActive 4 SpawnCount 2 WaitBeforeStarting 10 WaitBetweenSpawns 15 TotalCurrency 150 RandomChoice { TFBot { Class Demoman Skill Easy WeaponRestrictions PrimaryOnly Tag nav_prefer_flank_right BehaviorModifiers push } TFBot { Class Demoman Skill Easy WeaponRestrictions PrimaryOnly Tag nav_prefer_flank_left BehaviorModifiers push } } } WaveSpawn //Heavyweapons group { Name "wave6_heavyweapons" WaitForAllSpawned "wave6_scouts" Where spawnbot TotalCount 12 MaxActive 12 SpawnCount 6 WaitBeforeStarting 20 WaitBetweenSpawns 9 TotalCurrency 150 TFBot { Class Heavyweapons Skill Easy } } } //WAVE 7 //Currency 700 /////////////////////////////////////////////////////////////////////////////////////////////////////// Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } Checkpoint Yes WaveSpawn //tank { TotalCount 1 WaitBeforeStarting 0 TotalCurrency 200 FirstSpawnOutput { Target boss_spawn_relay Action Trigger } Tank { Health 20000 Speed 75 Name "boss" StartingPathTrackNode "boss_path_b1" OnKilledOutput { Target boss_dead_relay Action Trigger } OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } WaveSpawn //tank2 { TotalCount 1 WaitBeforeStarting 11 TotalCurrency 200 FirstSpawnOutput { Target boss_spawn_relay Action Trigger } Tank { Health 20000 Speed 75 Name "boss" StartingPathTrackNode "boss_path_b1" OnKilledOutput { Target boss_dead_relay Action Trigger } OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } WaveSpawn //gru pushers { Name "wave6_heavy_gru" Where spawnbot TotalCount 5 MaxActive 5 SpawnCount 1 WaitBeforeStarting 0 WaitBetweenSpawns 1 TotalCurrency 100 TFBot { Template T_TFBot_Heavyweapons_Heavyweight_Champ_Fast } } WaveSpawn //heavy miniguns { Name "wave6_heavy" Where spawnbot TotalCount 8 MaxActive 8 SpawnCount 2 WaitBeforeStarting 1 WaitBetweenSpawns 6 TotalCurrency 200 RandomChoice { TFBot { Class Heavyweapons Skill Easy Tag nav_prefer_flank_right BehaviorModifiers push } TFBot { Class Heavyweapons Skill Easy Tag nav_prefer_flank_left BehaviorModifiers push } } } WaveSpawn //heavy giants { Name "wave6_heavy_giants" Where spawnbot TotalCount 10 MaxActive 10 SpawnCount 5 WaitBeforeStarting 90 WaitBetweenSpawns 50 TotalCurrency 200 Squad { TFBot { Template T_TFBot_Giant_Heavyweapons } TFBot { Template T_TFBot_Medic_QuickFix } TFBot { Template T_TFBot_Medic_QuickFix } TFBot { Template T_TFBot_Medic_QuickFix } TFBot { Template T_TFBot_Medic_QuickFix } } } WaveSpawn //Support scouts { Where spawnbot_mission_misc TotalCount 100 MaxActive 12 SpawnCount 3 WaitBeforeStarting 60 WaitBetweenSpawns 6 TotalCurrency 200 Support 1 TFBot { Class Scout Skill Easy WeaponRestrictions MeleeOnly } } } }