//Arbitrary Aggrievocation, by Seelpit //Extra credits: //- lite and washy: various PointTemplates, such as the capture points //- royal: Fixing up the Carbinewacka template, general insanity. //- Eve: custom capture area model and general PointTemplates inspiration //- PigPig: originally made the map //- Braindawg: majority of logic to make the map suited for reverse //- Hellblade: boss inspiration and advice, + being super cute //Somewhat difficult? //An extremely dumb expert that is actually a normal mission with global weapon nerfs. //haha just kidding it's an engie-only reverse mission yeehaw //Main gimmicks: //- Engie-only. Custom upgrades only. //- Each wave gets a different objective, or a slight twist on it. //- Objectives may include: // - Standard bomb deploy, with a VIP // - Gate capture, followed by bomb deploy. May be replacing the control point instead. // - Tank escort // - VIP protection //ORDER: //The opposite "side" is used for the intended path, as this flows moderately better. //wave 1: Gate skip. VIP escort. -- red path //wave 2: Gate skip. VIP escort. -- blue path //wave 3: Gate capture, VIP escort. -- red path //wave 4: Gate capture, VIP escort. -- blue path //wave 5: Gate capture, tank escort. -- red path //wave 6: protect a boss...as red bots! -- SIDE: red spawn! //spawnbot names: //spawnbot: "front" random //spawnbot_front_left: "blue" side, front //spawnbot_right: blue side //spawnbot_front_right: "red" side, front //spawnbot_left: red side //yes this is dumb //relay names: //wave_finished_nextwave_random ; finished relay + set path to == random //wave_finished_nextwave_random_consistent ; "" + set path to == "", and be consistent after wave fail //wave_finished_nextwave_right ; "" + set path to == blue side //wave_finished_nextwave_left ; "" + set path to == red side //required tags: //bomb_carrier ; for bomb-aimed bots, aka all blue bots //nav_prefer_gate_flank ; for gatebots //extra things //- engiebots at fake locs; spawn a sentry, then InterruptAction the engies to target it. They'll revert to base behavior w/o sentry, so make them mobber! //- sniper bots at fake locs; force them to go to target, prevent jump, force a mouse2 input, -100% aim move speed, use Focus w inf duration to stay scoped, target closest player. //TODO //Testing notes: //W1 //- //W2 //- Add glow to point, if possible //- Add notif about timer going down after point cap #base robot_standard.pop #base robot_giant.pop #base robot_gatebot.pop #base robot_giant_red.pop //Braindawg-made, RED variants of Valve bots #base robot_standard_red.pop //Usage: T_TFBot_Red_Template_Name #base robot_gatebot_red.pop //f.e. T_TFBot_Red_Soldier (NOTE: uses UseBestWeapon) //alternatively, add Template RedBot to it - adds on Action Mobber and the reprogram addcond popuwashyon { StartingCurrency 200 CanBotsAttackWhileInSpawnRoom Yes RespawnWaveTimeBlue 4 FixedRespawnWaveTimeBlue 1 TextPrintTime 0 BonusRatioHalf 1.1 BonusRatioFull 1.1 //Copied from Braindawg's reverse; "fixes". NoMvMDeathTune 1 SniperAllowHeadshots 1 //change if required SentryBusterFriendlyFire 0 ImprovedAirblast 0 //NO!!!! SendBotsToSpectatorImmediately 1 //Player mods NoReanimators 1 ReverseWinConditions 1 BluHumanFlagCapture 0 //engies don't cap flags, dummy BluHumanFlagPickup 0 AllowJoinTeamBlueMax 6 AllowJoinTeamBlue 1 HumansMustJoinTeam blue BluPlayersAreRobots 1 SetCreditTeam 3 BluHumanInfiniteAmmo 0 //give dispensers more reason to exist BluHumanSpawnNoShoot 0 //lets you test yer guns MaxTotalPlayers 6 //ya RobotLimit 26 //yes yes yes BluHumanBotTeleporter 0 //perhaps restrict to only Eureka? BotsUsePlayerTeleporters 0 //prevent weirdness FlagEscortCountOffset 10 //adds onto it, from 4 AllowFlagCarrierToFight 1 //thonk? ExtendedUpgradesOnly 1 //a very [specil] deal //Announcer sounds disabled //All dead; DisableSound "Announcer.MVM_All_Dead" //Bomb responses; DisableSound "Announcer.MVM_Bomb_Alert_Entered" DisableSound "Announcer.MVM_Bomb_Alert_Near_Hatch" DisableSound "Announcer.MVM_Bomb_Alert_Deploying" //Tank responses; DisableSound "Announcer.MVM_Tank_Planted" DisableSound "Announcer.MVM_Tank_Alert_Spawn" DisableSound "Announcer.MVM_Tank_Alert_Another" DisableSound "Announcer.MVM_Tank_Alert_Multiple" DisableSound "Announcer.MVM_Tank_Alert_Halfway" DisableSound "Announcer.MVM_Tank_Alert_Halfway_Multiple" DisableSound "Announcer.MVM_Tank_Alert_Near_Hatch" DisableSound "Announcer.MVM_Tank_Alert_Deploying" //cool models PrecacheModel "models/props_mvm/mvm_upgrade_blu_center.mdl" PrecacheModel "models/props_mvm/mvm_upgrade_blu_tools.mdl" PrecacheModel "models/props_mvm/no_entry.mdl" PrecacheModel "models/bots/sniper_boss/bot_sniper_boss.mdl" PrecacheModel "models/props_gameplay/cap_square_256.mdl" PrecacheModel "models/props_gameplay/cap_square_512.mdl" // "OnTrigger" "!parent,AddOutput,OnHealthBelow90Percent !self:SetSpeed:85:0:-1,0,-1" // apparently you can do this ^ with triggers, for addoutput // Seems to be "Output Target:Action:Param:Time:Repeats" // bluesidedoor_0 thru 2: front // 3 thru 5: leads from factory to hatch bridge PointTemplates { //Taken directly from Braindawg, edited as seen fit. corelogic { NoFixup 1 //win logic game_round_win { "targetname" "bots_win_red" "origin" "-1611.31 4748.55 169.35" "TeamNum" "2" "switch_teams" "0" "force_map_reset" "1" "classname" "game_round_win" } //trigger this relay to make red win logic_relay { "targetname" "redwin_relay" "origin" "266.305756 514.122192 103.214890" "OnTrigger" "bots_win_red,RoundWin,,0,-1" "OnTrigger" "pit_explosion_wav,PlaySound,,0,-1" "OnTrigger" "player,setforcedtauntcam,1,0.1,-1" } logic_relay { "targetname" "mainrelay" //Disable the spy spawns, set their team to red, re-enable them "OnSpawn" "spawnbot_mission_spy*,Disable,,0,-1" "OnSpawn" "spawnbot_mission_spy*,SetTeam,2,0.01,-1" "OnSpawn" "spawnbot_mission_spy*,Enable,,10,-1" "OnSpawn" "func_tfbot_hint,Disable,,0,-1" // Remove filters for bombhat and red team // Remove alarm of gatecap, radiowaves, and the gatecap stun // Disables ALL trigger pushes // Remove thing that keeps closing doors //blue_bombhat -> gatebots + is blue. Kept for waves that need it. // "OnSpawn" "filter_blue_bombhat,Kill,,0,-1" "OnSpawn" "filter_redteam,Kill,,0,-1" //kill jump-pad and grinder filter "OnSpawn" "gate1_alarm,Kill,,0,-1" "OnSpawn" "robot_radio_waves_beep,Kill,,0,-1" "OnSpawn" "bot_stun_reprogram,Kill,,0,-1" "OnSpawn" "trigger_push,Disable,,0,-1" //this map loves anti exploit trigger_pushes "OnSpawn" "logic_timer,Kill,,0,-1" //keeps closing doors // Removal of decorations "OnSpawn" "upgradedoor*,Kill,,0,-1" "OnSpawn" "Secretroom*,Kill,,0,-1" "OnSpawn" "music*,Kill,,0,-1" "OnSpawn" "forward_resupply_music*,Kill,,0,-1" "OnSpawn" "resupply_music,Kill,,0,-1" "OnSpawn" "grinder*,Kill,,0,-1" "OnSpawn" "roof_chimneys,Kill,,0,-1" //these 3 alone are ~100 edicts "OnSpawn" "move_rope,Kill,,0,-1" "OnSpawn" "keyframe_rope,Kill,,0,-1" //When blu caps red: open red door; disable bot blocker; disable bombpath arrows //play sound; enable intel_new "OnSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 redsidedoor*:Open:0:-1" "OnSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 LeftSide_Door_blockbots:Disable:0:-1" //bot blocker normally persists until stun ends "OnSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 bombpath_arrows_left_left:Disable:5:-1" "OnSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 Free_robot_Sound:PlaySound:5:-1" //I plan to use non-reset flag either way. // "OnSpawn" "gate_left_capturezone,AddOutput,OnCapTeam2 intel_new:Enable:0:-1" // "OnSpawn" "gate_right_capturezone,AddOutput,OnCapTeam2 intel_new2:Enable:0:-1" //OnCapTeam2 of right cap: Disable bot blocker. //Enable intel_new2 "OnSpawn" "gate_right_capturezone,AddOutput,OnCapTeam2 RightSide_Door_blockbots:Disable:0:-1" "OnSpawn" "RightSide_Door,AddOutput,OnOpen endright:Trigger:0:-1" "OnSpawn" "LeftSide_Door,AddOutput,OnOpen endleft:Trigger:0:-1" // "OnSpawn" "RightSide_Door,AddOutput,OnOpen shopcollision:DisableCollision:0:-1" //nocollide the upgrade station on right gate //If intel is picked up: unpause bot spawning. //Set team to 0. If red team picks it up: reset the intel. "OnSpawn" "intel_new*,AddOutput,OnPickupTeam2 point_populator_interface:UnpauseBotSpawning:0:-1" "OnSpawn" "intel_new*,AddOutput,OnPickupTeam2 intel_new*:SetTeam:0:0:-1" //fixes 2 compasses pointing to the same bomb "OnSpawn" "intel*,AddOutput,OnPickupTeam1 intel*:ForceDrop:0:-1" //red shouldn't have that //On wave start: close blue/red side doors. Disable bluspawntele. //On wave done: re-enable bluspawntele. //Disabled bluspawntele (changed names, not used), //Disabled closing blue doors (required) "OnSpawn" "wave_start_relay,AddOutput,OnTrigger barrier*:DisableCollision:0:-1" "OnSpawn" "wave_start_relay,AddOutput,OnTrigger barrier*:Disable:0:-1" // "OnSpawn" "wave_start_relay,AddOutput,OnTrigger bluesidedoor*:Close:0:-1" // "OnSpawn" "wave_start_relay,AddOutput,OnTrigger redsidedoor*:Close:0:-1" } //Re-enabling the logic for door closing based on side. //The respective triggers are en/disabled depending on which side is picked! logic_relay { "targetname" "door_picker" "OnSpawn" "wave_start_relay,AddOutput,OnTrigger door_picker:Trigger::0:-1" "OnTrigger" "door_delay_blue,Trigger,,0.02,-1" "OnTrigger" "door_delay_red,Trigger,,0.02,-1" } // Caps the left point, red side logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "forcecapleft" "OnTrigger" "gate_capturepoint,SetOwner,3,0.15,-1" "OnTrigger" "gate_capturepoint,SetOwner,3,0.1,-1" "OnTrigger" "gate_capturepoint,SetOwner,3,0,-1" "OnTrigger" "gate_prerequisite_door_left,Disable,,0.15,-1" "OnTrigger" "wave_start_relay,AddOutput,OnTrigger opengateleft:Enable:0.1:-1" "OnTrigger" "playerspawn,Disable,,0.1,-1" "OnTrigger" "spawnbot*,Disable,,0.1,-1" "OnTrigger" "barrierteleleft,Disable,,0,-1" "OnTrigger" "LeftSide_Door,Open,,0.15,-1" "OnTrigger" "point_populator_interface,ChangeBotAttributes,RevertGateBotsBehavior,0.15,-1" "OnTrigger" "point_populator_interface,ChangeDefaultEventAttributes,RevertGateBotsBehavior,0.15,-1" "OnTrigger" "movespawns_left,Trigger,,0,-1" "OnTrigger" "intel_new2,Enable,,0,-1" "OnTrigger" "intel*,ForceReset,,0.5,-1" "OnTrigger" "bombpath_arrows_left_left,Enable,,0,-1" "OnTrigger" "bombpath_arrows_left_left,Disable,,22,-1" "OnTrigger" "redside_engineer_pastpoint,Enable,,0,-1" "OnTrigger" "redside_engineer,Disable,,0,-1" "OnTrigger" "LeftSide_Door_blockbots,Disable,,5,-1" "OnTrigger" "wave_finished_relay,CancelPending,,0,-1" } //Caps the right point, blue side logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "forcecapright" "OnTrigger" "gate_capturepoint,SetOwner,3,0.15,-1" "OnTrigger" "gate_capturepoint,SetOwner,3,0.1,-1" "OnTrigger" "gate_capturepoint,SetOwner,3,0,-1" "OnTrigger" "gate_prerequisite_door_right,Disable,,0.15,-1" "OnTrigger" "wave_start_relay,AddOutput,OnTrigger opengateright:Enable:0.1:-1" "OnTrigger" "playerspawn,Disable,,0.1,-1" "OnTrigger" "spawnbot*,Disable,,0.2,-1" // "OnTrigger" "barrierteleright,Disable,,0,-1" "OnTrigger" "RightSide_Door,Open,,0.15,-1" "OnTrigger" "point_populator_interface,ChangeBotAttributes,RevertGateBotsBehavior,0.15,-1" "OnTrigger" "point_populator_interface,ChangeDefaultEventAttributes,RevertGateBotsBehavior,0.15,-1" "OnTrigger" "movespawns_right,Trigger,,0,-1" "OnTrigger" "intel_new2,Enable,,0,-1" "OnTrigger" "intel*,ForceReset,,0.5,-1" "OnTrigger" "bombpath_arrows_right_right,Enable,,0,-1" "OnTrigger" "bombpath_arrows_right_right,Disable,,22,-1" "OnTrigger" "blueside_engineer_pastpoint,Enable,,0,-1" "OnTrigger" "blueside_engineer,Disable,,0,-1" "OnTrigger" "RightSide_Door_blockbots,Disable,,5,-1" "OnTrigger" "wave_finished_relay,CancelPending,,0,-1" } //Forces right path logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "forceright" "OnTrigger" "blueside_teleport_out,Enable,,1,-1" "OnTrigger" "bluesidedoor_*,Close,,1,-1" "OnTrigger" "bot_bombpath_rightSidePick,Trigger,,1,-1" } //Forces left path logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "forceleft" "OnTrigger" "blueside_teleport_out,Enable,,1,-1" "OnTrigger" "bluesidedoor_*,Close,,1,-1" "OnTrigger" "bot_bombpath_leftSidePick,Trigger,,1,-1" } logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "secondbarrier" "OnTrigger" "tempbarrierB*,Disable,,0,-1" "OnTrigger" "tankcapdoor_opener,Open,,0,-1" "OnTrigger" "left_tankdoor,Open,,0,-1" "OnTrigger" "right_tankdoor,Open,,0,-1" } //Opens red and tankdoors logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "opentankdoors" "OnTrigger" "frontline_tankdoor_clock,Kill,,0,-1" "OnTrigger" "opentankdoor_frontline*,Trigger,,0.01,-1" "OnTrigger" "opentankdoor_frontline*,Trigger,,0.01,-1" "OnTrigger" "redsidedoor*,Open,,0.01,-1" } //Closes blue side doors logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "closerightdoors" "OnTrigger" "game_playerkill,Enable,,0.1,-1" "OnTrigger" "bluesidedoor_*,Close,,0.1,-1" } //Opens blue side doors and tank doors logic_relay { "origin" "0 0 0" "targetname" "openrightdoors" "OnTrigger" "bluesidedoor_*,Open,,1,-1" "OnTrigger" "game_player*,Kill,,0,-1" "OnTrigger" "_leftrrrfrontline_tankdoor,Open,,1,-1" "OnTrigger" "tankcapdoor_opener,Open,,0.1,-1" } //Close tank doors; set the skin of alarm to "off". logic_relay { "origin" "-1611.31 4748.55 169.35" "targetname" "closetankdoors" "OnTrigger" "frontline_tankdoor,Close,,0,-1" "OnTrigger" "gatealarm_fartted,StopSound,,0,-1" "OnTrigger" "Tankdoor_prop_frontline,SetAnimation,1,0,-1" "OnTrigger" "Tankdoor_prop_frontline,Skin,1,0,-1" "OnTrigger" "tempbarrierA*,Enable,,0.01,-1" } //Nav towards hatch func_nav_prerequisite { "targetname" "hatchnav" "mins" "-8000 -8000 -8000" "maxs" "8000 8000 8000" "Entity" "hatchspawn" "filtername" "filter_hatchspawn" "origin" "268 510 129" "spawnflags" "1" "start_disabled" "0" "StartDisabled" "0" "Task" "2" "Value" "-1" } filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "bot_hatchspawn" "targetname" "filter_hatchspawn" } // Teleports to blue side spawn, from red side spawn trigger_teleport { "targetname" "tele_red_to_blue" "StartDisabled" "1" "spawnflags" "3" "target" "spawnbot_front_left" //blue side "origin" "-8800 336 70" //red side "mins" "-200 -200 -200" "maxs" "200 200 200" } // Teleports to red side spawn, from blue side spawn trigger_teleport { "targetname" "tele_blue_to_red" "StartDisabled" "1" "spawnflags" "3" "target" "spawnbot_front_right" //red side "origin" "-6388 -2592 4" //blue side "mins" "-200 -200 -200" "maxs" "200 200 200" } // Teleports to blue side spawn, from red & blue gate. trigger_teleport { "targetname" "tele_redgate_to_blue" "StartDisabled" "1" "target" "spawnbot_front_left" "spawnflags" "3" "origin" "-3260.709961 3534.000000 129.031311" "mins" "-1010 -1010 -1010" "maxs" "1010 1010 1010" } trigger_teleport { "targetname" "tele_bluegate_to_blue" "StartDisabled" "1" "target" "spawnbot_front_left" "spawnflags" "3" "origin" "-3632.000000 -3405.209961 33.031311" "mins" "-1010 -1010 -1010" "maxs" "1010 1010 1010" } // Teleports to red side spawn, from red & blue gate. trigger_teleport { "targetname" "tele_redgate_to_red" "StartDisabled" "1" "target" "spawnbot_front_right" "spawnflags" "3" "origin" "-3260.709961 3534.000000 129.031311" "mins" "-1010 -1010 -1010" "maxs" "1010 1010 1010" } trigger_teleport { "targetname" "tele_bluegate_to_red" "StartDisabled" "1" "target" "spawnbot_front_right" "spawnflags" "3" "origin" "-3632.000000 -3405.209961 33.031311" "mins" "-1010 -1010 -1010" "maxs" "1010 1010 1010" } // Teleport to blue gate, from red & blue side trigger_teleport { "targetname" "tele_red_to_bluegate" "StartDisabled" "1" "spawnflags" "3" "target" "spawnbot_right" //blue gate "origin" "-8800 336 70" //red side "mins" "-200 -200 -200" "maxs" "200 200 200" } trigger_teleport { "targetname" "tele_blue_to_bluegate" "StartDisabled" "1" "spawnflags" "3" "target" "spawnbot_right" //blue gate "origin" "-6388 -2592 4" //blue side "mins" "-300 -300 -200" "maxs" "300 300 200" } //Moves spawns, enables teleports. //From blue gate to blue: logic_relay { "targetname" "movespawns_bluegate_to_blue" "OnTrigger" "spawnbot_front_left,Enable,,0.01,-1" //Front Left is blue "OnTrigger" "spawnbot_right,Disable,,0.01,-1" //Right is blue "OnTrigger" "spawnbot_front_right,Disable,,0.01,-1" //Front Right is red "OnTrigger" "spawnbot_left,Disable,,0.01,-1" //Left is red //Disable tp's to bluegate. "OnTrigger" "tele_blue_to_bluegate,Disable,,0.01,-1" "OnTrigger" "tele_red_to_bluegate,Disable,,0.01,-1" //Enable tp from bluegate, to blue. "OnTrigger" "tele_bluegate_to_blue,Enable,,0.01,-1" } //From blue to red: logic_relay { "targetname" "movespawns_blue_to_red" "OnTrigger" "spawnbot_front_left,Disable,,0.01,-1" //Front Left is blue "OnTrigger" "spawnbot_right,Disable,,0.01,-1" //Right is blue "OnTrigger" "spawnbot_front_right,Enable,,0.01,-1" //Front Right is red "OnTrigger" "spawnbot_left,Disable,,0.01,-1" //Left is red //Disable tp's from red and to other spawns. "OnTrigger" "tele_red_to_blue,Disable,,0.01,-1" "OnTrigger" "tele_red_to_bluegate,Disable,,0.01,-1" "OnTrigger" "tele_bluegate_to_blue,Disable,,0.01,-1" //Enable tp from blue + bluegate, to red. "OnTrigger" "tele_blue_to_red,Enable,,0.01,-1" "OnTrigger" "tele_bluegate_to_red,Enable,,0.01,-1" } //Logic for the hudhint per wave! //wave_start_relay enable the hint; it gets hidden after 10s, then unhidden after 30s //wave_finished_relay then disables the hint. logic_relay //objective display { "targetname" "hudhintloop" "OnTrigger" "hudhint,ShowHudHint,,2,-1" "OnTrigger" "hudhint,HideHudHint,,10,-1" "OnTrigger" "hudhintloop,Trigger,,30,-1" } logic_relay { "targetname" "hudhintloop2" "OnTrigger" "hudhintloop,Trigger,,0,-1" "OnSpawn" "wave_start_relay,AddOutput,OnTrigger hudhintloop:Trigger::1:-1,1,-1" "OnSpawn" "wave_finished_relay,AddOutput,OnTrigger hudhintloop:CancelPending::0:-1,0,-1" } env_hudhint { "targetname" "hudhint" "message" "OBJECTIVE: Escort your bomb carrier to the hatch to win!" "spawnflags" "1" } //Blue gate respawnroom extension. //Stretches from -4125, -3410, -40 // to -3500, -3550, 40 //diff is 625, 140, 80 //become 313, -313; 70, -70; 40, -40 //into -3813, -3480, 0 func_respawnroom { "targetname" "bluegate_resproom" "mins" "-313 -120 -40" "maxs" "313 70 40" "origin" "-3813 -3480 0" "TeamNum" "3" } //Blue side respawnroom extension. //Stretches from -5994 -2622 4 // to -5880 -3222 -84 // diff is 114 -600 -88 //become 57, -57; 300, -300; 44, -44 //into -5937, -2922, -40 //Added 100s to X size for safekeeping func_respawnroom { "targetname" "blue_resproom" "mins" "-157 -600 -44" "maxs" "157 600 44" "origin" "-5937 -2922 -40" "TeamNum" "3" } //Resupply cabinets for blue gate prop_dynamic { "targetname" "resupply_prop_bluegate" "origin" "-4073 -3404 -34" "angles" "0 0 0" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "fadescale" "0" "maxanimtime" "10" "minanimtime" "5" "model" "models/props_gameplay/resupply_locker.mdl" "pressuredelay" "0" "randomanimation" "0" "renderamt" "255" "rendercolor" "255 255 255" "skin" "0" "solid" "6" "spawnflags" "0" "StartDisabled" "0" } //floor is at 36 - 68 = -32, put at -32 + 56 = 24 func_regenerate { "targetname" "resupply_bluegate" "associatedmodel" "resupply_prop_bluegate" "TeamNum" "3" "origin" "-4072 -3380 24" "mins" "-40 -48 -56" "maxs" "40 48 56" } } //Custom sniper spots! Start out disabled. Re-enable them mid-wave! sniperspots { NoFixup 1 func_tfbot_hint { "targetname" "sniper_blu_front" "hint" "0" //0 - sniper spot, 1 - sentry gun spot "TeamNum" "2" "StartDisabled" "1" "origin" "-4440 545 140" } func_tfbot_hint { "targetname" "sniper_blu_mid" "hint" "0" "TeamNum" "2" "StartDisabled" "0" "origin" "-490 -2400 -30" } func_tfbot_hint { "targetname" "sniper_blu_mid2" "hint" "0" "TeamNum" "2" "StartDisabled" "0" "origin" "-1740 -2470 180" } func_tfbot_hint { "targetname" "sniper_blu_base" "hint" "0" "TeamNum" "2" "StartDisabled" "0" "origin" "385 -195 116" } func_tfbot_hint { "targetname" "sniper_red_front" "hint" "0" //0 - sniper spot, 1 - sentry gun spot "TeamNum" "2" "StartDisabled" "1" "origin" "-5800 1100 -30" } func_tfbot_hint { "targetname" "sniper_red_mid" "hint" "0" "TeamNum" "2" "StartDisabled" "1" "origin" "-3550 2000 135" } func_tfbot_hint { "targetname" "sniper_red_base" "hint" "0" "TeamNum" "2" "StartDisabled" "1" "origin" "-600 1400 196" } } engiespot { bot_hint_engineer_nest {} bot_hint_sentrygun {} bot_hint_teleporter_exit {} } //Dimensions are measured "from this side, to this side". // 0-------- 80 -------0 <- // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 117 // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0======================0 | // 0-------- 80 -------0 <- // and 180 high. //Tank dimensions: X (front-back): 117; Y (left-right): 80; Z (bottom-top): 180 tank_hints { NoFixup 1 info_target { "targetname" "tank_def_front" "origin" "70 0 0" } info_target { "targetname" "tank_def_back" "origin" "-70 0 0" } info_target { "targetname" "tank_def_side" "origin" "0 60 0" } info_target { "targetname" "tank_def_side" "origin" "0 -60 0" } } //Timer for 6 mins, by lite! textualtimer_6mins { OnSpawnOutput { Param 5 // change the value for minutes Target minutehand Action SetValue } OnSpawnOutput { Param 60 // change the value for seconds Target secondhand Action SetValue } logic_relay { "targetname" "loserelay" "startdisabled" "1" "ontrigger" "redwin_relay,Trigger,,2,-1" "ontrigger" "realtimer,cancelpending,,2,-1" "onspawn" "wave_start*,addoutput,ontrigger realtimer:trigger::0:-1,0,-1" "onspawn" "wave_finish*,addoutput,ontrigger realtimer:cancelpending::0:-1,0,-1" "onspawn" "wave_finish*,addoutput,ontrigger loserelay:cancelpending::0:-1,0,-1" } NoFixup 1 math_counter { "targetname" "minutehand" "max" "9999" "outvalue" "timerformat,$setkey$case01,,0,-1" "onhitmin" "loserelay,enable,,1,-1" } math_counter { "targetname" "secondhand" "max" "60" "outvalue" "timerformat,$setkey$case02,,0,-1" "outvalue" "zerocompare,setvaluecompare,,0,-1" "onhitmin" "loserelay,trigger,,0,-1" "onhitmin" "!self,setvalue,60,1,-1" "onhitmin" "minutehand,subtract,1,1,-1" } logic_compare { "targetname" "zerocompare" "comparevalue" "9" "onequalto" "timerformat,$setkey$case16,%:0%,0,-1" "ongreaterthan" "timerformat,$setkey$case16,%:%,0,-1" } logic_case { "targetname" "timerformat" "case16" "%:%" "ondefault" "timertext,$setkey$message,,0,-1" "ondefault" "timertext,display,0,0,-1" } game_text { "targetname" "timertext" "color" "65 155 255" "holdtime" "2" "spawnflags" "1" "x" "0.1" "y" "0.2" } logic_relay { "targetname" "realtimer" "spawnflags" "2" "ontrigger" "timerformat,$format,,0.01,-1" "ontrigger" "secondhand,subtract,1,0,-1" "ontrigger" "!self,trigger,,1,-1" } } lastbotlogic { //TODO: //- Add HUD text -> done //- Add sound to play -> to wavespawn NoFixup 1 OnSpawnOutput { Target "lastbot_text" Action Show Delay 0.1 } training_annotation { "targetname" "lastbot_text" "display_text" "This is your last bot! Deploy the bomb, or lose!" "lifetime" "4" "origin" "0 0 0" } } //LOGIC LAYOUT //wave1logic - wave1_spawner: logic only. Activated once the wave is initialized. //It may contain a path picker, but this is generally done at the start of the prior wave. //Path pickers already contain wave_finished_relay! //wave1props - individual names: props only. Spawned at the start of the mission. //wave1starter - wave1_start: logic only. Spawned at the start of a wave. //Must contain wave_start_relay. //TODO: //- Cover up holes around blue gate spawn //- Add prop to weird clipping part in blue gate, next to upgrade station //- Add push to weird clipping part in blue gate //- Add resupply locker //wave 1: Gate skip. VIP escort. -- red path, blue spawn wave1logic { NoFixup 1 logic_relay { "targetname" "wave1_spawner" //Trigger on wave load //Enable blue spawn only, disable red front spawn. "OnTrigger" "spawnbot_front_right,Disable,,0,-1" "OnTrigger" "tele_red_to_blue,Enable,,0.01,-1" //Just in case. "OnTrigger" "tele_bluegate_to_blue,Enable,,0.01,-1" "OnTrigger" "tele_redgate_to_blue,Enable,,0.01,-1" //leftSidePick is the "red" side. //Had to copy this instead of wave_finished_nextwave_left, //bc otherwise wave_finised_relay gets called. "OnTrigger" "bot_bombpath_leftSidePick,Trigger,,1.15,-1" "OnTrigger" "global_rightround,TurnOff,,0,-1" "OnTrigger" "global_leftround,TurnOn,,0,-1" "OnTrigger" "global_randomround,TurnOff,,0,-1" "OnTrigger" "bot_bombpath_resetall,Trigger,,1,-1" //Enable sniper spots. "OnTrigger" "sniper_red_*,Enable,,0.05,-1" } } //Spawnpoints when attacking from the blue spawn, towards red side. wave1props { NoFixup 1 prop_dynamic { "targetname" "spawnpoints_redpath_1" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-6260 300 -105" "defaultanim" "idle" "disableshadows" "1" "skin" "0" // Skin 0 for Red, Skin 1 for Blue, Skin 2 for Gray, and Skin 3 to disable the hologram } prop_dynamic { "targetname" "spawnpoints_redpath_1" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-4280 1470 -94" "defaultanim" "idle" "disableshadows" "1" "skin" "0" } prop_dynamic { "targetname" "spawnpoints_redpath_1" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-6350 1430 -64" "defaultanim" "idle" "disableshadows" "1" "skin" "0" } prop_dynamic { "targetname" "spawnpoints_redpath_2" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-3000 1580 64" "defaultanim" "idle" "disableshadows" "1" "skin" "0" } prop_dynamic { "targetname" "spawnpoints_redpath_2" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-2550 2000 128" "defaultanim" "idle" "disableshadows" "1" "skin" "0" } prop_dynamic { "targetname" "spawnpoints_redpath_2" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-3560 2300 94" "defaultanim" "idle" "disableshadows" "1" "skin" "0" } } wave1starter { NoFixup 1 logic_relay { "targetname" "wave1_start_relay" "OnTrigger" "redsidedoor_1,Close,,0,-1" "OnTrigger" "redsidedoor_2,Close,,0,-1" "OnTrigger" "redsidedoor_4,Close,,0,-1" //not letting you flank all the way to hatch } } //wave 2: Gate skip. VIP escort. -- blue path, red spawn //InitWaveOutput disables red path wave2logic { NoFixup 1 logic_relay { "targetname" "wave2_spawner" //Enable red (front_right), disable blue (front_left) //Enable blue -> red tele, disable blue -> red tele. "OnTrigger" "spawnbot_front_right,Enable,,0,-1" "OnTrigger" "spawnbot_front_left,Disable,,0,-1" "OnTrigger" "tele_blue_to_red,Enable,,0.01,-1" "OnTrigger" "tele_red_to_blue,Disable,,0.01,-1" //rightSidePick is the "red" side. "OnTrigger" "bot_bombpath_rightSidePick,Trigger,,0,-1" //Already enabled. // "OnSpawn" "tele_blue_to_bluegate,Enable,,0.01,-1" // "OnSpawn" "tele_red_to_bluegate,Enable,,0.01,-1" //TESTING ONLY // "OnSpawn" "stuffworks,Show,,0.01,-1" } //Opens blue side's tank doors logic_relay { "origin" "0 0 0" "targetname" "opentankdoors_blu" //Open the doors, play the light's animation and set its skin: "OnTrigger" "_bigboypantsopentankdoor_frontline_left,Trigger,,0.1,-1" "OnTrigger" "right_tankdoor,Open,,0.1,-1" //The door parts actually close themselves after some time, //so I set the wait to -1 to never happen. //Could also Kill them instead. "OnTrigger" "_leftrrrfrontline_tankdoor*,$SetKey$wait,-1,2,-1" //And shut off the light, anim, and sound afterwards. "OnTrigger" "_bigboypantsgatealarm_fartted,StopSound,,4,-1" "OnTrigger" "_bigboypantstankdoor_prop_frontline,AddOutput,skin 1,10,-1" "OnTrigger" "_bigboypantstankdoor_prop_frontline,SetAnimation,Idle,10,-1" "OnTrigger" "tankdoors_blu_text,Show,,0.01,-1" } //Close tank doors; set the skin of alarm to "off". logic_relay { "origin" "0 0 0" "targetname" "closetankdoors_blu" "OnTrigger" "_leftrrrfrontline_tankdoor,Close,,1,-1" } training_annotation { "targetname" "tankdoors_blu_text" "display_text" "The tank doors have opened! Get ready!" "lifetime" "4" "origin" "-3060 -780 285" } } //Spawnpoints when attacking from the blue spawn, towards red side. wave2props { NoFixup 1 prop_dynamic { "targetname" "spawnpoints_blupath" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-6260 300 -105" "defaultanim" "idle" "disableshadows" "1" "skin" "0" // Skin 0 for Red, Skin 1 for Blue, Skin 2 for Gray, and Skin 3 to disable the hologram } prop_dynamic { "targetname" "spawnpoints_blupath" "model" "models/props_mvm/robot_spawnpoint.mdl" "origin" "-5737 -1100 -96" "defaultanim" "idle" "disableshadows" "1" "skin" "0" } } wave2starter {} //TODO: //- Switch spawns properly // - Disable existing spawns // - Enable proper spawns // - Force respawn at start of wave? // - TEST: does it automatically get changed with finished_relay? //- Double-check barrier // - Copy existing logic //- Disable logic that sets gate as capped (standard?) //wave 3: Gate capture, VIP escort. -- red path, blue spawn wave3logic { NoFixup 1 logic_relay { "targetname" "wave3_spawner" //Anyone in blue (gate) spawn will be teleported to blue spawn. Disable red spawn. "OnTrigger" "movespawns_bluegate_to_blue,Trigger,,0.01,-1" // "OnTrigger" "tele_red_to_blue,Enable,,0.01,-1" // "OnTrigger" "tele_bluegate_to_blue,Enable,,0.01,-1" // "OnTrigger" "tele_blue_to_bluegate,Disable,,0.01,-1" // "OnTrigger" "tele_red_to_bluegate,Disable,,0.01,-1" "OnTrigger" "spawnbot_front_left,Enable,,0.01,-1" "OnTrigger" "spawnbot_right,Disable,,0.01,-1" "OnTrigger" "spawnbot_front_right,Disable,,0.01,-1" "OnTrigger" "spawnbot_hatch_alt,Disable,,0.01,-1" "OnTrigger" "wave_finished_nextwave_left,Trigger,,0.01,-1" "OnTrigger" "door_delay_red,Trigger,,0.01,-1" "OnTrigger" "door_delay_blue,Disable,,0.01,-1" "OnTrigger" "intel*,Disable,,0.01,-1" //Tank things! "OnTrigger" "boss_path_11,AddOutput,OnPass tankstopper:Trigger::0:-1,0,-1" "OnTrigger" "boss_path_15,AddOutput,OnPass tankstopper:FireUser1::0:-1,0,-1" "OnTrigger" "boss_path_branch2,AddOutput,OnPass tankdoor_silencer:Trigger::4:-1,0,-1" } } wave3props {} wave3starter {} //wave 4: Gate capture, VIP escort. -- blue path, red spawn wave4logic { NoFixup 1 logic_relay { "targetname" "wave4_spawner" //Anyone in blue (gate) spawn will be teleported to red spawn. Disable blue spawn. "OnTrigger" "movespawns_blue_to_red,Trigger,,0.01,-1" // "OnTrigger" "tele_blue_to_red,Enable,,0.01,-1" // "OnTrigger" "tele_bluegate_to_red,Enable,,0.01,-1" // "OnTrigger" "tele_red_to_blue,Disable,,0.01,-1" // "OnTrigger" "tele_bluegate_to_blue,Disable,,0.01,-1" "OnTrigger" "spawnbot_front_right,Enable,,0.01,-1" "OnTrigger" "spawnbot_left,Disable,,0.01,-1" "OnTrigger" "spawnbot_front_left,Disable,,0.01,-1" "OnTrigger" "spawnbot_hatch_alt,Disable,,0.01,-1" "OnTrigger" "spawnbot_w3_gateboxes,Disable,,0.01,-1" "OnTrigger" "wave_finished_nextwave_left,Trigger,,0.01,-1" "OnTrigger" "door_delay_red,Enable,,0.01,-1" "OnTrigger" "door_delay_blue,Disable,,0.01,-1" "OnTrigger" "door_delay_red,Trigger,,0.03,-1" "OnTrigger" "intel,Enable,,0.01,-1" //non-return intel "OnTrigger" "hudhint,$SetKey$message,OBJECTIVE: Escort your bomb carrier to the hatch to win!,0,-1" } logic_relay { "targetname" "front_red_open" "OnTrigger" "opentankdoor_frontline_left,Trigger,,0,-1" "OnTrigger" "tankdoor_silencer,Trigger,,0,-1" "OnTrigger" "barrier_redside_w4,Disable,,0,-1" "OnTrigger" "barrier_redside_prop_w4,Disable,,0,-1" } } wave4props { NoFixup 1 func_forcefield { "origin" "-5220 850 34" "targetname" "barrier_redside_w4" "rendermode" "10" "TeamNum" "2" //Ranges from -5270 1000 -64 //Ranges to -5170 700 124 //diff 100 -300 180 //becomes... 50 150 90 //on... -5220 850 34 "maxs" "50 150 90" "mins" "-50 -150 -90" "StartDisabled" "0" } prop_dynamic { "targetname" "barrier_redside_prop_w4" "origin" "-5235 850 30" "angles" "0 180 0" "modelscale" "0.85" "fademindist" "128" "fademaxdist" "512" "disablereceiveshadows" "1" "model" "models/props_mvm/no_entry.mdl" "disableshadows" "1" "solid" "0" "StartDisabled" "0" } } wave4starter {} //wave 5: Gate capture, tank escort. -- red path, blue spawn wave5logic { NoFixup 1 logic_relay { "targetname" "wave5_spawner" "OnTrigger" "hudhint,$SetKey$message,OBJECTIVE: Escort the tank to the hatch to win!,0,-1" } logic_relay { "targetname" "tankstopper" "OnTrigger" "tankboss,SetSpeed,0,5,-1" "OnUser1" "spawnbot_w3_boxesdoor,Disable,,0,-1" "OnUser1" "spawnbot_hatch_alt,Enable,,0,-1" "OnUser1" "left_tankdoor,Open,,0,-1" "OnUser2" "tankboss,SetSpeed,60,0,-1" } logic_relay { "targetname" "tankdoor_silencer" "OnTrigger" "gatealarm_fartted,StopSound,,0,-1" "OnTrigger" "Tankdoor_prop_frontline,SetAnimation,1,0,-1" "OnTrigger" "Tankdoor_prop_frontline,Skin,1,0,-1" } } //wave 6: protect a boss...as red bots! -- SIDE: player spawn! wave6logic { NoFixup 1 logic_relay { "targetname" "wave6_spawner" "OnTrigger" "hudhint,$SetKey$message,OBJECTIVE: Destroy.,0,-1" } } tempbarriers { func_forcefield { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "tempbarrierA1" "parentname" "tempbarrierA" "mins" "-300 -100 -3000" "maxs" "300 100 3000" "StartDisabled" "0" } prop_dynamic { "targetname" "tempbarrierA" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "modelscale" "1.5" "renderamt" "0" "renderfx" "16" //"rendermode" "0" "skin" "1" "CollisionGroup" "1" "solid" "0" "StartDisabled" "0" "origin" "0 0 0" } } tempbarriers2 { NoFixup 1 func_forcefield { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "tempbarrierB1" "parentname" "tempbarrierB" "mins" "-300 -100 -300" "maxs" "300 100 300" "StartDisabled" "0" } prop_dynamic { "targetname" "tempbarrierB" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "modelscale" "1.5" "renderamt" "0" "renderfx" "16" //"rendermode" "0" "skin" "1" "CollisionGroup" "1" "solid" "0" "StartDisabled" "0" "origin" "0 0 0" } } station { NoFixup 1 func_upgradestation //upgrade station entity { "mins" "-105 -100 0" "maxs" "105 100 242" "solid" "0" } prop_dynamic { "angles" "0 0 0" "model" "models\props_mvm\mvm_upgrade_blu.mdl" "modelscale" "1.0" "rendercolor" "255 255 255" "solid" "2" "targetname" "station" "origin" "0 0 0" } // prop_dynamic // { // "targetname" "idiot" // "parentname" "upgradestation" // "DisableBoneFollowers" "1" // "disableshadows" "1" // "fademaxdist" "0" // "fademindist" "-1" // "model" "models/bots/bot_worker/bot_worker_a.mdl" // "DefaultAnim" "idle" // "renderfx" "0" // "rendermode" "0" // "SetBodyGroup" "2" // "skin" "1" // "solid" "0" // "origin" "-65 50 0" // } // prop_dynamic // { // "targetname" "shopcollision" // "angles" "0 -90 0" // "DisableBoneFollowers" "1" // "disablereceiveshadows" "1" // "model" "models/props_vehicles/train_flatcar_container.mdl" // "disableshadows" "1" // "fademaxdist" "0" // "fademindist" "-1" // "renderamt" "0" // "renderfx" "0" // "rendermode" "10" // "CollisionGroup" "5" // "solid" "6" // "StartDisabled" "0" // "origin" "0 0 0" // } } station_rotated_90n { NoFixup 1 func_upgradestation //upgrade station entity { "targetname" "station_func_90n" "mins" "-105 -100 0" "maxs" "105 100 242" "solid" "0" } func_forcefield //because solid options are just really...funky. { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "station_clip_90n" "maxs" "115 80 242" "mins" "-115 -80 0" "StartDisabled" "0" } prop_dynamic { "model" "models\props_mvm\mvm_upgrade_blu.mdl" "modelscale" "1.0" "rendercolor" "255 255 255" "solid" "0" "targetname" "station_90n" "origin" "0 0 0" "angles" "0 -90 0" } } station_rotated_90p { NoFixup 1 func_upgradestation //upgrade station entity { "targetname" "station_func_90p" "mins" "-105 -100 0" "maxs" "105 100 242" "solid" "0" } func_forcefield //because solid options are just really...funky. { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "station_clip_90p" "maxs" "138 80 242" "mins" "-130 -80 0" "StartDisabled" "0" } prop_dynamic { "model" "models\props_mvm\mvm_upgrade_blu.mdl" "modelscale" "1.0" "rendercolor" "255 255 255" "solid" "0" "targetname" "station_90p" "origin" "0 0 0" "angles" "0 90 0" } } station_rotated_65 { NoFixup 1 func_upgradestation //upgrade station entity { "mins" "-105 -100 0" "maxs" "105 100 242" "solid" "0" } prop_dynamic //because func_forcefield is funky. { "targetname" "station_clip_60" "origin" "0 30 0" "angles" "0 65 0" // "modelscale" "1.4" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence01.mdl" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "solid" "6" } prop_dynamic //because func_forcefield is funky. { "targetname" "station_clip_60_2" "origin" "100 -30 0" "angles" "0 65 0" // "modelscale" "1.4" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence01.mdl" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "solid" "6" } prop_dynamic { "model" "models\props_mvm\mvm_upgrade_blu.mdl" "modelscale" "1.0" "rendercolor" "255 255 255" "solid" "0" "targetname" "station_65" "origin" "0 0 0" "angles" "0 65 0" } } W2_precapbarriers { NoFixup 1 func_forcefield { "origin" "0 0 0" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "targetname" "tempbarrierB1" "parentname" "tempbarrierB" "mins" "-300 -100 -300" "maxs" "300 100 300" "StartDisabled" "0" } prop_dynamic { "targetname" "tempbarrierB" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "modelscale" "1.5" "renderamt" "0" "renderfx" "16" //"rendermode" "0" "skin" "1" "CollisionGroup" "1" "solid" "1" "StartDisabled" "0" "origin" "0 0 0" } } barriers_bluside { NoFixup 1 OnSpawnOutput { Target "tf_point_nav_interface" Action "RecomputeBlockers" Delay 1 } func_forcefield { "targetname" "w3_barrierf" //-5590 -220 -90 //-5580 640 1450 //Diff: //10 860 1540 //5 430 770 "origin" "-5585 210 680" "mins" "-15 -930 -770" "maxs" "5 430 770" "rendercolor" "255 255 255" "renderfx" "0" "rendermode" "10" "TeamNum" "2" "StartDisabled" "0" } func_nobuild { "targetname" "w3_barrierb" "origin" "-5585 210 680" "mins" "-15 -930 -770" "maxs" "75 430 770" "TeamNum" "3" } prop_dynamic { "targetname" "w3_barrier" "origin" "-5490 30 -110" "angles" "0 90 0" "DisableBoneFollowers" "1" "disablereceiveshadows" "1" "model" "models/props_vehicles/train_flatcar_container.mdl" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "modelscale" "1.5" "renderamt" "0" "renderfx" "16" //"rendermode" "0" "skin" "1" "CollisionGroup" "1" "solid" "1" "StartDisabled" "0" } } ramps { NoFixup 1 prop_dynamic //carrier tank ramp { "targetname" "ramp" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence01.mdl" "renderfx" "0" "rendermode" "10" "solid" "6" "origin" "0 0 0" } } barrier { NoFixup 1 prop_dynamic { "targetname" "barrierbuilding" "disableshadows" "1" "fademaxdist" "0" "fademindist" "0.0001" "model" "models\props_buildings\building_002a.mdl" "renderfx" "1" "rendermode" "0" "solid" "6" "origin" "0 0 0" } } decoration { NoFixup 1 prop_dynamic { "targetname" "rocc" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models\bots\boss_bot\boss_tank_part1_destruction.mdl" "renderfx" "0" //"rendermode" "0" "solid" "6" "origin" "0 0 0" } } barrierfence { NoFixup 1 prop_dynamic { "targetname" "barrier1" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence01.mdl" "renderfx" "0" //"rendermode" "0" "solid" "6" "origin" "0 0 0" } prop_dynamic { "targetname" "barrier2" "disableshadows" "1" "fademaxdist" "0" "fademindist" "-1" "model" "models/props_2fort/sniper_fence02.mdl" "RandomAnimation" "1" "renderfx" "0" //"rendermode" "0" "solid" "6" "origin" "0 0 0" } } AirTeleport { NoFixup 1 filter_tf_bot_has_tag { "Negated" "0" "require_all_tags" "1" "tags" "airtp" //add this tag to the bot you want to teleport "targetname" "filter_airtp" } trigger_teleport { "origin" "700 1275 200" //locate this where the bot will spawn: spawnbot "mins" "-500 -500 -200" "maxs" "500 500 200" "spawnflags" "1" "filtername" "filter_airtp" "target" "destination" //Where to teleport the bot to } info_target //Will serve as the destination { "targetname" "destination" "origin" "-6680 -600 1050" //Where the bot goes } } annotation_airdrop { NoFixup 1 OnSpawnOutput { Target "airdropped" Action Show Delay 0.5 } training_annotation { "targetname" "airdropped" "display_text" "An aerial attack! Look up!" "lifetime" "5" "origin" "0 0 0" } } annotation_tank_req { NoFixup 1 OnSpawnOutput { Target "airdropped" Action Show Delay 0.5 } training_annotation { "targetname" "tankmessage" "display_text" "Kill the glowing giant to progress!" "lifetime" "5" "origin" "0 0 0" } } Teleporter_Blu { NoFixup 1 OnSpawnOutput //make teleporter non solid, otherwise the bots might get stuck on it { Target "tp" Action "addoutput" Param "solid 0" Delay 0.1 } OnSpawnOutput //hide it, can't have anything targeting this. { Target "tp" Action "Hide" Delay 0.00 } obj_teleporter { "targetname" "tp" "spawnflags" "2" "teamnum" "3" "TeleportWhere" "spawnbot_right_w2" "origin" "0 0 0" } } Teleporter_Red_w4 { NoFixup 1 OnSpawnOutput //make teleporter non solid, otherwise the bots might get stuck on it { Target "tp_left" Action "addoutput" Param "solid 0" Delay 0.1 } OnSpawnOutput //make teleporter non solid, otherwise the bots might get stuck on it { Target "tp_right" Action "addoutput" Param "solid 0" Delay 0.1 } obj_teleporter { "targetname" "tp_left" "spawnflags" "2" "teamnum" "2" "TeleportWhere" "spawnbot_w3_boxesdoor" "origin" "0 30 50" } obj_teleporter { "targetname" "tp_right" "spawnflags" "2" "teamnum" "2" "TeleportWhere" "spawnbot_hatch" "origin" "0 -30 50" } } Teleporter_Shot { NoFixup 1 OnSpawnOutput //make teleporter non solid, otherwise the bots might get stuck on it { Target "tp_alt" Action "addoutput" Param "solid 0" Delay 0.1 } OnSpawnOutput //make teleporter non solid, otherwise the bots might get stuck on it { Target "tp_alt" Action "removehealth" Param "1000" Delay 1 } obj_teleporter { "targetname" "tp_alt" "spawnflags" "2" "teamnum" "2" "origin" "0 0 0" } } // Tank related repairtank { NoFixup 1 // OnSpawnOutput // { // Target "trigger_repair" // Action "SetParent" // Param "!activator" // } // OnSpawnOutput // { // Target panictank_init_relay // Action Trigger // } // OnSpawnOutput // { // Target "tankboss" // Action SetHealth // Param 10 // } info_target { "targetname" "tankshere" } filter_tf_bot_has_tag { "targetname" "filter_tankrepair" "tags" "bot_repair" "require_all_tags" "1" "Negated" "0" } // filter_tf_bot_has_tag // { // "targetname" "filter_tankspeed" // "tags" "bot_speedup" // "require_all_tags" "1" // "Negated" "0" // } trigger_multiple { "targetname" "trigger_repair" "mins" "-119 -100 -150" "maxs" "119 100 150" "filtername" "filter_tankrepair" "OnStartTouch" "tankboss*,AddHealth,100,0.02,-1" "OnStartTouch" "tankdamage_relay,Trigger,,0.04,-1" "OnStartTouch" "!activator,SetHealth,-1,0.2,-1" //kill the activator "spawnflags" 64 } // trigger_multiple // { // "targetname" "trigger_speed" // "mins" "-119 -100 -150" // "maxs" "119 100 150" // "filtername" "filter_tankspeed" // "OnStartTouch" "!activator,SetHealth,-1,0,-1" //kill the activator // "OnStartTouch" "tankboss,SetSpeed,75,0,-1" // "spawnflags" 64 // } } //Deals 1 damage to tank tankdamage { logic_relay { "targetname" "tankdamage_relay" "OnTrigger" "tankboss*,$TakeDamageFromActivator,1,0,-1" } } //tankspeed relays, by lite tankspeed_1 { //Set the max hit points logic_relay { "onspawn" "!parent,$getkey$health,healthcounter_high|sethitmax|0,0,-1" "onspawn" "!parent,$getkey$health,healthcounter_high|setvalue|0,0.01,-1" "onspawn" "!parent,$getkey$health,healthcounter_low|sethitmax|0,0,-1" "onspawn" "!parent,$getkey$health,healthcounter_low|setvalue|0,0.01,-1" } //70% logic_relay { "onspawn" "healthcounter_high,multiply,0.7,0.02,-1" } math_counter { "targetname" "healthcounter_high" "outvalue" "tankcompare_high,setcomparevalue,,0,-1" } logic_timer { "refiretime" "0.1" "ontimer" "!parent,$getdata$m_iHealth,tankcompare_high|setvaluecompare|0,0,-1" } logic_compare { "targetname" "tankcompare_high" "ongreaterthan" "!parent,setspeed,75,0,-1" "onlessthan" "!parent,$getdata$m_iHealth,tankcompare_low|setvaluecompare|0,0,-1" } //40% logic_relay { "onspawn" "healthcounter_low,multiply,0.4,0.02,-1" } math_counter { "targetname" "healthcounter_low" "outvalue" "tankcompare_low,setcomparevalue,,0,-1" } logic_compare { "targetname" "tankcompare_low" "ongreaterthan" "!parent,setspeed,50,0,-1" "onlessthan" "!parent,setspeed,15,0,-1" } // logic_timer // { // "refiretime" "0.1" // "ontimer" "!parent,$getdata$m_iHealth,tankcompare_low|setvaluecompare|0,0,-1" // } } ApplyCondIfCond { NoFixup 1 //Test if this works, if you wanna use this. OnSpawnOutput { Target filter_hascond Action SetParent Param !activator } filter_tf_condition { "targetname" "filter_hascond" "condition" 11 "Negated" 0 "OnFail" "!parent,$RemoveCond,113,0,-1" "OnPass" "!parent,$AddCond,113,0,-1" } logic_relay { "targetname" "applycond" "OnTrigger" "applycond,Trigger,,0.2,-1" //checks every 0.2 seconds "OnTrigger" "filter_hascond,TestActivator,!parent,0,-1" //Tests filter on the parent } } //I shamelessly stole this from royal //thank you tomboy enjoyer Combo_Pyro { NoFixup 1 logic_relay { "targetname" "combo_primary_to_secondary" "spawnflags" "2" "OnTrigger" "!self,EnableRefire,,0,-1" "OnTrigger" "!activator,$RemoveItemAttribute,fire input on hit|0,0,-1" "OnTrigger" "!activator,$WeaponSwitchSlot,1,0,-1" "OnTrigger" "!activator,$AddPlayerAttribute,disable weapon switch|1,0.01,-1" "OnTrigger" "!activator,$RemovePlayerAttribute,disable weapon switch,0.6,-1" "OnTrigger" "!activator,$WeaponSwitchSlot,0,0.61,-1" "OnTrigger" "!activator,$AddItemAttribute,fire input on hit|combo_primary_to_secondary^Trigger^|0,0.62,-1" } } Carbinewacka { NoFixup 1 OnSpawnOutput { Target combo_secondary_to_melee Action Trigger } OnSpawnOutput { Target "!activator" Action "$AddPlayerAttribute" Param "disable weapon switch|1" } filter_tf_condition { "targetname" "filter_minicrits" "condition" "19" //minicrits from Carbine effect "Negated" "0" "OnPass" "!activator,$RemovePlayerAttribute,disable weapon switch,0,-1" "OnPass" "!activator,$WeaponSwitchSlot,2,0.01,-1" "OnPass" "!activator,$AddPlayerAttribute,disable weapon switch|1,0.011,-1" "OnFail" "!activator,$RemovePlayerAttribute,disable weapon switch,0,-1" "OnFail" "!activator,$WeaponSwitchSlot,1,0.01,-1" "OnFail" "!activator,$AddPlayerAttribute,disable weapon switch|1,0.011,-1" } logic_relay { "targetname" "combo_secondary_to_melee" "spawnflags" "2" "OnTrigger" "!self,Trigger,,0.5,-1" //checks every 0.5 seconds "OnTrigger" "filter_minicrits,TestActivator,,0,-1" //Tests filter on activator } } //Teleports to the front door. W1_TeleToFront { NoFixup 1 trigger_teleport { "targetname" "w1tele" "filtername" "filter_w1tele" "Origin" "0 0 0" "spawnflags" "64" "target" "target_blu_front" "StartDisabled" "0" "mins" "-100 -100 -100" "maxs" "100 100 100" } filter_tf_bot_has_tag { "targetname" "filter_w1tele" "tags" "w1tele_front" "require_all_tags" "1" "Negated" "0" } OnSpawnOutput { Target "w1tele" Action "Disable" Delay 0.5 } } //Attribute changer attribute_changer { NoFixup 1 point_populator_interface { "targetname" "pop_interface_seel" } //Defensive positioning logic_relay { "targetname" "bot_attr_mid" "OnTrigger" "pop_interface_seel,ChangeBotAttributes,Mid,0.1,-1" "OnTrigger" "pop_interface_seel,ChangeDefaultEventAttributes,Mid,0.1,-1" } logic_relay { "targetname" "bot_attr_base" "OnTrigger" "pop_interface_seel,ChangeBotAttributes,Base,0.1,-1" "OnTrigger" "pop_interface_seel,ChangeDefaultEventAttributes,Base,0.1,-1" } //Offensive change logic_relay { "targetname" "bot_attr_attack" "OnTrigger" "pop_interface_seel,ChangeBotAttributes,Attack,0.1,-1" "OnTrigger" "pop_interface_seel,ChangeDefaultEventAttributes,Attack,0.1,-1" } } //Points used for defensive positioning. //Origin must be specified seperately due to multiple things being spawned. defendpoints { NoFixup 1 //Blue side //Container choke info_target { "targetname" "target_blu_front" "origin" "-5560 15 -30" } //Up the stairs info_target { "targetname" "target_blu_mid2" "origin" "-3330 -1570 170" } //Underneath indoor bridge info_target { "targetname" "target_blu_mid" "origin" "-1580 -2350 -28" } //At the end of outdoor bridge info_target { "targetname" "target_blu_base" "origin" "-75 -495 117" } func_flagdetectionzone //bomb is past front, go to mid { origin "-2640 -1875 125" targetname "bombdetector_blu_front" TeamNum 3 mins "-256 -32 -256" maxs "256 32 256" "OnStartTouchFlag" "bot_attr_mid,Trigger,,0,-1" "OnStartTouchFlag" "bombdetector_blu_front,Disable,,0.2,-1" "OnStartTouchFlag" "spawnbot_midcheck,Enable,,0,-1" } func_flagdetectionzone //bomb is past mid, go to base { origin "-750 -1560 125" targetname "bombdetector_blu_mid" TeamNum 3 mins "-256 -32 -256" maxs "256 32 256" "OnStartTouchFlag" "bot_attr_base,Trigger,,0,-1" "OnStartTouchFlag" "bombdetector_blu_mid,Disable,,0.2,-1" } //Bridge outdoors, blue side info_target { "targetname" "target_blu_bridge1" "origin" "-680 -1310 133" } info_target { "targetname" "target_blu_bridge1" "origin" "-940 -970 133" } //Red side info_target { "targetname" "target_red_front" "origin" "-5260 850 5" } //Near point, flank route part info_target { "targetname" "target_red_mid" "origin" "-3000 1580 75" } //On barrels, container info_target { "targetname" "target_red_bridge" "origin" "-1180 2200 310" } //At ramp towards grinder info_target { "targetname" "target_red_bridge2" "origin" "-1275 1800 195" } //Facing far side. info_target { "targetname" "target_red_base" "origin" "20 880 117" } //Facing middle bridge info_target { "targetname" "target_red_base2" "origin" "-160 520 117" } } //Yes, I took this right from Bauernhof. //It's a good template, you know? tutorial { NoFixup 1 logic_relay { "spawnflags" "2" "targetname" "tutorial_relay" "OnSpawn" "wave_start_relay,AddOutput,OnTrigger tutorial_relay:FireUser1::0:-1" "OnSpawn" "wave_finished_relay,AddOutput,OnTrigger tutorial_relay:Trigger::0:-1" "OnTrigger" "hints_1,Show,,0,-1" "OnTrigger" "hints_2,Show,,6,-1" "OnTrigger" "hints_3,Show,,12,-1" "OnTrigger" "hints_4,Show,,18,-1" "OnTrigger" "tutorial_relay2,Trigger,,24,-1" "OnUser1" "hints_1,Hide,,0,-1" "OnUser1" "hints_2,Hide,,0,-1" "OnUser1" "hints_3,Hide,,0,-1" "OnUser1" "hints_4,Hide,,0,-1" "OnUser1" "tutorial_relay,CancelPending,,0,-1" "OnUser1" "tutorial_relay2,CancelPending,,0,-1" "OnUser1" "tutorial_relay2,Disable,,0,-1" } logic_relay { "spawnflags" "2" "targetname" "tutorial_relay2" "OnTrigger" "tutorial_relay,Trigger,,0,-1" } training_annotation { "targetname" "hints_1" "display_text" "Buildings start out locked to level 1!" "lifetime" "5.5" "origin" "-6500 -2100 5" } training_annotation { "targetname" "hints_2" "display_text" "You can buy an upgrade to increase it!" "lifetime" "5.5" "origin" "-6400 -2840 5" } training_annotation { "targetname" "hints_3" "display_text" "Teleporters CANNOT be built." "lifetime" "5.5" "origin" "-6500 -2100 5" } training_annotation { "targetname" "hints_4" "display_text" "Use !missioninfo to find extra information." "lifetime" "5.5" "origin" "-6500 -2100 5" } } } // SpawnTemplate // { // Name "decoration" // "origin" "-6195.264160 -3040.455078 -80" // "angles" "0 0 20" // } // SpawnTemplate // { // Name "decoration" // "origin" "-6746.156250 -2891.279297 -80.912525" // "angles" "0 75 20" // } //Spawn barriers SpawnTemplate //right side { Name "barrier" "origin" "-6439.902344 -1635.442871 1062.62023" "angles" "0 0 0" } SpawnTemplate //left side { Name "barrier" "origin" "-7837.259277 605.864136 723.93450" "angles" "0 0 0" } //Fences // SpawnTemplate // { // Name "barrierfence" // "origin" "-8326.719238 698.392883 19.731293" // "angles" "0 -180 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-8326.719238 528.392883 19.731293" // "angles" "0 -180 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-8326.719238 368.392883 19.731293" // "angles" "0 -180 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-6178.697754 -2315.712158 -50.515499" // "angles" "0 -90 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-6378.697754 -2315.712158 -50.515499" // "angles" "0 -90 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-6578.697754 -2315.712158 -50.515499" // "angles" "0 -90 0" // } // SpawnTemplate // { // Name "barrierfence" // "origin" "-6778.697754 -2315.712158 -50.515499" // "angles" "0 -90 0" // } //Ramps SpawnTemplate { Name "ramps" "origin" "-9073.923828 170.062286 -80.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-9073.923828 -20.062286 25.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-9273.923828 90.062286 25.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-8873.923828 120.062286 -80.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-8943.923828 -70.062286 25.031311" "angles" "-60 65 0" } SpawnTemplate { Name "ramps" "origin" "-9273.923828 210.062286 -30.031311" "angles" "-60 65 0" } //Upgrade stations SpawnTemplate //red side (left when looking towards hatch) { Name "station" "origin" "-9394.505859 -494.312805 148.10629" } SpawnTemplate //blue side { Name "station_rotated_90p" "origin" "-6461.757813 -2983.834473 -66.347286" } SpawnTemplate //red gate { Name "station" "origin" "-3431.968750 3529.504639 70" "angles" "0 0 0" } SpawnTemplate //blue gate { Name "station_rotated_90n" "origin" "-3644.874512 -3163.577881 -23" "angles" "0 0 0" } ExtraSpawnPoint { Name "spawnbot_hatch" //Spawns at red spawn's "A" doorway, red side TeamNum 2 //3 is for all bots X 700 Y 1430 Z 200 } ExtraSpawnPoint { Name "spawnbot_hatch" //Spawns at red spawn's "B" doorway, red side TeamNum 2 X 730 Y 1110 Z 200 } ExtraSpawnPoint { Name "spawnbot_hatch_alt" //Spawns at red spawn's "A" doorway, red side TeamNum 2 //3 is for all bots X 700 Y 1430 Z 200 } ExtraSpawnPoint { Name "spawnbot_hatch_alt" //Spawns at red spawn's "B" doorway, red side StartDisabled 1 TeamNum 2 X 730 Y 1110 Z 200 } ExtraSpawnPoint { Name "spawnbot_blugate" TeamNum 2 X -3330 Y -1570 Z 170 } ExtraSpawnPoint { Name "spawnbot_hatch_def" TeamNum 2 X 263 Y 500 Z 140 } //Special front spawns for wave 2! ExtraSpawnPoint { Name "spawnbot_front_w2_red" TeamNum 2 X -7060 Y 680 Z -65 } ExtraSpawnPoint { Name "spawnbot_front_w2_blu" TeamNum 2 X -5737 Y -1100 Z -50 } ExtraSpawnPoint { Name "spawnbot_front_w2_mid" TeamNum 2 X -6606 Y -40 Z -110 } ExtraSpawnPoint { Name "spawnbot_front_w2_point" TeamNum 2 X -6800 Y -270 Z -100 } ExtraSpawnPoint { Name "spawnbot_right_w2" StartDisabled 1 TeamNum 2 X -6350 Y -2600 Z 5 } //Red side spawns //Front ExtraSpawnPoint { Name "spawnbot_red_front" TeamNum 2 X -6260 Y 300 Z -105 } ExtraSpawnPoint { Name "spawnbot_red_garage" TeamNum 2 X -6350 Y 1430 Z -60 } ExtraSpawnPoint { Name "spawnbot_red_tankdoor" TeamNum 2 X -4280 Y 1470 Z -85 } //Slightly before gate ExtraSpawnPoint { Name "spawnbot_red_gate" TeamNum 2 X -3560 Y 2300 Z 75 } //Corridor past gate ExtraSpawnPoint { Name "spawnbot_red_gate2" TeamNum 2 X -2550 Y 2000 Z 135 } ExtraSpawnPoint { Name "spawnbot_red_boxesdoor" TeamNum 2 X -3200 Y 1020 Z 110 } ClassLimit { Scout 0 Soldier 0 Pyro 0 Demoman 0 Heavyweapons 0 // Engineer 6 apparently this has to NOT be defined, pemsive Medic 0 Sniper 0 Spy 0 } //Base changes PlayerAttributes { Engineer { "SET BONUS: max health additive bonus" 25 "maxammo metal increased" 1.5 "mod teleporter cost" 12.02 "ammo regen" 0.3 } } //Item changes //V1: Only touch items that are going to be problematic - either OP or broken //TODO: finish this. //Wrench roles: //Stock: averages across-the-board. //Jag: fast setup. //Southern Hospitality: strong maintenance. //Eureka Effect: strong but slow? //Gunslinger: fast, shotgun-oriented. //SC: could be too strong versus projectile bots when spammed from a distance. //NEW TECH: homing makes ball stay stationary. //Role: safeguard user on the spot from projectiles; can be used vs rocket wall. //Cannot be used as a quick-switch-from, must be used with intent. ItemAttributes { ItemName "The Short Circuit" "provide on active" 1 "mod projectile heat seek power" 1 "single wep holster time increased" 2 "special item description" "Projectile does not move." } //Eureka: can't exactly use tp's consistently, so needs to be changed. //Must be something unique, not through ExtendedUpgrades. //"Power" wrench. Instant max sentry fire rate, but the slower build and metal gain will hurt. ItemAttributes { ItemName "The Eureka Effect" "alt fire teleport to spawn" 0 "special taunt" 0 "engy sentry fire rate increased" 0.5 //every 3 ticks "metal_pickup_decreased" 0.5 } //Hospitality: Provides stronger maintenance. //Sacrifices some sentry damage. ItemAttributes { ItemName "The Southern Hospitality" "mult dispenser rate" 1.4 "engy sentry damage bonus" 0.8 "dmg taken from fire increased" 1 } //PDA: required for upgrade to function. ItemAttributes { ClassName "TF_WEAPON_PDA_ENGINEER_BUILD" "building max level" 1 } //TODO: finish this ExtendedUpgrades { //Body upgrades //10% move speed, cap of 40% (420 HU/s) movespeed { Name "Robo-Runner" Description "+10% move speed" //Switch speed? Attribute "move speed bonus" Cost 50 Cap 1.4 Increment 0.1 PlayerUpgrade 1 SecondaryAttributes { } } //+25/30/35 hp, cap of +50, +140, +270 (500 HP) //Limits of 2 for w1, 6 for w2, 10 for w3 healthup1 { Name "Armored Casing I" Description "+25 max health" Attribute "max health additive bonus" Cost 50 Cap 50 //2 ticks, total: 200 hp Increment 25 PlayerUpgrade 1 BeginAtWave 1 } healthup2 { Name "Armored Casing II" Description "+30 max health" Attribute "max health additive bonus" Cost 50 Cap 140 //3 ticks, total: 290 hp Increment 30 PlayerUpgrade 1 RequiredUpgrade { Upgrade "healthup1" Level 2 } BeginAtWave 2 } healthup3 { Name "Armored Casing III" Description "+35 max health" Attribute "max health additive bonus" Cost 50 Cap 260 Increment 35 PlayerUpgrade 1 RequiredUpgrade { Upgrade "healthup2" Level 3 } BeginAtWave 3 } //Crits when below % health //+10%, cap of 40% //Less knockback, passive regen kbackregen { Name "Anchor Down" Description "+20% knockback reduction, +4 health regen" Attribute "damage force reduction" Cost 50 Cap 0 Increment -0.20 PlayerUpgrade 1 BeginAtWave 2 SecondaryAttributes { "airblast vulnerability multiplier" -0.20 "health regen" 4 } } //Primary Upgrades //Total caps: 50% fire rate, 80% reload rate, 150% damage //All primaries: fire rate + damage. //Cap of 6 ups, 30% fire rate. dps { Name "Power Module" Description "+25% damage, +5% fire rate." Attribute "damage bonus" Cap 2.5 Increment 0.25 Cost 100 AllowedWeapons { Slot "Primary" } AllowedMinWave 1 SecondaryAttributes { "fire rate bonus" -0.05 } } //Not you, Widowmaker: reload rate. //Cap of 4 ups, 80% reload rate, 20% fire rate, 200% clip size bullets { Name "Restock Module" Description "+20% reload rate, +5% fire rate, +50% clip size." Attribute "faster reload rate" Cap 0.2 Increment -0.2 Cost 100 AllowedWeapons { Slot "Primary" } DisallowedWeapons { ItemName "The Widowmaker" ItemName "Ulti Wrench" } AllowedMinWave 1 SecondaryAttributes { "fire rate bonus" -0.1 "clip size bonus" 0.5 } } //Regen 20% of dmg as health, max 100% dmgregen { Name "Drain Module" Description "+20% of damage returned as health. Heal for 15% max health on kill." Attribute "damage returns as health" Cap 1 Increment 0.2 Cost 100 AllowedWeapons { Slot "Primary" Slot "Secondary" } DisallowedWeapons { ItemName "The Wrangler" } } //Penetration! Could be nice to have, eh? dmgregen { Name "Piercing Module" Description "Shots pierce through enemies." Attribute "projectile penetration" Cap 1 Increment 1 Cost 100 AllowedMinWave 2 AllowedWeapons { Slot "Primary" } DisallowedWeapons { ItemName "The Pomson 6000" } } //RR: Headshots rangerhs { Name "Headshot Module" Description "Deal crits on headshot." Attribute "can headshot" Cap 1 Increment 1 Cost 100 AllowedMinWave 2 AllowedWeapons { ItemName "The Rescue Ranger" Slot Secondary } DisallowedWeapons { ItemName "The Short Circuit" ItemName "The Wrangler" } } //Pomson: weak homing pomsonhom { Name "Heat-seeker Module" Attribute "mod projectile heat seek power" Description "Projectile homes in on enemies." Cap 50 Increment 50 Cost 50 AllowedMinWave 2 AllowedWeapons { ItemName "The Pomson 6000" } SecondaryAttributes { "mod projectile heat seek error" 15 "mod projectile heat seek time" 2 "mod projectile heat no predict target speed" 1 } } //Secondary Upgrades //Pistol: fire rate + clip + reload, damage + accuracy pistolspeed { Name "Rapid Fire Module" Attribute "fire rate bonus" Description "+10% fire and reload rate, +50% clip size." Cap 0.6 Increment -0.1 //4 ticks Cost 50 AllowedWeapons { ClassName tf_weapon_pistol } SecondaryAttributes { "clip size bonus" 0.5 //+6 clip, max 36 "faster reload rate" -0.1 } } pistolpower { Name "Power Module" Attribute "damage bonus" Description "+40% damage bonus, +10% more accurate." Cap 3.4 Increment 0.4 //6 ticks Cost 50 AllowedWeapons { ClassName tf_weapon_pistol } SecondaryAttributes { "weapon spread bonus" 0.1 //+60% } } //Wrangler: none lol //Short Circuit: damage. yeah. //Melee Upgrades //All melees: swing speed + build rate, upgrade level (lvl 2 -> w3, lvl 3 -> w5), //Gunslinger: banned? swinger { Name "Construction Expert" Attribute "melee attack rate bonus" Cap 0.6 Increment -0.1 Cost 100 Description "10% faster swing speed, +20% build rate." AllowedWeapons { Slot "Melee" } AllowedMinWave 1 SecondaryAttributes { "Construction rate increased" 0.2 } } levelup2 { Name "Operator's Blueprints" Attribute "building max level" AllowedMinWave 3 Description "Allows you to upgrade your buildings up to level 2." Cap 2 Increment 2 Cost 100 AllowedWeapons { Slot "PDA" } DisallowedWeapons { ItemName "Ulti Wrench" } } levelup3 { Name "Foreman's Blueprints" Attribute "building max level" AllowedMinWave 5 Description "Allows you to upgrade your buildings up to level 3." Cap 3 Increment 1 Cost 100 AllowedWeapons { Slot "PDA" } DisallowedWeapons { ItemName "Ulti Wrench" } RequiredUpgrade { Upgrade levelup2 Level 1 } } //+5 metal per upgrade swing: //25 -> 8 hits; 8 * 25 = 200 //35 -> 6 hits; 6 * 35 = 180 + 30 = 210 //45 -> 5 hits; 5 * 45 = 200 (+ 25) //55 -> 4 hits; 4 * 55 = 200 (+ 20) upgrader { Name "Upgrade Update" Attribute "upgrade rate decrease" AllowedMinWave 3 Cap 3.2 Increment 0.4 Cost 50 Description "+40% upgrade rate." AllowedWeapons { Slot "Melee" } DisallowedWeapons { ItemName "Ulti Wrench" } } //PDA Upgrades //Sentry damage + radius //Building health //Disp rate + radius sentryexp { Name "Destruction Expert" Attribute "engy sentry damage bonus" Cap 1.6 Increment 0.15 //4 ticks Cost 100 Description "+15% sentry damage, +20% target radius." AllowedMinWave 1 SecondaryAttributes { // "mult firerocket rate" -0.1 "engy sentry radius increased" 0.2 } AllowedWeapons { Slot "PDA" } RequiredUpgrade { Upgrade levelup1 Level 1 } DisallowedWeapons { ItemName "Ulti Wrench" } } buildexp { Name "Maintenance Mastery" Attribute "engy building health bonus" Cap 3 Increment 0.5 //4 ticks Cost 100 Description "+50% building health, +25% repair rate." AllowedMinWave 1 SecondaryAttributes { "repair rate increased" 0.25 } AllowedWeapons { Slot "PDA" } RequiredUpgrade { Upgrade levelup1 Level 1 } DisallowedWeapons { ItemName "Ulti Wrench" } } dispexp { Name "Provision Proficiency" Attribute "engy dispenser radius increased" Cap 3 Increment 0.5 //4 ticks Cost 100 Description "+50% dispenser range and supply power (health, metal, ammo)." //DEPRECATED: AllowedMinWave 1 SecondaryAttributes { "mult dispenser rate" 0.5 } AllowedWeapons { Slot PDA } DisallowedWeapons { ItemName "Ulti Wrench" } } // pickupintel //Joke. Testing only. // { // Name "Carrier" // Attribute "cannot pick up intelligence" // Cap 0 // Increment -1 // Cost 500 // Description "You can now pick up the bomb." // } } CustomWeapon //Allows you to use an alias for items with custom attributes { "Ulti Wrench" // The name you would use in Item key in TFBot { OriginalItemName "Golden Wrench" // The item used as a base "special item description" "Magnetic: cannot use other weapons. Powers up every wave." "provide on active" 1 "is australium item" 1 "building cost reduction" 14 "disable weapon switch" 1 "critboost on kill" 1 "restore health on kill" 10 "dmg taken increased" 0.9 "damage bonus" 1.55 } } ExtraLoadoutItems // Extra loadout items available after typing !missionitems in chat { AllowEquipOutsideSpawn 0 // Allow equipping items outside spawn Engineer // Class { Melee // Item slot to use { Item "Ulti Wrench" // Item name, custom weapon names are available Cost 0 // Cost of weapon AllowedMinWave 1 //wave at which weapon is enabled (default: 1) AllowRefund 1 //Allow refunding of weapon (default: 1) // Output fired when upgrade is applied, aka: // bought, player changing classes, or weapons // Format: target,action,parameter,delay // If parameter is empty, the upgrade level is passed instead as parameter OnApply { Output "!activator,$WeaponSwitchSlot,2,0.1,-1" Output "!activator,$WeaponStripSlot,0,0.1,-1" Output "!activator,$WeaponStripSlot,1,0.1,-1" Output "!activator,$WeaponStripSlot,3,0.1,-1" Output "!activator,$WeaponStripSlot,4,0.1,-1" } } } } Templates { //////////////////////////////////////////////////////////////////////////// ///////////////////// Reusable templates //////////////////////// //////////////////////////////////////////////////////////////////////////// //Turns bots red. Nothing else. RedBot { AddCond { Name "TF_COND_REPROGRAMMED" } } //Turns bots red + adds mobber behavior. RedBot_Hunt { Attributes DisableDodge Action Mobber AddCond { Name "TF_COND_REPROGRAMMED" } } //Turns bots red; goes to bomb. RedBot_Bomb { InterruptAction { Target "intel*" Delay 0.1 Cooldown 1 Duration 1.1 } AddCond { Name "TF_COND_REPROGRAMMED" } } RedBot_DynamicPos_Blue { Attributes IgnoreFlag AddCond { Name "TF_COND_REPROGRAMMED" } EventChangeAttributes { Default { InterruptAction { Target "target_blu_front" Delay 0.1 Cooldown 1 Duration 1.1 } } Mid { InterruptAction { Target "target_blu_mid" Delay 0.1 Cooldown 1 Duration 1.1 } } Base { InterruptAction { Target "target_blu_base" Delay 0.1 Cooldown 1 Duration 1.1 } } } } RedBot_OnAttack { EventChangeAttributes { Default { InterruptAction { Target "target_blu_front" Delay 0.1 Cooldown 1 Duration 1.1 } } Attack { } } } AttackTank { InterruptAction { Target "tankboss" Cooldown 5 Duration 6 Delay 1 } } AttackTank_Only { InterruptAction { Target "tankboss" AimTarget "tankboss" KillAimTarget 1 Cooldown 5 Duration 6 Delay 3 //lets it doot } } AttackTank_Only_Side { InterruptAction { Target "tank_def_side" AimTarget "tankboss" KillAimTarget 1 Cooldown 5 Duration 6 Delay 1 } } AttackTank_Only_Back { InterruptAction { Target "tank_def_back" AimTarget "tankboss" KillAimTarget 1 Cooldown 5 Duration 6 Delay 1 } } //////////////////////////////////////////////////////////////////////////// /////////////////////// Common red bots //////////////////////// //////////////////////////////////////////////////////////////////////////// T_TFBot_Red_Scout_FaN_Armored_H { Name "Armored Force-a-Nature Scout" Skill Hard Class Scout Scale 1.3 Health 350 Item "The Force-a-Nature" Item "The Bolt Boy" ClassIcon scout_fan_armored Template RedBot_Hunt } //A whippin' soldier! Nothing new. T_TFBot_Red_Soldier_Whip { Class Soldier WeaponRestrictions MeleeOnly Item "The Disciplinary Action" Item "The Mantreads" Item "Armored Authority" ClassIcon soldier_disciplinary Template RedBot_Bomb } //A Bison soldier that reloads a little faster. T_TFBot_Red_Soldier_Bison { Class Soldier Name "Bison Soldier" Item "The Righteous Bison" Item "Lord Cockswain's Pith Helmet" Skill Hard ClassIcon soldier_bison WeaponRestrictions SecondaryOnly Template RedBot ItemAttributes { ItemName "The Righteous Bison" "faster reload rate" 0.6 "dmg bonus vs buildings" 5 } } //A bulky black box soldier. Doesn't fire instantly, but deals normal damage. T_TFBot_Red_Soldier_Bulwark_D { Template T_TFBot_Red_Soldier_RocketShotgun Name "Bulwark Box Soldier" Item "The Mantreads" Health 650 Scale 1.4 ItemAttributes { ItemName "The Black Box" "fire rate bonus" 0.7 "health on radius damage" 80 "heal on hit for rapidfire" 0 "blast radius increased" 1 "damage penalty" 1 } CharacterAttributes { "move speed bonus" 0.7 "health regen" 1 } } T_TFBot_Red_Demoman_Sticky_B { Template RedBot_Bomb Class Demoman Skill Normal Name "Stickybomb Demo" ClassIcon demo_sticky_red_daan WeaponRestrictions SecondaryOnly Item "TF_WEAPON_PIPEBOMBLAUNCHER" Item "Broadband Bonnet" ItemAttributes { ItemName "TF_WEAPON_PIPEBOMBLAUNCHER" "projectile range increased" 0.35 "stickybomb charge rate" 0.001 "max pipebombs decreased" -7 "faster reload rate" 0.1 "fire rate penalty" 1.67 } ItemAttributes { ItemName "TF_WEAPON_GRENADELAUNCHER" "is_passive_weapon" 1 "fire rate penalty" 1357 "override projectile type" 29 } } T_TFBot_Red_Demoman_Sticky_H { Template RedBot_Hunt Class Demoman Skill Normal Name "Stickybomb Demo" ClassIcon demo_sticky_red_daan WeaponRestrictions SecondaryOnly Item "TF_WEAPON_PIPEBOMBLAUNCHER" Item "Broadband Bonnet" ItemAttributes { ItemName "TF_WEAPON_PIPEBOMBLAUNCHER" "projectile range increased" 0.35 "stickybomb charge rate" 0.001 "max pipebombs decreased" -7 "faster reload rate" 0.1 "fire rate penalty" 1.67 } ItemAttributes { ItemName "TF_WEAPON_GRENADELAUNCHER" "is_passive_weapon" 1 "fire rate penalty" 1357 "override projectile type" 29 } } T_TFBot_Red_Demoman_Cannon_H { Template RedBot_Hunt Class Demoman Skill Normal Name "Loose Cannon Demo" ClassIcon demo_cannon WeaponRestrictions PrimaryOnly Item "The Loose Cannon" Item "The Bolted Bicorne" ItemAttributes { ItemName "The Loose Cannon" "grenade launcher mortar mode" 0 "faster reload rate" 0.6 "fire rate bonus" 0.6 } } T_TFBot_Red_Heavy_Champ_Steak { Template T_TFBot_Heavyweapons_Heavyweight_Champ Skill Hard Name "Buffaloweight Champ" Item "The Buffalo Steak Sandvich" ClassIcon heavy_champ_steak_red Attributes DisableDodge //Attributes AlwaysCrit //test if this may be needed Action FetchFlag // Action Mobber ItemAttributes { ItemName "The Buffalo Steak Sandvich" "alt-fire disabled" 1 //This should work with rafmod! "energy buff dmg taken multiplier" 0.75 } AddCond { Name "TF_COND_REPROGRAMMED" } } T_TFBot_Red_Heavy_Champ_Steak_H { Template T_TFBot_Heavyweapons_Heavyweight_Champ Skill Hard Name "Buffaloweight Champ" Item "The Buffalo Steak Sandvich" ClassIcon heavy_champ_steak_red Attributes DisableDodge //Attributes AlwaysCrit //test if this may be needed Action FetchFlag Action Mobber ItemAttributes { ItemName "The Buffalo Steak Sandvich" "alt-fire disabled" 1 //This should work with rafmod! "energy buff dmg taken multiplier" 0.75 } AddCond { Name "TF_COND_REPROGRAMMED" } } T_TFBot_Red_Heavyweight_Champ_H { Template T_TFBot_Heavyweapons_Heavyweight_Champ Skill Hard ClassIcon heavy_champ_red Attributes DisableDodge AddTemplate RedBot_Hunt } T_TFBot_Red_Engineer_A { Class Engineer Health 275 ClassIcon engineer_ally Skill Easy Action Mobber NoCrouchButtonRelease 1 // No auto release crouch when bot's on ground InterruptAction { Target "sentryhere" AimTarget "sentry_a" WaitWhenDone 1 Delay 1 Repeats 1 Cooldown 5.1 Duration 0.1 OnDoneChangeAttributes "Crouch" } Attributes IgnoreFlag CharacterAttributes { "no_jump" 1 } AddCond { Name "TF_COND_REPROGRAMMED" } EventChangeAttributes { Crouch { WeaponRestrictions MeleeOnly InterruptAction { Target "sentryhere" AimTarget "sentry_a" WaitWhenDone 1 KillAimTarget 1 Delay 0.1 Repeats 1 Cooldown 5 Duration 0.1 OnDoneChangeAttributes "Attack" } FireWeapon { Delay 0.1 Cooldown 0.1 Repeats 0 IfSeeTarget 0 Duration 0.2 Type "Crouch" } } Attack { WeaponRestrictions PrimaryOnly } } } T_TFBot_Red_Sniper_Huntsman_Pene { Template T_TFBot_Red_Sniper_Huntsman Name "Penetrating Bowman" ClassIcon sniper_bow_penetrator ItemAttributes { ItemName "The Huntsman" "projectile penetration" 1 "damage bonus" 1 "sniper no headshots" 1 } } T_TFBot_Red_Sniper_Carbine_H { Class Sniper Name "Carbine Sniper" Template RedBot_Hunt Skill Normal //best not to give them great tracking WeaponRestrictions SecondaryOnly ClassIcon sniper_carbine Item "The Cleaner's Carbine" Item "Letch's LED" FireWeapon { Type "Secondary" Cooldown 0.1 Repeats 0 Delay 1 } } //QFix Medic that always ubers. //Heals at the same rate as a fully ramped-up QFix ubercharge! //But, it only heals itself half as fast! T_TFBot_Red_Medic_Superheal { Class Medic Name "Superheal Medic" Template RedBot Skill Expert Item "The Quick-Fix" Attributes SpawnWithFullCharge ClassIcon medic_infpop ItemAttributes { ItemName "The Quick-Fix" "heal rate bonus" 4.17 //Base 300 HP/sec heals "overheal penalty" 0.001 "health from healers reduced" 0.5 //150 HP/sec selfheal "uber duration bonus" -9 //Infinite uber duration } CharacterAttributes { "bot medic uber health threshold" 160 } } //An overhealing medic! Useful for making bots super-bulky. T_TFBot_Red_Medic_Overheal { Name "Overhealer Medic" Class Medic ClassIcon medic_overheal_uber Attributes SpawnWithFullCharge Item "dec2014 Surgeon's Shako" Template RedBot ItemAttributes { ItemName tf_weapon_medigun "ubercharge rate bonus" 4 //basically 2x "uber duration bonus" -3 "bot medic uber deploy delay duration" 2 "overheal expert" 2 "heal rate bonus" 5 } } //A syringe-shooting medic! Can be dangerous thanks to its clever aiming. T_TFBot_Red_Medic_Syringe_H { Class Medic Name "Syringe Medic" Health 150 Skill Hard ClassIcon medic_syringe WeaponRestrictions PrimaryOnly Item "Upgradeable TF_WEAPON_SYRINGEGUN_MEDIC" Item "Das Naggenvatcher" AimAt Body AimOffset "0 0 10" AimLeadProjectileSpeed 1100 //overaims slightly Template RedBot_Hunt ItemAttributes { ItemName "Upgradeable TF_WEAPON_SYRINGEGUN_MEDIC" "fire rate bonus" 0.75 //haha syringe go brrrr "faster reload rate" 1 } } //////////////////////////////////////////////////////////////////////////// /////////////////////// Giant red bots //////////////////////// //////////////////////////////////////////////////////////////////////////// //A Giant Soldier that shoots sappers! //Succesful hits will sap sentries on hit. //Sources to make this work: // https://developer.valvesoftware.com/wiki/Obj_attachment_sapper // https://sigwiki.potato.tf/index.php/Main_Page -> custom entities, entity additions, expressions // https://raw.githubusercontent.com/powerlord/tf2-data/master/datamaps.txt // https://raw.githubusercontent.com/powerlord/tf2-data/master/netprops.txt // https://github.com/sreechar/TF2-Source-Code/blob/master/tf2_src/game/server/tf/tf_obj_sapper.h // and maybe, if the one above doesn't have it all: // https://github.com/NicknineTheEagle/TF2-Base/blob/master/src/game/server/tf/tf_obj_sapper.cpp //Plan: //- fire input on hit to apply the sapper //- fire input on hit name restrict "obj_*" should only let it target buildings //- use m_bHasSapper + $SetKey$ to say building has a sapper //- use BuildingSpawnTemplate with target for all Sappers to spawn an entity; //- said entity sets soldier as owner, or fire input on hit does that //- soldier has RTR attribute. gets applied to sapper. T_TFBot_Red_Giant_Soldier_Sapper { Template T_TFBot_Giant_Soldier Name "Giant Sapper Soldier" ClassIcon soldier_redtape Item "Upgradeable TF_WEAPON_ROCKETLAUNCHER" Attributes IgnoreFlag AddCond { Name TF_COND_REPROGRAMMED } ItemAttributes { ItemName "Upgradeable TF_WEAPON_ROCKETLAUNCHER" "paintkit_proto_def_index" 241 //electroshocked! "add cond on hit" 71 "add cond on hit duration" 3 "projectile speed decreased" 0.6 "blast radius decreased" 0.6 "custom projectile model" "models/weapons/c_models/c_sapper/c_sapper.mdl" "disable buildings on hit" 4 //Temp disabled til I have time to figure it all out. // "fire input on hit" "!caller^$SetProp$m_bHasSapper^1" // "fire input on hit name restrict" "obj_*" } } //Giant Demoknight that stays near bomb //hunts players if health gets low. Can be snuck up on for 1-time massive melee damage. T_TFBot_Red_Giant_Demo_Samurai_Dynamic { Class Demoman Name "Giant Samurai Demo" ClassIcon demoknight_samurai Health 3300 Action FetchFlag Item "Demo Kabuto" Item "The Half-Zatoichi" AddCond { Name "TF_COND_REPROGRAMMED" } ChangeAttributes { Name "Attack" Delay 0.1 Cooldown 10 Repeats 0 IfHealthBelow 1650 } ChangeAttributes { Name "Default" Delay 0.1 Cooldown 10 Repeats 0 IfHealthAbove 1651 } EventChangeAttributes { Default { Skill Expert WeaponRestrictions MeleeOnly Attributes MiniBoss Attributes DisableDodge ItemAttributes { ItemName "The Half-Zatoichi" "critboost on kill" 3 "restore health on kill" 25 } CharacterAttributes { "move speed bonus" 0.5 "damage force reduction" 0.5 "airblast vulnerability multiplier" 0.5 "override footstep sound set" 4 } } Attack { Skill Expert WeaponRestrictions MeleeOnly Attributes MiniBoss Attributes DisableDodge ItemAttributes { ItemName "The Half-Zatoichi" "critboost on kill" 3 "restore health on kill" 25 } CharacterAttributes { "move speed bonus" 0.5 "damage force reduction" 0.5 "airblast vulnerability multiplier" 0.5 "override footstep sound set" 4 } InterruptAction { Target ClosestPlayer AimTarget ClosestPlayer KillAimTarget 1 Cooldown 4 Duration 5 } } } } //A Giant, burst-firing Carbine sniper! Can activate Crikey to become pretty scary! T_TFBot_Red_Giant_Sniper_Carbine { Class Sniper Name "Giant Burst Carbine Sniper" Health 2500 Skill Hard WeaponRestrictions SecondaryOnly Attributes MiniBoss ClassIcon sniper_carbine Item "The Cleaner's Carbine" Item "Letch's LED" UseCustomModel "models/bots/sniper_boss/bot_sniper_boss.mdl" Template RedBot_Bomb ItemAttributes { ItemName "The Cleaner's Carbine" "fire rate penalty" 1 "fire rate bonus" 0.1 "reload time increased" 1.5 } FireWeapon { Type "Secondary" Cooldown 0.1 Repeats 0 Delay 1 } } //////////////////////////////////////////////////////////////////////////// /////////////////////// Common blue bots //////////////////// //////////////////////////////////////////////////////////////////////////// T_TFBot_Soldier_Kritz { Class Soldier Name "Kritz Banner Soldier" Item "The Buff Banner" ClassIcon soldier_critbuff Attributes SpawnWithFullCharge Attributes AlwaysCrit Action Mobber ItemAttributes { ItemName "The Buff Banner" "effect cond override" 33 "mod soldier buff range" 1.5 "increase buff duration" 3 } } //////////////////////////////////////////////////////////////////////////// /////////////////////// Giant blue bots //////////////////////// //////////////////////////////////////////////////////////////////////////// //A Giant Burst Demo that can heal itself even faster than the small variant! T_TFBot_Giant_Demo_Burst_Heal { Name "Giant Healing Burst Demo" Class Demoman Skill Expert Health 3300 ClassIcon Demo_burst_heal Tag bot_giant Attributes MiniBoss Attributes HoldFireUntilFullReload WeaponRestrictions PrimaryOnly ItemAttributes { ItemName "tf_weapon_grenadelauncher" "faster reload rate" 0.65 "fire rate bonus" 0.1 "clip size upgrade atomic" 6 "projectile spread angle penalty" 4 "Projectile speed increased" 1.1 } CharacterAttributes { "heal on hit for rapidfire" 100 "move speed bonus" 0.5 "damage force reduction" 0.4 "airblast vulnerability multiplier" 0.4 "override footstep sound set" 4 } } } // WAVE 1 - Intro to map, reverse, and getting used to stuff // Gate skip. VIP escort: red path, blue spawn // Objective: escort a (weak) set of bomb carriers. // Their "power" will increase slightly as you lose them. // Obstacle: defending giants; bomb-attacking bots; hunting bots. // Path: through the blue part. No gate cap yet. // Tasks: defending engies must minimize intial horde, prevent hunters from reaching too far. // Attacking engies must remove nearby threats and focus down giants. //TODO: //- Think of a good way to balance bomb focus with hunter focus and obstacle giants. //- Remove Red random crits //Carriers: //This wave can dish out a fair bit of damage quite quickly. //For forgiveness, the carriers are slightly bulkier, and can //fight back just a bit. //- Pistol Engineer //- Giant Widowmaker Engineer //Subwave 1: initial wave of bots; attempt to break first push. //Spawn at _1 spawns. //- Defend: Giant Demoman (no weapon changes) //- Hunt: Sticky Demo + Quick-Fix Medic (max 2 pairs) //- H: Syringe Medic //Subwave 2: bomb moved up. Send in bomb attackers. //Spawn at _2 spawns, around gate. //- Bomb: Giant Demoman (ditto) //- H: Armored FaN Scouts //- H: Steakweight Champs //Subwave 3: bomb nears hatch. Concentrate firepower, station flank defenders, //defend bomb at all costs. //Spawn at hatch. //- B: Giant Burst Carbine Sniper //- B: Sticky Demos //- D: Black Box Soldiers (minigiant, around "bridge", on container) //- Rest support, H: Whip Soldiers //- Support: Snipers (around long hall) Mission { Objective Sniper Where spawnbot_hatch BeginAtWave 1 RunForThisManyWaves 1 DesiredCount 1 InitialCooldown 10 CooldownTime 25 TFBot { Template T_TFBot_Red_Sniper Item "The Machina" ClassIcon sniper_machina_2 } } SpawnTemplate "corelogic" SpawnTemplate "tutorial" // SpawnTemplate "attribute_changer" SpawnTemplate "defendpoints" SpawnTemplate wave1logic SpawnTemplate wave2logic SpawnTemplate wave3logic SpawnTemplate wave4logic SpawnTemplate wave5logic SpawnTemplate wave6logic Wave { SpawnTemplate wave1starter SpawnTemplate wave1props Explanation { Line "{blue}Control {FBECCB}: Attention, engie-bots! You have been REPROGRAMMED FOR MANN CO." Line "{FBECCB}Now that our own bots turned on us and took over the facility, we're making you, the last remaining {blue}BLU {FBECCB}bots, BLOW THEM TO PIECES." Line "{FBECCB}You {red}cannot upgrade buildings{FBECCB} yet, but we'll get that sorted later." Line "{FBECCB}Now do what you were built to do: make your bots deploy that bomb!" } InitWaveOutput { Target wave1_spawner Action Trigger } StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } WaveSpawn { Name "NoEnd" WaitBeforeStarting 9999 } WaveSpawn { Name "wave1_start" FirstSpawnOutput { Target wave1_start_relay Action Trigger } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon pathred } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon blu2_lite } } WaveSpawn { Name "Support 1" Where spawnbot_front_left WaitBeforeStarting 0 TotalCount 1 MaxActive 1 SpawnCount 1 Support Limited TFBot { Class Engineer Name "Pistol Engineer" Health 275 WeaponRestrictions SecondaryOnly Attributes DisableDodge ClassIcon scout_pistol_nys Action FetchFlag NoBombUpgrades 1 Tag bomb_carrier // Item "The Galvanized Gibus" VoiceCommand { Delay 4 Cooldown 50 Repeats 3 IfHealthAbove 250 Type "Battle Cry" } VoiceCommand { Delay 6 Cooldown 15 Repeats 0 IfHealthBelow 125 Type "Help" } } } WaveSpawn { Name "Support 1" Where spawnbot_front_left WaitBeforeStarting 14 WaitBetweenSpawnsAfterDeath 5 TotalCount 11 MaxActive 1 SpawnCount 1 Support Limited TFBot { Class Engineer Name "Pistol Engineer" Health 275 WeaponRestrictions SecondaryOnly Attributes DisableDodge ClassIcon scout_pistol_nys Action FetchFlag NoBombUpgrades 1 Tag bomb_carrier // Item "The Galvanized Gibus" VoiceCommand { Delay 4 Cooldown 50 Repeats 3 IfHealthAbove 250 Type "Battle Cry" } VoiceCommand { Delay 6 Cooldown 15 Repeats 0 IfHealthBelow 125 Type "Help" } } } WaveSpawn { Name "Support 2" WaitForAllDead "Support 1" Where spawnbot_front_right Where spawnbot_right WaitBeforeStarting 10 WaitBetweenSpawns 4 TotalCount 1 MaxActive 1 SpawnCount 1 Support Limited DoneOutput { Target redwin_relay Action Trigger } TFBot { Class Engineer Name "Giant Widowmaker Engineer" Skill Expert Health 3000 Attributes MiniBoss Attributes DisableDodge Action FetchFlag Tag bomb_carrier SpawnTemplate lastbotlogic ClassIcon engineer_widowmaker_nys Item "The Widowmaker" // Item "Texas Tin-Gallon" CharacterAttributes { "move speed bonus" 0.5 "damage force reduction" 0.2 "override footstep sound set" 2 } } } //Subwave 1: initial wave of bots; attempt to break first push. //Spawn at _1 spawns. //- Defend: Giant Demoman (no weapon changes) //- Hunt: Sticky Demo + Quick-Fix Medic (max 2 pairs) //- H: Syringe Medic WaveSpawn { Name "wave1a" Where spawnbot_red_front Where spawnbot_red_garage WaitBeforeStarting 0.5 WaitBetweenSpawns 8 TotalCount 8 MaxActive 4 SpawnCount 2 Squad { TFBot { Template T_TFBot_Red_Demoman_Sticky_H } TFBot { Template T_TFBot_Red_Medic_QuickFix } } } WaveSpawn { Name "wave1a2" WaitBeforeStarting 0.5 WaitBetweenSpawns 4 Where spawnbot_red_garage Where spawnbot_red_tankdoor TotalCount 24 MaxActive 8 SpawnCount 2 TFBot { Template T_TFBot_Red_Medic_Syringe_H } } WaveSpawn { Name "wave1a3" Where spawnbot_red_tankdoor TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Demo_RapidFire UseMeleeThreatPrioritization 1 NoPushAway 1 ItemAttributes { ItemName "TF_WEAPON_GRENADELAUNCHER" "fire rate bonus" 1 } InterruptAction { Target target_red_front Delay 0 Cooldown 1 Duration 2 IfHealthAbove 2000 } } } //Subwave 2: bomb moved up. Send in bomb attackers. //Spawn at _2 spawns, around gate. //- Bomb: Giant Demoman (ditto) //- H: Armored FaN Scouts //- H: Steakweight Champs WaveSpawn { Name "wave1b1" WaitForAllDead "wave1a3" Where spawnbot_red_gate TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Demo_RapidFire ItemAttributes { ItemName "TF_WEAPON_GRENADELAUNCHER" "fire rate bonus" 1 } Action FetchFlag } } WaveSpawn { Name "wave1b" WaitForAllDead "wave1b1" Where spawnbot_red_gate2 TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Demo_RapidFire ItemAttributes { ItemName "TF_WEAPON_GRENADELAUNCHER" "fire rate bonus" 1 } Action FetchFlag } } WaveSpawn { Name "wave1b2" WaitForAllDead "wave1a" Where spawnbot_red_boxesdoor Where spawnbot_red_gate2 WaitBetweenSpawns 4 TotalCount 12 MaxActive 3 SpawnCount 1 TFBot { Template T_TFBot_Red_Scout_FaN_Armored_H } } WaveSpawn { Name "wave1b2" WaitForAllDead "wave1a2" WaitBeforeStarting 16 Where spawnbot_red_boxesdoor WaitBetweenSpawns 6 TotalCount 16 MaxActive 8 SpawnCount 4 TFBot { Template T_TFBot_Red_Heavy_Champ_Steak_H } } //Subwave 3: bomb nears hatch. Concentrate firepower, station flank defenders, //defend bomb at all costs. //Spawn at hatch. //- B: Giant Burst Carbine Sniper //- B: Sticky Demos //- D: Black Box Soldiers (minigiant, around "bridge", on container) //- D: Giant Demoman (hatch) //- Rest support, H: Whip Soldiers WaveSpawn { Name "wave1c" WaitForAllDead "wave1b" Where spawnbot_hatch WaitBetweenSpawns 18 TotalCount 2 MaxActive 2 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Sniper_Carbine } } WaveSpawn { Name "wave1c2" WaitForAllDead "wave1b2" Where spawnbot_hatch WaitBetweenSpawns 5 TotalCount 12 MaxActive 4 SpawnCount 2 TFBot { Template T_TFBot_Red_Demoman_Sticky_B } } WaveSpawn { Name "wave1c3" WaitForAllDead "wave1b" Where spawnbot_hatch TotalCount 2 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Soldier_Bulwark_D InterruptAction { Target "target_red_bridge" Cooldown 2 Duration 2.1 Duration 1 Repeats 0 } } } WaveSpawn { Name "wave1c3" WaitForAllDead "wave1b2" Where spawnbot_hatch TotalCount 2 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Soldier_Bulwark_D InterruptAction { Target "target_red_bridge2" Cooldown 2 Duration 2.1 Duration 1 Repeats 0 } } } WaveSpawn { Name "wave1d" WaitForAllSpawned "wave1b" Where spawnbot_hatch_def TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 200 TFBot { Template T_TFBot_Red_Giant_Demo_RapidFire Attributes DisableDodge Attributes IgnoreFlag BehaviorModifiers Push Tag bot_hatchspawn NoPushAway 1 CharacterAttributes { "force distribute currency on death" 1 "damage force reduction" 0 } } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon red2_lite } } WaveSpawn { Name "Support" WaitForAllSpawned "wave1c2" Where spawnbot_hatch WaitBetweenSpawns 2 TotalCount 111 MaxActive 5 SpawnCount 1 TotalCurrency 0 Support 1 TFBot { Template T_TFBot_Red_Soldier_Whip } } } // Wave 2 - Move from blue gate to blue front; cap point, then hyperspeed push with giants // Objective: Capture a point, bomb deploy. // Obstacle: bots that attack, defend point, and tele-blimp? // Experiment with blimp to bring bots forward? // Path: blue side, from and towards. // LOGIC: capture point. //Subwave 1 - Bots at the point! //- D: Giant Burst Shotgun Heavy (point) //- D: Giant Direct Hit Soldier (2 sides) //- H: Combo Pyro (Degreaser/Flare Gun; close *and* longer-range) //Subwave 2 - Bots coming in to get you off that point! //- D: Giant Speed Booster Soldier (conch with only speed boost; stands on point) //- H: Roll-out Heavies (GRU, switch to minigun if spotting player) //- H: Combo Pyro //Subwave 3 - Defensive bots trying to stop the bomb! //- D: Giant Burst Shotgun Heavy + Superheal Medic (tries to block path, both tank entrance and bridge) //- B: Roll-out Heavies (this time, with Natascha using slow major for lesser slowdown) //- H: Blaster Scouts //Support: Fan O'War Scouts, Blast Soldiers (single-shot) //BLU Support: Major League Scouts () Wave { SpawnTemplate "AirTeleport" SpawnTemplate { Name "Teleporter_Blu" Origin "-6808 -410 -215" } ItemAttributes { ItemName "Ulti Wrench" "critboost on kill" 1.2 "restore health on kill" 15 "dmg taken increased" 0.85 "move speed bonus" 1.05 } Explanation { Line "{blue}Control {FBECCB}: Our next target is a {red}CONTROL POINT{FBECCB}. It is located on the outer part of the facility." Line "{FBECCB}We need to capture it quickly. {red}6 MINUTES." Line "{blue}Giant support{FBECCB} will be possible, but we cannot afford to lose all of them." } InitWaveOutput { Target wave_finished_nextwave_right Action Trigger } StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_nextwave_left //This contains wave_finished_relay! Action Trigger } WaveSpawn { WaitBeforeStarting 0.2 FirstSpawnOutput { Target wave2_spawner Action Trigger } } WaveSpawn { Name "NoEnd" WaitBeforeStarting 9999 } WaveSpawn { Name "wave2a" Where spawnbot_front_w2_red TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Soldier Name "Giant Predictive Direct Soldier" Item "The Direct Hit" Item "The Virtual Viewfinder" ClassIcon soldier_dh_nys AimLeadProjectileSpeed 1800 ItemAttributes { ItemName "Virtual Viewfinder" "set item tint rgb" 8208497 "attach particle effect" 121 } InterruptAction { Target "-5980 563 -50" Delay 0 Cooldown 4 Duration 5 Repeats 0 IfHealthAbove 2400 } InterruptAction { Target "-6800 -80 -144" Delay 0 Cooldown 4 Duration 5 Repeats 0 IfHealthBelow 2400 } } } WaveSpawn { Name "wave2a" Where spawnbot_front_w2_mid TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Soldier Name "Giant Predictive Direct Soldier" Item "The Direct Hit" Item "The Virtual Viewfinder" ClassIcon soldier_dh_nys AimLeadProjectileSpeed 1800 ItemAttributes { ItemName "Virtual Viewfinder" "set item tint rgb" 8208497 "attach particle effect" 121 } InterruptAction { Target "-5980 -612 -66" Delay 0 Cooldown 4 Duration 5 Repeats 0 IfHealthAbove 2400 } InterruptAction { Target "-6800 -488 -144" Delay 0 Duration 4 Cooldown 3 Repeats 0 IfHealthBelow 2400 } } } //Test to see if this would be too much // WaveSpawn // { // Name "wave2a" // Where spawnbot_front_w2_point // TotalCount 1 // MaxActive 1 // SpawnCount 1 // TFBot // { // Template T_TFBot_Red_Giant_Heavyweapons_Shotgun // Name "Giant Burst Shotgun Heavy" // ClassIcon heavy_shotgun_red_burst // ItemAttributes // { // ItemName "TF_WEAPON_SHOTGUN_HWG" // "auto fires full clip" 1 // "auto fires when full" 1 // "fire rate bonus" 0.2 // "bullets per shot bonus" 5 // "faster reload rate" 0.4 // } // InterruptAction // { // Target "cap_point" // Duration 4 // Cooldown 3 // Repeats 0 // } // } // } WaveSpawn { Name "wave2a2" Where spawnbot_front_w2_blu Where spawnbot_front_w2_mid WaitBetweenSpawns 0.5 TotalCount 12 MaxActive 12 SpawnCount 2 TFBot { Template T_TFBot_Red_Pyro ClassIcon pyro_degreaser_flare_red Name "Puff-n-Sting Pyro" Item "The Degreaser" Item "The Flare Gun" ItemAttributes { ItemName "The Degreaser" "fire input on hit" "combo_primary_to_secondary^Trigger^" "damage penalty" 0.75 } } } //Subwave 2 - Bots coming in to get you off that point! //- D: Giant Burst Air Strike Soldier (from above) //- H: Combo Pyro (forward spawn) WaveSpawn { Name "Spawnchanger" WaitForAllDead "wave2b" FirstSpawnOutput { Target "movespawns_bluegate_to_blue" Action Trigger } } WaveSpawn { Name "wave2b" WaitForAllDead "wave2a" Where spawnbot_hatch WaitBetweenSpawnsAfterDeath 10 TotalCount 2 MaxActive 1 SpawnCount 1 TFBot { Class Soldier Name "Giant Burst Air Strike Soldier" ClassIcon soldier_airstrike_para Skill Expert Health 3800 AddCond { Name TF_COND_REPROGRAMMED } Attributes HoldFireUntilFullReload Attributes MiniBoss Attributes IgnoreFlag Item "The Air Strike" Item "The b.a.s.e. Jumper" SpawnTemplate annotation_airdrop Tag airtp ItemAttributes { ItemName "The Air Strike" "clip size upgrade atomic" 4 "clipsize increase on kill" 0 "fire rate bonus" 0.35 "faster reload rate" 0.6 "projectile spread angle penalty" 1 } CharacterAttributes { "move speed bonus" 0.5 "voice pitch scale" 0 "damage force reduction" 0 "crit mod disabled hidden" 0 "override footstep sound set" 3 "cancel falling damage" 1 } InterruptAction { Target "cap_point" Duration 4 Cooldown 3 Repeats 0 } } } WaveSpawn { Name "wave2a_both" WaitForAllDead "wave2a" } WaveSpawn { Name "wave2a_both" WaitForAllDead "wave2a2" } WaveSpawn { Name "wave2b2" WaitForAllDead "wave2a_both" Where spawnbot_front_w2_blu Where spawnbot_front_w2_red WaitBeforeStarting 15 WaitBetweenSpawns 3 TotalCount 24 MaxActive 6 SpawnCount 2 TFBot { Template T_TFBot_Red_Pyro ClassIcon pyro_degreaser_flare_red Name "Puff-n-Sting Pyro" Item "The Degreaser" Item "The Flare Gun" ItemAttributes { ItemName "The Degreaser" "fire input on hit" "combo_primary_to_secondary^Trigger^" "damage penalty" 0.75 } } } //Subwave 3 - Defensive bots trying to stop the bomb! //- D: Giant Direct Hit Soldier (tries to block path, both tank entrance and bridge) //- B: Stunner Soldier //- H: Roll-out Heavies (GRU, switch to Natascha w/slow major for lesser slowdown) //- H: Hyper League Scout WaveSpawn { Name "Spawnchanger" WaitForAllDead "wave2b" FirstSpawnOutput { Target "w2_opentankdoors" Action Trigger } } WaveSpawn { Name "wave2c" Where spawnbot_hatch WaitForAllDead "wave2b" WaitBeforeStarting 4 TotalCount 3 MaxActive 3 SpawnCount 3 Squad { TFBot { Template T_TFBot_Red_Giant_Soldier_Spammer_Reload ItemAttributes { ItemName "Virtual Viewfinder" "set item tint rgb" 8208497 "attach particle effect" 121 } //880 to 656 InterruptAction { Target "-3050 -768 132" Duration 4 Cooldown 3 Repeats 0 } } TFBot { Class Heavyweapons Template RedBot_Hunt Name "Natascha Heavy" Item "Natascha" ClassIcon heavy_natascha_nys MaxVisionRange 1200 ItemAttributes { ItemName "Natascha" "slow enemy on hit" 0 "slow enemy on hit major" 0.2 } } TFBot { Class Heavyweapons Template RedBot_Hunt Name "Natascha Heavy" Item "Natascha" ClassIcon heavy_natascha_nys MaxVisionRange 1200 ItemAttributes { ItemName "Natascha" "slow enemy on hit" 0 "slow enemy on hit major" 0.2 } } } } WaveSpawn { Name "wave2c2" Where spawnbot_hatch WaitForAllDead "wave2b2" WaitBetweenSpawns 6 TotalCount 10 MaxActive 2 SpawnCount 1 TFBot { Class Soldier Name "Stunner Soldier" Template RedBot_Bomb ClassIcon soldier_stun Item "concealedkiller_rocketlauncher_sandcannon" Attributes HoldFireUntilFullReload ItemAttributes { ItemName "concealedkiller_rocketlauncher_sandcannon" "rocket specialist" 1 } } } WaveSpawn { Name "wave2c2" Where spawnbot_hatch WaitForAllDead "wave2b2" WaitBetweenSpawns 3 TotalCount 24 MaxActive 6 SpawnCount 2 TFBot { Class Heavyweapons Template RedBot_Hunt Name "Roll-out Natascha Heavy" Item "Natascha" Item "Gloves of Running Urgently MvM" ClassIcon heavy_natascha_nys MaxVisionRange 1200 ItemAttributes { ItemName "Natascha" "slow enemy on hit" 0 "slow enemy on hit major" 0.2 } WeaponSwitch { Delay 0.1 Repeats 1 Type "Melee" } WeaponSwitch { Delay 1 Repeats 1 Type "Primary" IfSeeTarget 1 } } } WaveSpawn { Name "wave2c" Where spawnbot_hatch_def WaitForAllSpawned "wave2b" WaitBeforeStarting 4 TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 200 TFBot { Template T_TFBot_Giant_Demoman Name "Chief Milk-splosion Demo" Health 8500 Scale 1.8 ClassIcon demo_milky Item "Upgradeable TF_WEAPON_GRENADELAUNCHER" Item "The Milkman" Attributes HoldFireUntilFullReload Attributes UseBossHealthbar Attributes DisableDodge Attributes IgnoreFlag BehaviorModifiers Push NoPushAway 1 AddTemplate RedBot ItemAttributes { ItemName "Upgradeable TF_WEAPON_GRENADELAUNCHER" "paintkit_proto_def_index" 130 //bovine blazemaker bc I am very funny "set_item_texture_wear" 0 "add cond on hit" 27 "add cond on hit duration" 4 "grenade explode on impact" 1 "custom projectile model" "models\weapons\c_models\c_madmilk\c_madmilk.mdl" "explosion particle" "peejar_impact_milk" "projectile trail particle" "peejar_trail_red" "fire rate bonus" 0.1 "faster reload rate" 0.6 "clip size upgrade atomic" 11 "blast radius decreased" 0.6 } CharacterAttributes { "force distribute currency on death" 1 "health regen" 20 "damage force reduction" 0 } } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon blu2_lite } } WaveSpawn { Name "Support 1" Where spawnbot_right_w2 WaitBetweenSpawnsAfterDeath 5 TotalCount 5 MaxActive 1 SpawnCount 1 Support Limited TFBot { Template T_TFBot_Giant_Scout_Baseball Health 1200 AlwaysGlow 1 Tag bomb_carrier Action FetchFlag } } WaveSpawn { Name "Support 2" WaitForAllDead "Support 1" Where spawnbot_right_w2 WaitBeforeStarting 6 TotalCount 1 MaxActive 1 SpawnCount 1 Support Limited DoneOutput { Target redwin_relay Action Trigger } TFBot { Template T_TFBot_Giant_Scout_Baseball_Armored AlwaysGlow 1 Tag bomb_carrier Action FetchFlag SpawnTemplate lastbotlogic } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon red2_lite } } WaveSpawn { Name "Support" Where spawnbot_front_w2_blu Where spawnbot_front_w2_red Where spawnbot_hatch_alt WaitForAllDead "wave2a2" WaitBeforeStarting 5 WaitBetweenSpawns 4 TotalCount 24 MaxActive 4 SpawnCount 4 Support 1 TFBot { Template T_TFBot_Red_Scout_Sandman_FastCharge } } WaveSpawn { Name "Support" Where spawnbot_hatch WaitForAllDead "wave2b2" WaitBetweenSpawns 8 TotalCount 24 MaxActive 2 SpawnCount 1 Support 1 TFBot { Template T_TFBot_Red_Scout_Sandman_FastCharge } } } // Wave 3 - Blue side's explored, now let's win with a tank! // Objective: escort a tank to win the round. // Obstacle: blockade around the blu path. red path is 100% off-limits. // Tank-targeting bots will spawn. // Tank-healing bots will also spawn. Tank will slow down with health. // Path: blue side. // LOGIC: tank stops before trigger that opens door; kill bots to proceed. //Subwave 1: first area, before entering RED side, up to door //- Tank: Giant Backup Equalizer Soldier //- T: Carbine-wacka Snipers //- D: Giant Burst Homing Soldier (kill to proceed) //- H: Loose Cannon Demos + Superheal Medic //Subwave 2: after door, moving up to gate; //- T/H: Soda Scouts //- T/H: Minigiant Fury Pyros //- D: Chief Armored Heavy (bulky fucker); on death, restore tank health slightly //Subwave 3: last section! long stretch, excellent for... //- T: Giant Buff Bison Soldier //- Support, H: Burst Fire Soldier //- Support, T: Rapid/Burst/Crit Bison Soldier Wave { Explanation { Line "{blue}Control {FBECCB}: Good. We have secured the robot construction facility, but it needs repairs first." Line "{FBECCB}We need to stall for time. As such, we will be deploying a {blue}TANK." Line "{FBECCB}However, this is the {RED}ONLY ONE{FBECCB} we have. Do not let it be destroyed!" } InitWaveOutput { Target wave3_spawner Action Trigger } StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } ItemAttributes { ItemName "Ulti Wrench" "critboost on kill" 1.4 "restore health on kill" 20 "dmg taken increased" 0.8 "move speed bonus" 1.1 } WaveSpawn { Name "BLU Tank" Where spawnbot //yeah sure whatever TotalCount 1 MaxActive 1 SpawnCount 1 WaitBeforeStarting 0.5 DoneOutput { Target redwin_relay Action Trigger } Tank { Name "tankboss" StartingPathTrackNode "boss_path_1" Health 60000 Speed 60 OnBombDroppedOutput { Target boss_deploy_relay Action Trigger } } } //Subwave 1: first area, before entering RED side, up to door //- Tank: Giant Backup Equalizer Soldier //- T: Carbine-wacka Snipers //- D: Giant Burst Homing Soldier (kill to proceed) //- H: Loose Cannon Demos + Overheal Medic WaveSpawn { Name "wave3a" Where spawnbot_red_front WaitBetweenSpawns 18 TotalCount 2 MaxActive 2 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Soldier Name "Giant Battalion Equalizer Soldier" Attributes SpawnWithFullCharge WeaponRestrictions MeleeOnly ClassIcon soldier_equalizer_backup Item "The Equalizer" Item "The Battalion's Backup" Item "The Grenadier's Softcap" ItemAttributes { ItemName "The Equalizer" "fire rate bonus with reduced health" 0.6 "damage bonus" 1.5 } AddTemplate AttackTank_Only } } WaveSpawn { Name "wave3a2" Where spawnbot_w3_tankdoor WaitBetweenSpawns 6 TotalCount 20 MaxActive 10 SpawnCount 1 TFBot { Class Sniper Name "Carbine-wacka Sniper" Skill Hard Item "Professional's Panama" Item "The Cleaner's Carbine" Item "The Bushwacka" ClassIcon sniper_carbinewacka Template RedBot SpawnTemplate Carbinewacka StripItemSlot 0 FireWeapon { Type "Secondary" Repeats 0 Cooldown 0.4 Duration 0.1 Delay 1.5 } AddTemplate AttackTank } } WaveSpawn { Name "wave3a2" Where spawnbot_w3_garage WaitBetweenSpawns 8 TotalCount 16 MaxActive 8 SpawnCount 4 Squad { TFBot { Template T_TFBot_Red_Demoman_Cannon_H } TFBot { Template T_TFBot_Red_Medic_Overheal } } } WaveSpawn { Name "wave3a2" Where spawnbot_w3_garage Where spawnbot_w3_tankdoor WaitBetweenSpawns 3 TotalCount 15 MaxActive 5 SpawnCount 1 TFBot { Template T_TFBot_Red_Demoman_Cannon_H } } WaveSpawn { Name "wave3a3" WaitBeforeStarting 50 Where spawnbot_w3_garage TotalCount 1 MaxActive 1 SpawnCount 1 DoneOutput { Target "tankstopper" Action FireUser2 } TFBot { Template T_TFBot_Red_Giant_Soldier_SlowBarrage Name "Giant Homing Barrage Soldier" Attributes DisableDodge ClassIcon soldier_barrage_homing_nys AlwaysGlow 1 SpawnTemplate annotation_tank_req RocketCustomParticle "eyeboss_projectile" HomingRockets { RocketSpeed 0.4 TurnPower 65 MaxAimError 150 AimTime 5 } InterruptAction { Target "-5800 1000 -50" Cooldown 4 Duration 5 Delay 0 } } } //Subwave 2: after door, moving up to gate; //- T/H: Soda Scouts //- T/H: Minigiant Fury Pyros //- D: Giant Heavy (bulky fucker) WaveSpawn { Name "wave3b" WaitForAllDead "wave3a3" Where spawnbot_w3_gateboxes WaitBeforeStarting 2 TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Template T_TFBot_Red_Giant_Heavyweapons Attributes DisableDodge InterruptAction { Target "-3000 1580 75" Cooldown 4 Duration 5 Delay 0 } } } WaveSpawn { Name "wave3b2" WaitForAllDead "wave3a2" Where spawnbot_w3_boxesdoor TotalCount 12 MaxActive 4 SpawnCount 2 TFBot { Template T_TFBot_Red_Pyro Health 650 Scale 1.4 Name "Furious Pyro" Item "The Dragon's Fury" Item "The Rusty Reaper" ClassIcon pyro_dragon_fury_swordstone CharacterAttributes { "move speed penalty" 0.85 } AddTemplate AttackTank_Only_Side } } WaveSpawn { Name "wave3b2" WaitForAllDead "wave3a2" WaitBeforeStarting 2 WaitBetweenSpawns 3 Where spawnbot_w3_boxesdoor Where spawnbot_hatch_alt TotalCount 24 MaxActive 6 SpawnCount 2 TFBot { Template T_TFBot_Red_Scout Name "Cola Popper Scout" Item "The Soda Popper" Item "Crit-a-Cola" Item "Bonk Leadwear" ClassIcon scout_cola_nys ItemAttributes { ItemName "Crit-a-Cola" "mod_mark_attacker_for_death" 0 //I think this maybe just does nothing "effect bar recharge rate increased" 0.4 } AddTemplate AttackTank_Only } } WaveSpawn { Name "EMERGENCY SPATIAL SHIFT" WaitForAllDead "wave3b2" FirstSpawnOutput { Target tankcapdoor_opener Action Open } } //Subwave 3: last section! long stretch, excellent for... //- T: Giant Buff Bison Soldier //- Support, H: Burst Fire Soldier //- Support, T: Rapid/Burst/Crit Bison Soldier WaveSpawn { Name "wave3c" Where spawnbot_hatch_alt WaitBetweenSpawns 18 TotalCount 4 MaxActive 4 SpawnCount 2 Squad { TFBot { Template T_TFBot_Red_Giant_Soldier Name "Giant Bison Barrage Soldier" Health 4000 ClassIcon soldier_bison_spammer WeaponRestrictions SecondaryOnly Item "The Righteous Bison" Item "Lord Cockswain's Pith Helmet" ItemAttributes { ItemName "The Righteous Bison" "auto fires when full" 1 "auto fires full clip" 1 "fire rate bonus" 0.2 "faster reload rate" 0.6 "clip size bonus" 6 } CharacterAttributes { "max health additive bonus" 4000 } AddTemplate AttackTank } TFBot { Template T_TFBot_Red_Medic_Overheal } } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon red2_lite } } WaveSpawn { Name "Support" WaitForAllDead "wave3b2" Where spawnbot_hatch WaitBeforeStarting 6 WaitBetweenSpawns 5 TotalCount 100 MaxActive 4 SpawnCount 2 Support 1 TFBot { Class Soldier Name "Burst Fire Soldier" Skill Normal ClassIcon soldier_burstfire Item "The Liberty Launcher" Attributes HoldFireUntilFullReload ItemAttributes { ItemName "The Liberty Launcher" "fire rate bonus" 0.05 "faster reload rate" 1.5 "projectile spread angle penalty" 2 } Template RedBot_Hunt } } WaveSpawn { Name "Support" WaitForAllDead "wave3b2" Where spawnbot_hatch WaitBetweenSpawns 2.5 TotalCount 100 MaxActive 6 SpawnCount 1 Support 1 RandomChoice { TFBot { Template T_TFBot_Red_Soldier_Bison Name "Rapid Bison Soldier" ItemAttributes { ItemName "The Righteous Bison" "fire rate bonus" 0.5 "faster reload rate" 0 } AddTemplate AttackTank_Only_Back } TFBot { Template T_TFBot_Red_Soldier_Bison Name "Burst Bison Soldier" ItemAttributes { ItemName "The Righteous Bison" "fire rate penalty" 2.5 "projectile spread angle penalty" 2 "mult projectile count" 3 "faster reload rate" 0 } AddTemplate AttackTank_Only } TFBot { Template T_TFBot_Red_Soldier_Bison Name "Crit Bison Soldier" Attributes AlwaysCrit AddTemplate AttackTank_Only_Back } } } } // Wave 4 - Time to start blasting! // Objective: escort (gatebot) giants! start from red side! // Obstacle: bots prevent yeeting oneself towards the next objective. // Maybe cool: a "guardian" bot that lets the gate open? // Good chance for spies to start spawning! //Subwave 1: fight for the doors! //- D: Giant Sapper Soldier (disables buildings on hit) //- H: Brass Beast Heavy, Milk Syringe Medic //- H: Giant Dragon's Fury Pyro //Subwave 2: the gate is now ours! //- D: Chief Teleporting Engie //- B: Brass Beast Heavy //- H: Wrangler Engies (sentry on their head, mwahaha) //Subwave 3 //- D: Giant Sapper Soldier (disables buildings on hit) //- B: Giant Penetrating Heavy + Uber Medic //- H: Rapid Fire Demo //- H: Milk Syringe Medic //VIPs: Giant Healing Burst Demo (3x each) //Support, BLU: Kritz Buff Soldiers //Support, RED: Homewrecker Pyros Wave { ItemAttributes { ItemName "Ulti Wrench" "critboost on kill" 1.6 "restore health on kill" 25 "dmg taken increased" 0.75 "move speed bonus" 1.15 } InitWaveOutput { Target wave4_spawner Action Trigger } StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } //Subwave 1: fight for the doors! //- D: Giant Sapper Soldier (disables buildings on hit) //- H: Brass Beast Heavy, Milk Syringe Medic //- H: Giant Dragon's Fury Pyro? scrapped for now. WaveSpawn { Name "wave4a" Where spawnbot_w3_garage TotalCount 1 MaxActive 1 SpawnCount 1 DoneOutput { Target front_red_open Action Trigger } TFBot { Template T_TFBot_Red_Giant_Soldier_Sapper InterruptAction { Target "-5800 1000 -50" Cooldown 4 Duration 5 Delay 0 } } } WaveSpawn { Name "wave4a2" Where spawnbot_w3_garage Where spawnbot_w3_tankdoor WaitBetweenSpawns 5 TotalCount 27 MaxActive 9 SpawnCount 3 TFBot { Class Heavyweapons Name "Brass Beast Heavy" Item "The Brass Beast" ClassIcon heavy_brass_nys Template RedBot_Hunt } } WaveSpawn { Name "wave4a2" Where spawnbot_w3_garage Where spawnbot_w3_tankdoor WaitBetweenSpawns 6 TotalCount 12 MaxActive 4 SpawnCount 1 TFBot { Class Medic Name "Milk Syringe Medic" Health 350 Scale 1.2 Skill Expert ClassIcon medic_syringe_milk2 WeaponRestrictions PrimaryOnly Item "Upgradeable TF_WEAPON_SYRINGEGUN_MEDIC" Item "Das Naggenvatcher" Action Mobber AimAt Body AimOffset "0 0 10" AimLeadProjectileSpeed 1100 //overaims slightly Template RedBot_Hunt ItemAttributes { ItemName "Upgradeable TF_WEAPON_SYRINGEGUN_MEDIC" "fire rate bonus" 0.75 //haha syringe go brrrr "faster reload rate" 0 "mad milk syringes" 1 } } } //Subwave 2: the gate is now ours! //- D: Chief Teleporting Engie //- B: Brass Beast Heavy //- H: Wrangler Engies (sentry on their head, mwahaha) WaveSpawn { Name "wave4b" WaitForAllDead "wave4a" Where spawnbot_hatch FirstSpawnOutput { Target spawnbot_hatch_alt Action Trigger } TotalCount 1 MaxActive 1 SpawnCount 1 TFBot { Class Engineer Name "Chief Teleporter Engie" Health 28000 Scale 1.8 Attributes MiniBoss Attributes UseBossHealthbar ClassIcon teleporter_red WeaponRestrictions PrimaryOnly Item "The Widowmaker" Item "The Gunslinger" SpawnTemplate "Teleporter_Red_w4" ItemAttributes { ItemName "The Gunslinger" "is_passive_weapon" 1 } ShootTemplate //Shoot defined point template. Template is spawned at bot position in looking direction, forward velocity being applied to spawned entities { Name Teleporter_Shot Speed 1500 //Velocity of the spawned objects (Default: 1000) Offset "0 0 0" Angles "0 0 0" OverrideShoot 1 //Stop default projectile from being spawned (Default: 0) Spread 0 //Spread of the fired template entities. 0 - No spread, 0.1 - Beggar like spread, 1 - Very inaccurate (Default: 0) ItemName "The Widowmaker" //Can be specified to limit to a specific weapon } CharacterAttributes { "move speed bonus" 0.4 "damage force reduction" 0.1 "fire rate penalty" 2.5 } Template RedBot_Hunt } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon red2_lite } } WaveSpawn { Name "Busties" Where spawnbot_hatch_alt WaitBetweenSpawnsAfterDeath 1 TotalCount 10 MaxActive 1 SpawnCount 1 Support Limited TFBot { Class Demoman Name "Mini Insta-Buster" Skill Expert Item "The Ullapool Caber" WeaponRestrictions MeleeOnly ClassIcon sentry_buster_red Health 10 Action SuicideBomber UseBusterModel 1 CharacterAttributes { "move speed bonus" 0.5 "health regen" -4 "damage force reduction" 0.01 "airblast vulnerability multiplier" 0.01 "override footstep sound set" 7 "cancel falling damage" 1 } } } WaveSpawn { Name "Icon" TotalCount 1 Support Limited TFBot { Class Pyro ClassIcon blu2_lite } } WaveSpawn { Name "Support" Where spawnbot_front_right Where spawnbot_right TotalCount 3 MaxActive 1 SpawnCount 1 Support Limited TFBot { Template T_TFBot_Giant_Demo_Burst_Heal } } WaveSpawn { Name "Support 2" WaitForAllDead "Support" Where spawnbot_front_right Where spawnbot_right TotalCount 1 MaxActive 1 SpawnCount 1 Support Limited TFBot { Template T_TFBot_Giant_Demo_Burst_Heal SpawnTemplate lastbotlogic } } WaveSpawn { Name "Support 2" WaitBeforeStarting 10 Where spawnbot_front_right Where spawnbot_right TotalCount 1 MaxActive 1 SpawnCount 1 Support Limited TFBot { Template T_TFBot_Soldier_Kritz } } } //Wave 5 - The big reversal: //- You're on Red again! Protect a Red titan! //- Start off in blue spawn, get tp'd to hatch, which is where Titan will await. //- Primarily hunt bots, with a few "offensive positioning" bots; // try to reach certain positions before firing powerful attack on boss. //- oh and busters of course Wave { ItemAttributes { ItemName "Ulti Wrench" "critboost on kill" 1.8 "restore health on kill" 30 "dmg taken increased" 0.7 "move speed bonus" 1.2 } WaveSpawn { } } // Wave 6 - Scrapped. Originally was wave 5, but I ran outta time. // Objective: capture, then defend point around original spawns. // Obstacle: defensive bots, smaller amounts of hunting bots. // Wave // { // ItemAttributes // { // ItemName "Ulti Wrench" // "critboost on kill" 2 // "restore health on kill" 35 // "dmg taken increased" 0.65 // "move speed bonus" 1.25 // } // WaveSpawn // { // } // } }