//Terabyte Termination, Advanced difficulty, by Seelpit //Map by Smrekish & Rafradek //A Giantmode mission, outside of Reverse. //Aims to improve upon the existing formula as used in prior missions, //i.e. Castle Crush, Numerator, and Desolated Death //Notes per mission: //- Castle Crush put a focus on roughly "equal power" per weapon, disabling upgrades entirely. // This may result in players changing loadouts rather than upgrades to tackle a harder wave, // while simultaneously allowing plenty of variety in item equip choice. //- Numerator did this similarly, albeit with notably less variety in weapon changes. // Most weapons were based on, but not identical to, existing Valve robots. // A major difference is that certain weapons, such as melees, were given sparse treatment, // or even banned outright. This reduces options, alleviating overchoice and workload balancewise, // but may also make players feel less powerful and make the mode more "alien". //- Desolated Death is the only mission with a particular focus on relatively unchanged weapons, // opting for upgrades at different prices instead, with some weapons having unique upgrades. // This results in some customizability per class, but also in some peculiar money-based balancing. // Moreover, most upgrades were too heavily based on bots, making them somewhat sluggish for players to use. //The main pros to focus on are: //- Player choice, letting them opt to use a variety of different loadouts effectively. //- Familiarity, by not banning any weapons whatsoever. //- Ease of use, by basing weapons on how players fight *with* them, not *against* them. //Desolated Death's unique upgrades, though nice, resulted in players needing to equip an item before learning //of said upgrade. However, with unchanged weapons and without unique upgrades, //certain weapons will definitively outclass others (see: Beggar's, Brass (debatably), Backburner). //Weapon changes, however, can be inspected and shown! Moreover, this would allow weapons to have //(near-)identical upgrades. Weapons that are inherently stronger may simply miss out on a basic upgrade, //like with Repred's Widowmaker having no reload + fire rate upgrade, resulting in a slower fire rate at high money. //Certain upgrades can still favor certain weapons; a "Combo" upgrade on flamethrowers may still be favourable //for the Degreaser, assuming its base stats remain similar. //Notes for problematic weapons to be addressed: //=== SOLDIER ==== //- Cow Mangler 5000: with infinite spare ammo on other launchers, only downside is less building damage (and no crits), // and charged shot, resulting in arguably direct upgrade based on waves having engies or not. //- Beggar's Bazooka: with infinite spare ammo, loses its main weakness (chews through ammo fast). Negligible downsides // for massive upsides; ideally, hit this one with a missing DPS upgrade of some kind, or force it to reload slower; // Dedicated "Barrage/Burst" launcher. //- Liberty Launcher: negligible upsides with harsh downside. Ideally, make this pair well with its set; // Dedicated "Combo" launcher. //- Black Box: 20 health is too small. Could test out increased healing in general for inherently less damage or reload? // Increased time between rockets could reward players for well-timed shots and not make player a sitting blob. //- Rocket Jumper: problem child. Could strongly boost other weapons, becoming best-in-slot for those playstyles; // might overlap with Liberty in that regard...careful balancing required. //- Air Strike: may require some extra boosts in knockback. Could be interesting to allow Rocket Jumping in general, // then have "Passive" Canteen boost RJ mobility (no self damage + boosted kb + rj attack rate bonus on everything? owo) //=== PYRO === //- Degreaser: a bit too similar to stock. Slightly harsher downside with slightly better upside may help. // Dedicated "Combo" Flamer. //- Backburner: requires some kind of REAL downside; infinite ammo nullifies airblast cost. Aggro-oriented playstyle, huh... //- Phlog: requires harsher downside. Airblast may be more negligible with higher healthpools. //=== DEMOMAN === //- Loose Cannon: very bad if given equal treatment to stock. Main goal appears to reward well-timed hits. // Could appeal to this more with greatly increased damage on (timed) attacks. Slowness of the weapon should reward // well-timed shots, either way. Additionally, explode on impact upgrade also generally helps. //- Loch-n-Load: projectile speed buff is generally quality-of-life, building bonus damage is too sparse. Could simply revert to +20% damage... #base robot_standard.pop #base robot_giant.pop WaveSchedule { StartingCurrency 1000 RespawnWaveTime 4 CanBotsAttackWhileInSpawnRoom No // Mechanic keyvalues NoReanimators 1 //Disable reanimators BonusRatioHalf 0.5 BonusRatioFull 1 ExtendedUpgradesOnly 1 // Robot keyvalues MaxSpectators 2 RobotLimit 24 SentryHintBombForwardRange 2000 // How far in front of bomb engineer can teleport in SentryHintBombBackwardRange 1000 // How far behind bomb engineer can teleport in SentryHintMinDistanceFromBomb 0 // Min distance engie spot must have from bomb to be eligible MedigunShieldDamage 1 // Visuals RedPlayersAreRobots 1 NoRomevisionCosmetics 1 TextPrintTime 0 ForceHoliday 2 // For some cosmetics to show. LuaScriptFile "scripts/teraterm_test.lua" LuaScriptFile "scripts/teraterm_ccc.lua" //Player Attributes ClassLimit //Limits the number of specified classes { Scout 0 Engineer 0 Medic 0 Sniper 0 Spy 0 } Templates { T_TFBot_Scout_Bat { Class Scout Skill Normal ClassIcon scout_bat_nys Name "Bat Scout" WeaponRestrictions MeleeOnly } //A Pyro with Normal skill, that does NOT airblast. //Who even likes coinflipping to get their attack reflected? T_TFBot_Pyro_NoAirblast { Class Pyro Skill Normal ItemAttributes { ItemName "TF_WEAPON_FLAMETHROWER" "airblast disabled" 1 } } T_TFBot_Demo_Skullcutter { Class Demoman Name "Axeknight" Skill Hard Item "The Scotsman's Skullcutter" Item "The Dark Helm" //Needs ForceHoliday 2 Item "Dark Age Defender" ClassIcon demoknight_skullcutter_lite WeaponRestrictions MeleeOnly } Chief_Control_Center { Class Engineer Name "Chief Control Center" Health 60000 Scale 1.8 Skill Expert Attributes MiniBoss Attributes UseBossHealthBar StripItemSlot 0 //No shotgun required Item "The Wrangler" Item "The Jag" Action Mobber SpawnTemplate WranglerBoss ItemAttributes { ItemName "The Wrangler" "disable wrangler shield" 1 } CharacterAttributes { "hidden string attribute 1" "ccc" "move speed penalty" 0.5 } EventChangeAttributes { Default //Wrangling { AimTrackingInterval 0.1 WeaponRestrictions SecondaryOnly Attributes SuppressFire DesiredAttackRange 750 } Building { WeaponRestrictions MeleeOnly } Sentry { AimTrackingInterval 0.3 //Rather forgiving as Wrangler has auto-aim for sentries } } } } PointTemplates { MainEnts { filter_activator_name { "filtername" "tiddies" "targetname" "filter_none" "Negated" 0 } } ActionChecker { OnSpawnOutput { Target "action_check" Action "Trigger" Delay 0 } $filter_sendprop { "targetname" "using_action" "$name" "m_bUsingActionSlot" "$value" "0" "$compare" "equal" "Negated" "1" // "OnPass" "player,$DisplayTextChat,{activator} did something.,0,-1" "OnPass" "popscript,$ActionPressed,,0,-1" } logic_relay { "targetname" "action_check" "spawnflags" "2" "OnTrigger" "using_action,TestActivator,,0,-1" "OnTrigger" "!self,Trigger,,0.06,-1" } } WranglerBoss { NoFixup 1 OnSpawnOutput { Target "ccc_target" Action $SetAimFollow Param !activator } info_target { "targetname" "ccc_target" "origin" "0 0 15" //slightly above ground "$modules" "aimfollow" } // math_counter // { // } } WrangledSentry { OnSpawnOutput { Target "ccc_sentry" Action $SetCollisionFilter Param "filter_none" //STOP COLLIDING PLEASE } obj_sentrygun { "targetname" "ccc_sentry" "defaultupgrade" 0 "teamnum" 3 "SolidToPlayer" 0 "solid" 0 "spawnflags" 2 "$rangemult" 0.01 "fademindist" "0" "fademaxdist" "1" } } } SpawnTemplate MainEnts // Powerup choice: inf use canteens of 2 or 3 types. // 1. Mobility: "Dash" // 2. Survivability: "Defense" // 3. Damage: "Offense" // Mobilities: // Pyro, Soldier: Thrust yourself up and forwards quickly. Ideally towards current moving Y. // Heavy: Launch yourself upwards. Passive: landing with a high velocity causes damage. // Demo: Uncertain. Demo likes to be at mid-range; perhaps thrust backwards, drop bombs where you thrusted from? // Survival: // Heavy, Demo(knight): gain brief uber and knockback immunity. NB: ensure that spamming it won't work too well! (Cooldown for duration? Charge up for longer?) // Heavy: on death, do not return to spawn. Enter a regen state for x seconds, regenning all/50% of your health while being incorporeal. // Pyro: Gain uber (and health steal?) for a brief moment. // Soldier: Gain great damage resistance and speedboost? Or also just uber? // Damage: // Pyro: Create a short-range fire burst that deals big damage (Rainblower tauntkill). // Soldier: Create a dense burst of rockets that accelerate after some time. // Demo: Create a dense clusterbomb field around yourself. // Heavy: none, enough dmg ExtendedUpgrades { Canteen_Mobility_Soldier_Pyro { Name "Canteen: Multi-Directional Dash" Description "Dash in the direction you're facing. 3 seconds cooldown." Attribute "cannot giftwrap" Cap 1 Increment 1 Cost 0 PlayerUpgrade 1 AllowPlayerClass Soldier AllowPlayerClass Pyro SecondaryAttributes { "special item description" "Reusable Canteen: Dash in the direction you're facing. 3 second cooldown." } OnApply { Output "popscript,$DashPurchased,,0" } OnDowngrade { Output "popscript,$DashRefunded,,0" } } Canteen_Mobility_Demo { Name "Canteen: Disengaging Dash" Description "Dash away from the direction you're facing. 3 second cooldown." Attribute "cannot giftwrap" Cap 1 Increment 1 Cost 0 PlayerUpgrade 1 AllowPlayerClass Demoman SecondaryAttributes { "special item description" "Reusable Canteen: Dash away from the direction you're facing. 3 second cooldown." } OnApply { Output "popscript,$DashPurchased,,0" } OnDowngrade { Output "popscript,$DashRefunded,,0" } } Canteen_Mobility_Heavy { Name "Canteen: Laika Launch" Description "Launch yourself directly upwards! Landing will deal damage in an area. 3 seconds cooldown." Attribute "cannot giftwrap" Cap 1 Increment 1 Cost 0 PlayerUpgrade 1 AllowPlayerClass Heavyweapons SecondaryAttributes { "special item description" "Reusable Canteen: Launch yourself directly upwards! 3 seconds cooldown." "kb fall min velocity" 750 "kb fall radius" 250 "kb fall stun time" -1 "kb fall force" 0 "kb fall damage" 100 } OnApply { Output "popscript,$CanteenPurchased,Dash,0" } OnDowngrade { Output "popscript,$CanteenRefunded,,0" } } Canteen_Defense_Soldier { Name "Canteen: Emergency Aid" Description "Instantly recover 40% of your max HP. 15 seconds cooldown." Attribute "cannot restore" Cap 1 Increment 1 Cost 0 PlayerUpgrade 1 AllowPlayerClass Soldier SecondaryAttributes { "special item description" "Reusable Canteen: Instantly recover 40% of your max HP. 15 seconds cooldown." } OnApply { Output "popscript,$CanteenPurchased,,0" } OnDowngrade { Output "popscript,$CanteenRefunded,,0" } } Canteen_Offense_Soldier { Name "Canteen: Explosive Phalanx" Description "Create an arch of rockets that home in on your crosshair, then accelerate. 10 seconds cooldown." Attribute "cannot trade" Cap 1 Increment 1 Cost 0 PlayerUpgrade 1 AllowPlayerClass Soldier SecondaryAttributes { "special item description" "Reusable Canteen: Create an arch of rockets that home in on your crosshair, then accelerate. 10 seconds cooldown." } OnApply { Output "popscript,$CanteenPurchased,,0" } OnDowngrade { Output "popscript,$CanteenRefunded,,0" } } } PlayerSpawnTemplate { Name "ActionChecker" // Name of the template } Mission { Objective Sniper Where spawnbot_mission_sniper BeginAtWave 2 RunForThisManyWaves 1 InitialCooldown 40 CooldownTime 30 DesiredCount 2 TFBot { Template T_TFBot_Sniper CharacterAttributes { "cancel falling damage" 1 } } } Mission { Objective Spy Where spawnbot BeginAtWave 6 RunForThisManyWaves 1 InitialCooldown 25 CooldownTime 45 DesiredCount 2 TFBot { Template T_TFBot_Spy CharacterAttributes { "cancel falling damage" 1 } } } Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } WaveSpawn { Name "noend" WaitBeforeStarting 5555 } WaveSpawn { Name "wave1a" Where spawnbot Where spawnbot_right TotalCount 15 MaxActive 1 SpawnCount 1 WaitBeforeStarting 0 WaitBetweenSpawns 1 TotalCurrency 0 Support 1 TFBot { Template Chief_Control_Center } } WaveSpawn { Name "wave1a" Where spawnbot_right TotalCount 15 MaxActive 1 SpawnCount 1 WaitBeforeStarting 0 WaitBetweenSpawns 1 TotalCurrency 0 Support 1 TFBot { Template T_TFBot_Giant_Pyro Scale 1.6 Attributes SuppressFire Attributes DisableDodge Action Mobber SpawnTemplate { Name WrangledSentry Origin "0 0 70" } InterruptAction { Target "ccc_target" AimTarget "ccc_target" Delay 0.1 Cooldown 5 Duration 6 AlwaysLook 1 } } } } //Simple test wave //Subwave 1 - just melees //- Bat Scouts //- Skullcutter Demos //Subwave 2 - big boys //- Giant Fast Fire Demo //- Giant Charged Soldier //Subwave 3 - now both at once! //- Giant Fast Fire Demo + Pyros //- Bat Scouts Wave { StartWaveOutput { Target wave_start_relay Action Trigger } DoneOutput { Target wave_finished_relay Action Trigger } WaveSpawn { Name "wave1a" Where spawnbot WaitBetweenSpawns 3.5 TotalCount 80 MaxActive 15 SpawnCount 5 TotalCurrency 80 Squad { NoFormation 1 TFBot { Template T_TFBot_Scout_Bat } TFBot { Template T_TFBot_Scout_Bat } TFBot { Template T_TFBot_Scout_Bat } TFBot { Template T_TFBot_Scout_Bat } TFBot { Template T_TFBot_Demo_Skullcutter } } } WaveSpawn { Name "wave1b1" WaitForAllSpawned "wave1a" WaitBeforeStarting 3 Where spawnbot_right TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 100 TFBot { Template T_TFBot_Giant_Demo_RapidFire Name "Giant Fast Fire Demoman" } } WaveSpawn { Name "wave1b" WaitForAllDead "wave1a" Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 100 TFBot { Template T_TFBot_Giant_Soldier_Crit } } WaveSpawn { Name "wave1b" WaitForAllDead "wave1b1" Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 100 TFBot { Template T_TFBot_Giant_Demo_RapidFire Name "Giant Fast Fire Demoman" } } WaveSpawn { Name "wave1b2" WaitForAllSpawned "wave1b" WaitBeforeStarting 15 Where spawnbot TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 100 TFBot { Template T_TFBot_Giant_Demo_RapidFire Name "Giant Fast Fire Demoman" } } WaveSpawn { Name "wave1b2" WaitForAllSpawned "wave1b" WaitBeforeStarting 15 Where spawnbot_right TotalCount 1 MaxActive 1 SpawnCount 1 TotalCurrency 100 TFBot { Template T_TFBot_Giant_Soldier_Crit } } WaveSpawn { Name "wave1c" WaitForAllDead "wave1b" WaitBeforeStarting 3 TotalCount 5 MaxActive 5 SpawnCount 5 TotalCurrency 100 Squad { NoWaitForFormation 1 TFBot { Template T_TFBot_Giant_Soldier_Crit } TFBot { Template T_TFBot_Pyro_NoAirblast } TFBot { Template T_TFBot_Pyro_NoAirblast } TFBot { Template T_TFBot_Pyro_NoAirblast } TFBot { Template T_TFBot_Pyro_NoAirblast } } } WaveSpawn { Name "wave1c" WaitForAllDead "wave1b2" WaitBeforeStarting 3 TotalCount 5 MaxActive 5 SpawnCount 5 TotalCurrency 100 Squad { NoWaitForFormation 1 TFBot { Template T_TFBot_Giant_Heavyweapons } TFBot { Template T_TFBot_Pyro_NoAirblast } TFBot { Template T_TFBot_Pyro_NoAirblast } TFBot { Template T_TFBot_Pyro_NoAirblast } TFBot { Template T_TFBot_Pyro_NoAirblast } } } WaveSpawn { WaitForAllSpawned "wave1b2" WaitForAllDead "wave1a" WaitBeforeStarting 20 WaitBetweenSpawns 5 TotalCount 45 MaxActive 9 //Results in some funky faster spawns~ SpawnCount 6 Support Limited //If you're really, really, really stally. TFBot { Template T_TFBot_Scout_Bat } } } Wave { WaveSpawn { Name "waveXXX" //This thing ain't on autopilot, son! FirstSpawnWarningSound "vo/mvm/norm/engineer_mvm_wranglekills01.mp3" TotalCount 1 SpawnCount 1 TotalCurrency 1 Squad { NoFormation 1 TFBot { Template Chief_Control_Center } } } } }