--======================================================== -- SUPPORT MISSIONS (converted → SupportInfinite waves) --======================================================== local mission_sniper_w1 = { Name = "sniper_mission_w1", Where = "spawnbot_mission_sniper", WaitBeforeStarting = 80, WaitBetweenSpawnsAfterDeath = 40, SupportInfinite = true, IsMission = true, TotalCount = 2, SpawnCount = 2, MaxActive = 2, TotalCurrency = 0, SendSniperAnnouncement = true, Templates = { { Class = CLASSES.Sniper, Skill = BOT_SKILL.HARD, Name = "Sniper", MaxVisionRange = 3000, }, }, } local mission_sniper_w2 = { Name = "sniper_mission_w2", Where = "spawnbot_mission_sniper", WaitBeforeStarting = 70, WaitBetweenSpawnsAfterDeath = 30, SupportInfinite = true, IsMission = true, TotalCount = 2, SpawnCount = 2, MaxActive = 2, TotalCurrency = 0, SendSniperAnnouncement = true, Templates = { { Class = CLASSES.Sniper, Skill = BOT_SKILL.HARD, Name = "Sniper", MaxVisionRange = 3000, }, }, } local mission_sniper_w4 = { Name = "sniper_mission_w4", Where = "spawnbot_mission_sniper", WaitBeforeStarting = 30, WaitBetweenSpawnsAfterDeath = 5, SupportInfinite = true, IsMission = true, TotalCount = 6, SpawnCount = 6, MaxActive = 6, TotalCurrency = 0, SendSniperAnnouncement = true, Templates = { ROBOT_STANDARD.Sniper_Sydney_Sleeper, }, } local mission_sniper_w6 = { Name = "sniper_mission_w6", Where = "spawnbot_mission_sniper", WaitBeforeStarting = 30, WaitBetweenSpawnsAfterDeath = 5, SupportInfinite = true, IsMission = true, TotalCount = 4, SpawnCount = 4, MaxActive = 4, TotalCurrency = 0, SendSniperAnnouncement = true, Templates = { ROBOT_STANDARD.Sniper_Sydney_Sleeper, }, } local mission_spy_w3 = { Name = "spy_mission_w3", Where = "spawnbot_mission_spy", WaitBeforeStarting = 50, WaitBetweenSpawnsAfterDeath = 30, SupportInfinite = true, IsMission = true, TotalCount = 4, SpawnCount = 4, MaxActive = 4, TotalCurrency = 0, SendSpyAnnouncement = true, Templates = { { Class = CLASSES.Spy, Skill = BOT_SKILL.EXPERT, Name = "Spy", }, }, } local mission_spy_w5 = { Name = "spy_mission_w5", Where = "spawnbot_mission_spy", WaitBeforeStarting = 30, WaitBetweenSpawnsAfterDeath = 30, SupportInfinite = true, IsMission = true, TotalCount = 4, SpawnCount = 4, MaxActive = 4, TotalCurrency = 0, SendSpyAnnouncement = true, Templates = { { Class = CLASSES.Spy, Skill = BOT_SKILL.EXPERT, Name = "Spy", }, }, } --======================================================== -- WAVE 1 --======================================================== local wave1 = { -- missions at top mission_sniper_w1, { Name = "wave01a", Where = "spawnbot", WaitBeforeStarting = 0, WaitBetweenSpawns = 10, TotalCount = 45, SpawnCount = 5, MaxActive = 5, TotalCurrency = 250, Templates = { { Class = CLASSES.Scout, Skill = BOT_SKILL.EASY, WeaponRestrictions = WEAPON_RESTRICTIONS.MELEE_ONLY, Attributes = { BOT_ATTRIBUTES.ALWAYS_CRIT }, }, }, }, { Name = "wave01b", Where = "spawnbot", WaitBeforeStarting = 10, WaitBetweenSpawns = 10, TotalCount = 20, SpawnCount = 4, MaxActive = 4, TotalCurrency = 200, Templates = { { Class = CLASSES.Pyro, Skill = BOT_SKILL.EASY, }, }, }, { Name = "wave01c", Where = "spawnbot", WaitBeforeStarting = 25, WaitBetweenSpawns = 20, TotalCount = 32, SpawnCount = 8, MaxActive = 8, TotalCurrency = 250, Templates = { { Class = CLASSES.Soldier, Skill = BOT_SKILL.EASY, }, }, }, { Name = "wave01d", Where = "spawnbot", WaitForAllSpawned = "wave01b", WaitBeforeStarting = 10, WaitBetweenSpawns = 20, TotalCount = 16, SpawnCount = 4, MaxActive = 12, TotalCurrency = 100, IsSquad = true, Templates = { { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, ROBOT_STANDARD.Medic_QuickUber, }, }, } --======================================================== -- WAVE 2 --======================================================== local wave2 = { mission_sniper_w2, { Name = "wave02a", Where = "spawnbot", TotalCount = 22, SpawnCount = 11, MaxActive = 22, WaitBetweenSpawns = 5, WaitBeforeStarting = 0, TotalCurrency = 200, RandomChoice = { { Class = CLASSES.Scout, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Scout, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Scout, Skill = BOT_SKILL.EASY, WeaponRestrictions = WEAPON_RESTRICTIONS.MELEE_ONLY, }, }, }, { Name = "wave02b", Where = "spawnbot", WaitForAllSpawned = "wave02a", TotalCount = 32, SpawnCount = 8, MaxActive = 16, WaitBetweenSpawns = 15, TotalCurrency = 350, IsSquad = true, Templates = { ROBOT_STANDARD.Soldier_Buff_Banner, { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, ROBOT_STANDARD.Medic_QuickUber, ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave02c", Where = "spawnbot", WaitForAllSpawned = "wave02a", WaitBeforeStarting = 30, WaitBetweenSpawns = 25, TotalCount = 2, SpawnCount = 1, MaxActive = 2, TotalCurrency = 100, Templates = { ROBOT_GIANT.Giant_Soldier_Crit, }, }, { Name = "wave02d", Where = "spawnbot", WaitBeforeStarting = 70, SupportInfinite = true, SpawnCount = 1, MaxActive = 2, TotalCount = 20, TotalCurrency = 50, Templates = { ROBOT_STANDARD.Demoman_Knight, }, }, } --======================================================== -- WAVE 3 --======================================================== local wave3 = { mission_spy_w3, { Name = "wave03a", Where = "spawnbot", TotalCount = 8, SpawnCount = 2, MaxActive = 8, WaitBetweenSpawns = 5, IsSquad = true, TotalCurrency = 100, Templates = { { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave03b", Where = "spawnbot_giant", TotalCount = 4, SpawnCount = 1, MaxActive = 4, WaitBetweenSpawns = 30, WaitBeforeStarting = 35, TotalCurrency = 300, Templates = { ROBOT_GIANT.Giant_DemoMan_PrinceTavish, }, }, { Name = "wave03c", Where = "spawnbot", WaitForAllSpawned = "wave03a", TotalCount = 16, SpawnCount = 4, MaxActive = 8, WaitBetweenSpawns = 20, TotalCurrency = 300, IsSquad = true, Templates = { { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave03d", Where = "spawnbot", WaitForAllSpawned = "wave03c", TotalCount = 24, SpawnCount = 12, MaxActive = 12, WaitBetweenSpawns = 30, TotalCurrency = 100, Templates = { ROBOT_STANDARD.Scout_Bonk, }, }, } --======================================================== -- WAVE 4 --======================================================== local wave4 = { mission_sniper_w4, { Name = "wave04a", Where = "spawnbot", TotalCount = 40, SpawnCount = 5, MaxActive = 15, WaitBetweenSpawns = 10, TotalCurrency = 500, IsSquad = true, Templates = { { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.EASY, }, ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave04b", Where = "", TotalCount = 1, SpawnCount = 1, MaxActive = 1, TotalCurrency = 300, Templates = { { IsTank = true, Name = "tankboss", Health = 35000, Speed = 75, StartingPathTrackNode = "boss_path_1a", }, }, }, } --======================================================== -- WAVE 5 --======================================================== local wave5 = { mission_spy_w5, { Name = "wave05a", Where = "spawnbot", TotalCount = 32, SpawnCount = 4, MaxActive = 4, WaitBetweenSpawns = 0, TotalCurrency = 300, Templates = { { Class = CLASSES.Scout, Skill = BOT_SKILL.EASY, }, }, }, { Name = "wave05b", Where = "spawnbot", TotalCount = 18, SpawnCount = 9, MaxActive = 9, WaitBeforeStarting = 10, TotalCurrency = 400, IsSquad = true, Templates = { ROBOT_GIANT.Giant_Heavyweapons, { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, ROBOT_STANDARD.Medic_QuickUber, ROBOT_STANDARD.Medic_QuickUber, ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave05c", Where = "spawnbot_giant", WaitForAllSpawned = "wave05b", TotalCount = 2, SpawnCount = 2, MaxActive = 2, WaitBeforeStarting = 10, TotalCurrency = 300, IsSquad = true, Templates = { Extend(ROBOT_GIANT.Giant_Soldier_Crit, { Extend(ROBOT_GIANT.Giant_Soldier_Crit.Attributes, { BOT_ATTRIBUTES.AGGRESSIVE }), }), ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave05d", Where = "spawnbot_giant", WaitForAllSpawned = "wave05b", TotalCount = 2, SpawnCount = 2, MaxActive = 2, WaitBeforeStarting = 20, TotalCurrency = 300, IsSquad = true, Templates = { Extend(ROBOT_GIANT.Giant_Soldier_Crit, { Extend(ROBOT_GIANT.Giant_Soldier_Crit.Attributes, { BOT_ATTRIBUTES.AGGRESSIVE }), }), ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave05e", Where = "spawnbot", WaitForAllSpawned = "wave05a", TotalCount = 16, MaxActive = 16, SpawnCount = 16, TotalCurrency = 300, RandomChoice = { { Class = CLASSES.Scout, Skill = BOT_SKILL.HARD, Tags = { "flank_right" }, Attributes = { BOT_ATTRIBUTES.AGGRESSIVE }, }, { Class = CLASSES.Scout, Skill = BOT_SKILL.HARD, Tags = { "flank_left" }, Attributes = { BOT_ATTRIBUTES.AGGRESSIVE }, }, }, }, } --======================================================== -- WAVE 6 --======================================================== local wave6 = { mission_sniper_w6, { Name = "wave06a", Where = "", TotalCount = 1, SpawnCount = 1, MaxActive = 1, TotalCurrency = 150, Templates = { { IsTank = true, Name = "tankboss", Health = 30000, Speed = 75, Skin = 1, StartingPathTrackNode = "boss_path_1a", }, }, }, { Name = "wave06b", Where = "spawnbot", TotalCount = 20, SpawnCount = 10, MaxActive = 10, WaitBeforeStarting = 10, TotalCurrency = 100, Templates = { { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, }, }, { Name = "wave06c", Where = "spawnbot", TotalCount = 12, SpawnCount = 6, MaxActive = 6, WaitBeforeStarting = 15, TotalCurrency = 100, Templates = { { Class = CLASSES.Heavyweapons, Skill = BOT_SKILL.HARD, }, }, }, { Name = "wave06d", Where = "spawnbot_giant", WaitForAllDead = "wave06b", TotalCount = 4, SpawnCount = 4, MaxActive = 4, TotalCurrency = 100, IsSquad = true, Templates = { ROBOT_GIANT.Giant_Heavyweapons_Deflector, ROBOT_STANDARD.Medic_QuickUber, ROBOT_STANDARD.Medic_QuickUber, ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave06e", Where = "spawnbot_giant", WaitForAllDead = "wave06b", TotalCount = 4, SpawnCount = 4, MaxActive = 4, WaitBeforeStarting = 40, TotalCurrency = 100, IsSquad = true, Templates = { ROBOT_GIANT.Giant_Heavyweapons_Deflector, ROBOT_STANDARD.Medic_QuickUber, ROBOT_STANDARD.Medic_QuickUber, ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave06f", Where = "", WaitForAllSpawned = "wave06e", TotalCount = 1, SpawnCount = 1, MaxActive = 1, TotalCurrency = 150, Templates = { { IsTank = true, Name = "tankboss", Health = 20000, Speed = 75, Skin = 1, StartingPathTrackNode = "boss_path_1a", }, }, }, { Name = "wave06g", Where = "spawnbot", WaitForAllSpawned = "wave06f", TotalCount = 36, SpawnCount = 9, MaxActive = 18, TotalCurrency = 0, IsSquad = true, Templates = { { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, { Class = CLASSES.Soldier, Skill = BOT_SKILL.HARD, }, ROBOT_STANDARD.Medic_QuickUber, }, }, { Name = "wave06h", Where = "spawnbot", WaitForAllSpawned = "wave06f", TotalCount = 24, SpawnCount = 8, MaxActive = 8, TotalCurrency = 0, RandomChoice = { { Class = CLASSES.Scout, Skill = BOT_SKILL.HARD, Tags = { "flank_right" }, Attributes = { BOT_ATTRIBUTES.AGGRESSIVE }, }, { Class = CLASSES.Scout, Skill = BOT_SKILL.HARD, Tags = { "flank_left" }, Attributes = { BOT_ATTRIBUTES.AGGRESSIVE }, }, }, }, { Name = "wave06i", Where = "", WaitForAllSpawned = "wave06g", TotalCount = 1, SpawnCount = 1, MaxActive = 1, Templates = { { IsTank = true, Name = "tankboss", Health = 20000, Speed = 75, Skin = 1, StartingPathTrackNode = "boss_path_1a", }, }, }, } --======================================================== -- ALL WAVES --======================================================== local allWaves = { [1] = wave1, [2] = wave2, [3] = wave3, [4] = wave4, [5] = wave5, [6] = wave6, } local function waveStart(wave) util.PrintToChatAll("[TEST-WAVE]: " .. "STARTING TEST WAVE") if allWaves[wave] then RunWave(allWaves[wave]) end end local function waveInit(wave) local waveData = allWaves[wave] if waveData then ParseWave(waveData, false) WaveBarGen(waveData) end end if OnWaveStartFuncs then table.insert(OnWaveStartFuncs, waveStart) else function OnWaveStart(wave) waveStart(wave) end end if OnWaveInitFuncs then table.insert(OnWaveInitFuncs, waveInit) else function OnWaveInit(wave) waveInit(wave) end end