// This mission file is to be used as a reference by MvM mission makers, in conjunction with looking at the other missions that come with mvm_gd_caster, in order to more easily create compatible mission for the map. It is not intended to be playable alongside the default missions and cannot be finished. It is also recommended that you attempt to replicate the format of the default missions, or at least use a consistent format with adequate descriptions of each wave, so that both you and others can more easily read and fix your mission if necessary. // The following template is required in order to spawn in robots from the default missions. It is also required for spawning in a modified Sentry Buster, which is renamed and does not give players rage. #base robot_caster.pop WaveSchedule { StartingCurrency 1000 RespawnWaveTime 0 FixedRespawnWaveTime Yes CanBotsAttackWhileInSpawnRoom No // The following line forces your mission to only allow two players on modified MvM servers, since this is a two-player map. You can optionally change this number or remove it in the case that your mission requires a full team of 6 players. MaxRedPlayers 2 // Sigsegv maximum RED players override // Templates may be included in the mission file itself for maximum readability. A couple of example templates have been created to showcase the required attributes for robots. Templates { // All robots intended to be used in this map are required to have Attributes IgnoreFlag attribute and BehaviorModifiers Push. The bot_gatebot tag should always be included unless it is a Mission robot or a Medic. For giants, their default scale must be reduced from 1.75 to 1.7 so they do not get stuck when travelling along the top floor, and the tag bot_giant is required so they are not stunned by the first point being captured. T_CasterSample_HeavyFistGiant { Class Heavyweapons Skill Expert Health 5500 Scale 1.7 // -5% decrease required for top floor navigation Attributes MiniBoss CharacterAttributes { "move speed bonus" 0.5 "damage force reduction" 0.3 "airblast vulnerability multiplier" 0.3 "override footstep sound set" 2 } WeaponRestrictions MeleeOnly ItemAttributes { ItemName "TF_WEAPON_FISTS" "damage bonus" 1.35 } // Required for Guardian Mode Attributes IgnoreFlag BehaviorModifiers Push Tag bot_gatebot Tag bot_giant // Giants only } // Medics do not heal their targets if they are given the bot_gatebot tag, and yet if they are put into squads with ShouldPreserveSquad set to 1 they will race directly to the bomb hatch and wait there, stalling waves. It is best to not do either of these things, even if it causes the Medics to become completely motionless when their target dies. T_CasterSample_Medic { Class Medic Skill Easy // Guardian Mode settings for support robots Attributes IgnoreFlag BehaviorModifiers Push } // Engineers, unlike Medics, do not have healing targets, so they are free to be put in squads with ShouldPreserveSquad set to 1 so they can fight in battles without falling back and creating buildings. The same goes for other similar classes such as Spies and some Snipers. T_CasterSample_EngineerWrench { Class Engineer Skill Easy WeaponRestrictions MeleeOnly // Required for Guardian Mode Attributes IgnoreFlag BehaviorModifiers Push Tag bot_gatebot } } Wave { StartWaveOutput { Target wave_start_relay Action Trigger } // The DoneOutput wave_finished_relay is required for all waves except the last. It handles removing hazards and resetting the first point and robot spawn points. The reason it is excluded on the last wave is so that hazards can persist, especially when there are two active at once, otherwise players are earraped by the sound of both of them deactivating at the same time. DoneOutput { Target wave_finished_relay Action trigger } // The InitWaveOutput section is used to show robot path models around the map while players are readying up. The paths robots can take are from the perspective of the robot spawns. For example, the right path travels through the tank barricade if it has been broken, circles down the platforms over the molten metal pit if travelling from the top floor, and hugs the inside wall while approaching the bomb hatch. Note that all robots eventually converge onto the first point, then return to their respective floors to reach the bomb hatch. It is recommended that you ignore robots without navigation tags when choosing path models, since they have no path. All possible relays are listed below. Use both, bottom or top to indicate which floors are used, then use a, l or r to indicate which paths are used. // wave_pathmodels_both - Spawns all path models for all floors // wave_pathmodels_both_ra - Same as wave_pathmodels_both, but the bottom-left path is excluded // wave_pathmodels_both_la - Same as wave_pathmodels_both, but the bottom-right path is excluded // wave_pathmodels_both_ar - Same as wave_pathmodels_both, but the top-left path is excluded // wave_pathmodels_both_al - Same as wave_pathmodels_both, but the top-right path is excluded // wave_pathmodels_both_rr - Same as wave_pathmodels_both, but the bottom-left and top-left paths are excluded // wave_pathmodels_both_lr - Same as wave_pathmodels_both, but the bottom-right and top-left paths are excluded // wave_pathmodels_both_rl - Same as wave_pathmodels_both, but the bottom-left and top-right paths are excluded // wave_pathmodels_both_ll - Same as wave_pathmodels_both, but the bottom-right and top-right paths are excluded // wave_pathmodels_bottom - Spawns all path models for only the bottom floor // wave_pathmodels_bottom_r - Same as wave_pathmodels_bottom, but the left path is excluded // wave_pathmodels_bottom_l - Same as wave_pathmodels_bottom, but the right path is excluded // wave_pathmodels_top - Spawns all path models for only the top floor // wave_pathmodels_top_r - Same as wave_pathmodels_top, but the left path is excluded // wave_pathmodels_top_l - Same as wave_pathmodels_top, but the right path is excluded InitWaveOutput { Target wave_pathmodels_both Action Trigger } // The first WaveSpawn of all default mission waves is used to give players money without requiring it to be collected in the map. This can be removed if you plan on creating missions for larger numbers of players or missions where Scout must be viable. spawnbot_money is located at the origin of the map and is surrounded by a trigger_hurt. A double stack of RandomChoice is used to hide the class icon from the heads up display, though this is not used when there are map hazards in the wave. The WaitForAllSpawned should be set to the last robot group in the wave, so that these robots do not take up an available slot. Finally, always remember that on all waves except the last, 100 extra money is given on top of whatever you choose to give. WaveSpawn { Support Limited TotalCount 1 Where spawnbot_money WaitForAllSpawned "wave1-group4" // Will not take up an extra bot slot TotalCurrency 900 RandomChoice { // Will hide bot icon RandomChoice { TFBot { Class Scout } } } } // A tank is spawned here so you are able to see the interactions between the tank barricade and the bottom paths. Tanks and grenade tanks are covered in more detail later in this sample mission. WaveSpawn { Name "wave1-group1" TotalCount 1 Tank { Name "tankboss" Health 1500 Speed 75 StartingPathTrackNode "path_tank_1" OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } // Robots meant to attack players or assist other robots must have their spawns set to either spawnbot or spawnbot_top, depending on the floor they should start from, as well as spawnbot_gate. RandomSpawn is used to scatter robots between the available spawn points for each area. As well as this, robots should have a single navigation tag each that describes what path they should take. Note that the top floor paths only begin at the cross-intersection in the middle of the conveyor belt. The path takes precedence over the floor, meaning a robot with a top floor path spawned on the bottom floor will move to the top floor once the first point is capped, however I do not recommend this. By not including a tag or including multiple, robots will behave unpredictably, most often taking the most direct path they can to the first point and bomb hatch. All possible navigation tags are listed below. // nav_prefer_left - Robot will attempt to stay on the left path on the bottom floor // nav_prefer_right - Robot will attempt to stay on the right path on the bottom floor // nav_prefer_top_left - Robot will attempt to stay on the left path on the top floor // nav_prefer_top_right - Robot will attempt to stay on the right path on the top floor WaveSpawn { Name "wave1-group2" TotalCount 5 SpawnCount 5 MaxActive 5 Where spawnbot Where spawnbot_gate RandomSpawn 1 WaitForAllDead "wave1-group1" TFBot { Template T_Caster_ScoutFish Tag nav_prefer_right } } WaveSpawn { Name "wave1-group3" TotalCount 5 SpawnCount 5 MaxActive 5 Where spawnbot Where spawnbot_gate RandomSpawn 1 WaitForAllDead "wave1-group2" TFBot { Template T_Caster_ScoutFish Tag nav_prefer_left } } WaveSpawn { Name "wave1-group4" TotalCount 5 SpawnCount 5 MaxActive 5 Where spawnbot_top Where spawnbot_gate RandomSpawn 1 WaitForAllDead "wave1-group3" TFBot { Template T_Caster_ScoutFish Tag nav_prefer_top_right } } WaveSpawn { Name "wave1-group5" TotalCount 5 SpawnCount 5 MaxActive 5 Where spawnbot_top Where spawnbot_gate RandomSpawn 1 WaitForAllDead "wave1-group4" TFBot { Template T_Caster_ScoutFish Tag nav_prefer_top_left } } } Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } InitWaveOutput { Target wave_pathmodels_bottom Action Trigger } // For this wave, the molten metal hazard is going to be spawned, so the money section is changed to reflect this. There are four default hazard icons in the map, which are listed below. // caster_cap - An icon of the first point, used for when the first point is forcibly capped // caster_grenadetank - An icon of a burst fire tank, used for when a grenade tank is going to be spawned // caster_smoke - An icon of smoke, used for the smoke hazard // caster_toxic - An icon of molten metal, used for the molten metal hazard WaveSpawn { Support Limited TotalCount 1 Where spawnbot_money WaitForAllSpawned "wave2-group2" // Will not take up an extra bot slot TotalCurrency 900 TFBot { Class Scout ClassIcon caster_toxic } } // For this wave, the molten metal hazard is going to be activated at the start, and deactivated automatically at the end. The molten metal and smoke hazards both use predictable relays and timings, which are listed below. // wave_event_smoke - Causes the map to start producing dangerous smoke on the top floor, it takes 10 seconds for the hazard to start // wave_event_smoke_finish - Causes the map to remove the smoke, it takes 2 seconds for the announcement system to finish speaking // wave_event_toxic - Causes the map to raise burning molten metal from below the bottom floor, it takes 10 seconds for the hazard to start // wave_event_toxic_finish - Cause sthe map to lower the molten metal, it takes 2 seconds for the announcement system to finish speaking WaveSpawn { StartWaveOutput { Target wave_event_toxic Action Trigger } Name "wave2-group1" TotalCount 5 SpawnCount 5 MaxActive 5 Where spawnbot Where spawnbot_gate WaitBeforeStarting 10 // 10 second wait while hazard starts // Note that robots are unharmed by all hazards, except for the first point being capped, meaning they can continue to travel along any path they are given. You should be aware of this and try to design missions so that players are able to make the most of their current situtations. TFBot { Template T_Caster_Pyro Tag nav_prefer_right } } WaveSpawn { Name "wave2-group2" TotalCount 1 Where spawnbot Where spawnbot_gate WaitForAllDead "wave2-group1" // It is never a good idea to send giant robots along the bottom-right path, as this allows them to be easily blocked once they approach the bomb hatch by an Engineer's Sentry Gun. They should instead be sent along the bottom-left path due to it being wider, or to one of the top floor paths for a cheeky flank. TFBot { Template T_Caster_PyroGiant Tag nav_prefer_left } } } Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } InitWaveOutput { Target wave_pathmodels_both_rl Action Trigger } // For this wave, the molten metal and smoke hazards will be used as well as the cap hazard. Because multiple hazard icons are being used, the money robots must become a squad and their TotalCount should be increased to match. The hazard icons are arranged in the order that they happen, but are all placed here so they appear before all other support icons, especially since Mission support icons are always last. WaveSpawn { Support Limited TotalCount 3 Where spawnbot_money WaitForAllSpawned "wave3-group3" // Will not take up an extra bot slot TotalCurrency 900 Squad { TFBot { Class Scout ClassIcon caster_cap } TFBot { Class Scout ClassIcon caster_smoke } TFBot { Class Scout ClassIcon caster_toxic } } } // In regards to wave_event_cap, it is always recommended to forcibly capture the first point immediately, so players that perform well late into the wave are not suddenly punished. The first point's opening animation lasts 15 seconds, but a WaitBeforeStarting of 1 should be used so that no robot spawns before the cap hazard activates, but also because timings are paused during the animation. Also keep in mind that robots that are not killed before the animation finishes are given 5 seconds of full crits. WaveSpawn { StartWaveOutput { Target wave_event_cap Action Trigger } Name "wave3-group1" TotalCount 1 Where spawnbot_top Where spawnbot_gate WaitBeforeStarting 1 // Automatic 15 second wait while gate opens TFBot { Template T_Caster_SoldierGiant Tag nav_prefer_top_left } } // For this wave, the smoke hazard is activated after the first group, then deactivated and replaced with the molten metal hazard using the expected timings. This and other exchanges like it are referred to in the default missions as transitions. WaveSpawn { StartWaveOutput { Target wave_event_smoke Action Trigger } Name "wave3-group2" TotalCount 5 SpawnCount 5 MaxActive 5 Where spawnbot_top Where spawnbot_gate WaitForAllDead "wave3-group1" WaitBeforeStarting 10 // 10 second wait while hazard starts TFBot { Template T_Caster_Soldier Tag nav_prefer_top_left } } // Transitions throw Invalid spawner errors because they do not include robot spawns. These can be ignored. WaveSpawn { StartWaveOutput { Target wave_event_smoke_finish Action Trigger } DoneOutput { Target wave_event_toxic Action Trigger } Name "wave3-transition" WaitForAllDead "wave3-group2" WaitBeforeStarting 2 // 2 second break inbetween hazards } WaveSpawn { Name "wave3-group3" TotalCount 5 SpawnCount 5 MaxActive 5 Where spawnbot Where spawnbot_gate WaitForAllDead "wave3-transition" WaitBeforeStarting 10 // 10 second wait while hazard starts TFBot { Template T_Caster_Soldier Tag nav_prefer_right } } } // This wave will only have tanks, including grenade tanks. The path tanks take is roughly the bottom-left path, even though the tank barricade is on the bottom-right, so you can set the path models to the bottom-left path only if there are no regular robots. Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action trigger } InitWaveOutput { Target wave_pathmodels_bottom_l Action Trigger } // Since a grenade tank will be spawning in this wave, its hazard icon should be inserted at the appropriate position. Hopefully you didn't forget about the final wave not giving 100 bonus money. WaveSpawn { Support Limited TotalCount 1 Where spawnbot_money WaitForAllSpawned "wave4-group2" // Will not take up an extra bot slot TotalCurrency 1000 TFBot { Class Scout ClassIcon caster_grenadetank } } // This first group contains two tanks which spawn far apart from each other. All tanks except grenade tanks must have the name tankboss and start at path_tank_1, as there are triggers on the map that require this name and starting position. Notice that the door to the tank area opens whenever a tank spawns inside it, and attempts to close once all tanks have left. You should space out the tanks so that the door is always able to close completely before a new tank is spawned. Tanks should also never be faster than 110 HU/s, otherwise the doors at the tank area will become stuck as tanks pass by. WaveSpawn { Name "wave4-group1" TotalCount 2 WaitBetweenSpawns 8 Tank { Name "tankboss" Health 1500 Speed 110 // Maximum speed StartingPathTrackNode "path_tank_1" OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } // These final two groups spawns grenade tanks. Note that only one can be active at a time due to the limitations of population files firing inputs to templates. If you plan to use multiple, there must be at least a 1 second gap to make sure the dead tank's template copy has been completely removed. Grenade tanks must have the name grenadetankboss and start at path_grenadetank_1, as well as having grenadetank_start_relay and grenadetank_kill_relay attached to their WaveSpawns. Once a grenade tank has fully emerged from the tank area, it will begin to shoot Demoman pipe bombs into the air, one every eighth of a second. These explode at the expected time and can land on both the bottom and top floor. Grenade tanks will only stop firing once they reach a certain distance from the bomb hatch, to prevent them from spawn camping. WaveSpawn { Name "wave4-group2" TotalCount 1 WaitForAllDead "wave4-group1" Tank { Name "grenadetankboss" Health 6000 Speed 60 Skin 1 StartingPathTrackNode "path_grenadetank_1" OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } FirstSpawnOutput { Target grenadetank_start_relay Action Trigger } DoneOutput { Target grenadetank_kill_relay Action Trigger } } WaveSpawn { Name "wave4-group3" TotalCount 1 WaitForAllDead "wave4-group2" WaitBeforeStarting 1 // 1 second gap between grenade tanks Tank { Name "grenadetankboss" Health 6000 Speed 60 Skin 1 StartingPathTrackNode "path_grenadetank_1" OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } FirstSpawnOutput { Target grenadetank_start_relay Action Trigger } DoneOutput { Target grenadetank_kill_relay Action Trigger } } } }