GitHub avatar

Fox's Blog

TF2 Bots Aren't Random: I Reverse-Engineered Every Difficulty Setting

Vision, aim tracking, spy backstab angles, sniper headshot logic, every known bug -- Valve never documented any of it. So we dug through the code and turned it into a full spec sheet.

Introduction

TF2 Soldier bot aiming a rocket launcher

Every TF2 player has said it at least once: "this bot is cheating." Or the opposite: "why is this Easy bot just standing there eating rockets." Nobody really knows what "Easy," "Normal," "Hard," and "Expert" actually mean under the hood -- Valve shipped four difficulty labels and exactly zero documentation.

So a bunch of us (me, awimii, Mush The Possum, with a huge chunk of the groundwork done by sigsegv, who actually went digging through the decompiled game code) put together a full research document on TFBot behavior. Every mechanic, every known bug, every hardcoded probability. This article is the full writeup, not the condensed one. Grab a Bonk, this is a long one.


Chapter I: The Basics

Bot vs Puppet Bot

TF2 has two completely different things people call "bots":

  • AI bots (TFBots): real AI, built on the same PlayerBot/Infected framework Valve used for the Left 4 Dead series. They pick a random class, they play the objective, they work without sv_cheats, and they trigger achievements like a real player would.
  • Puppet bots: zero AI, can't move or act on their own. They exist purely to be manually controlled -- a player can force them to follow, aim, and fire, mostly used for testing or for making cinematic screenshots/videos. Spawning them requires sv_cheats 1, which also disables achievements for the session.

This article is entirely about the first kind.

What AI bots can (kind of) be told to do

TFBots aren't directly controllable, but there's a short list of things you can nudge them into doing:

  • Aim your crosshair at any bot (friendly or enemy) and it'll taunt at you if you use the right voice binds.
  • A friendly Medic bot heals you if you use the "Medic!" voice command.
  • If a Medic bot is healing you and has an ÜberCharge ready, saying "Go go go!" or "Activate charging!" makes it pop the charge immediately.
  • A Medic bot with charge ready will auto-pop it the moment it or its heal target takes serious damage, no voice command needed.
  • Bots will spontaneously perform partner taunts (High Five) or group taunts (Conga) with nearby teammates.

Getting bots to work on unsupported maps

Bots rely on a navigation mesh to know where they're allowed to walk, and most community maps don't ship with one. To force it:

  1. sv_cheats 1
  2. nav_generate -- builds the initial navmesh, progress shown in console
  3. Wait for the game to finish generating paths
  4. Optionally fix bad nav data manually with nav_edit 1
  5. Reload or restart the server (skipping this disables achievements)
  6. tf_bot_add <number> to actually spawn bots

Warning: changing the navmesh while bots are active on the server can crash the game. Once the mesh exists you don't need to regenerate it for future sessions -- just re-add bots with tf_bot_add.

Auto-generated meshes work best on Control Point, King of the Hill, Payload, and CTF maps. On Mannpower maps bots default to CTF-style play but barely use grapple hooks or powerups. If a map has no objective the bot AI recognizes but does have a spawn room entity, setting tf_bot_offense_must_push_time 0 lets bots fight anyway.

(Source for this section: the official TF2 Wiki's Bots page.)

Current status, map by map

Thanks to the Hatless update, every class works correctly now, including the historically-buggy Spy. Bots behave properly on most official KOTH maps, some Payload maps, Dustbowl/Gorge Attack-Defense, and CTF/Mann Manor maps -- though on the latter two you can't spawn them with tf_bot_add directly. On unsupported maps (via the nav_generate process above) they work, just noticeably worse at imitating a real player.

PLR maps are a lost cause: bots can't clear the barriers on Hightower and get stuck in corners, and on every other PLR map they just... have a dance party instead of playing. This might get fixed eventually. Might not.

General bot behavior

A grab-bag of things every bot does regardless of skill:

  • Bots only ever use stock loadouts (a plugin can force non-stock weapons on them, but vanilla bots never pick their own).
  • Easy bots barely touch their secondary weapon. Higher difficulties swap to secondary the moment their primary runs dry, or to compensate for range.
  • Bots can't do movement tech -- no rocket jumps, no building relocation.
  • After a kill, a bot might taunt, even under fire -- except while carrying the enemy intelligence, and this rule also applies in MvM.
  • Disguised Spy bots (player or AI) are correctly ignored by other bots -- until they touch an enemy, sap something, shoot, or cloak near one. Once "made," that specific bot/player is remembered as a Spy until it changes disguise while staying invisible, dies, or fakes death with the Dead Ringer.
  • Pyro bots use Compression Blast liberally on anything above Easy.
  • Medic bots prioritize healing everyone over Snipers (and, to a lesser extent, Engineers), even if you spam "Medic!" as one.
  • Medic bots gravitate toward Heavies, Soldiers, Demomen, and Pyros -- specifically if a human is playing those classes. No human in those roles, no particular Medic attention.
  • Bots hold position during setup time on Attack/Defense and Payload maps -- except Engineers, Snipers, and Spies, who move freely (Demoman bots are also allowed to pre-place stickies).
  • Engineer bots never upgrade or de-sap another friendly Engineer's buildings, unless that building happens to sit in their target's path. They also sometimes just... don't repair their own turret, even when it's safe to.
  • Spotted Spy bots switch to their revolver and back away instead of forcing a stab.
  • Demoman bots that have located a sentry (usually by dying to it once) can perfectly lob stickies onto it from outside its range, arcing around walls and ceilings when the geometry allows.
  • Sniper bots that can't find a target after scoping in use one of the "Negative" voice lines.
  • Friendly Medics will heal a disguised Spy without hesitation.

Known issues / bugs

The document lists a solid pile of long-standing quirks:

  • Bots can attempt to walk or shoot through certain stationary props.
  • Any time a player/bot unmasks, disguises, or reveals, nearby bots "see" it and turn to react -- even if the event happened outside their actual field of view. It's not sound-based; it's a vision-check bypass.
  • Rarely, bots can get physically stuck together while using an Engineer teleporter.
  • Bot voice commands (e.g. "Spy!", "Forward!") don't display as chat text like player ones do.
  • A Medic bot actively healing someone won't dodge incoming fire or grab health kits, even at critically low HP.
  • Bots can keep moving while performing a partner taunt, which breaks the Festive Critical Strike's intended effect.
  • Recently-damaged Medic bots often refuse to use the Syringe Gun at range, preferring melee (or, in very rare cases, trying to hit you with the Medi Gun beam itself).
  • Medic bots don't compensate for gravity drop on Syringe Gun shots -- likely because the weapon isn't correctly flagged as non-hitscan in the AI code.
  • Spy bots can see and track a cloaked Spy (player or AI) if that Spy has already blown its cover once, regardless of the tracking bot's skill level.
  • Even if a player-Spy disguises as their own team's class, bumping into an enemy still outs them (bots never do this to themselves, since bots never disguise as their own team).
  • Bots respect team auto-balance -- if you're trying to stack bots on one team, you need mp_teams_unbalance_limit 0 first.
  • Engineer bots can flat-out ignore their own buildings until they're destroyed.
  • Heavy bots sometimes try to fire the Minigun while critically low on ammo, mostly below Hard difficulty.
  • Losing-team Medic bots occasionally suicide during the Humiliation phase when no enemies are nearby -- something a human player can't replicate even by trying.
  • Setting your loading-screen team preview to BLU makes RED bots visually render as BLU for you.
  • Bots with melee out sometimes refuse to switch weapons even after picking up ammo.
  • Post-Jungle Inferno, bots spawned with explicit params (e.g. tf_bot_add 5 pyro blue normal) can die instantly in their own spawn room. Fix: tf_bot_reevaluate_class_in_spawnroom 0 (needs sv_cheats 1).

AI names

Bot names are pulled from a big pool of references to TF2, other Valve games, and programming culture, largely because the community kept requesting specific ones on the Steam forums. A sample of the list: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, and dozens more in that vein.

There's also a batch of names found in a leaked source build that never shipped in production, for unclear reasons -- mostly Last Dragon and The Fifth Element references like John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh?, and I'm your huckleberry.

You can override any of this yourself: tf_bot_add heavyweapons blue "Blu Hoovy" spawns a named BLU Heavy called "Blu Hoovy."


Chapter II: The Original Bots / TFBots -- Skill Level Deep Dive

Sigsegv's original framing still holds: it's obvious Expert bots outplay Easy bots, but Valve never explained how much or why. So the only way to know is to read the code. Here's every mechanic that scales with skill.

Setting difficulty

Outside MvM, difficulty is controlled by one cvar:

tf_bot_difficulty Skill level
0 Easy
1 Normal (default)
2 Hard
3 Expert

tf_bot_add also accepts a difficulty argument directly (easy/normal/hard/expert).

MvM popfiles

In Mann vs. Machine, each TFBot spawner block in the popfile has an optional Skill key. No key means Easy. In Valve's own missions: Giants are almost always Expert, Engineers and Spies are almost always Expert, and Snipers are usually Hard (occasionally Expert). If you're using EventChangeAttributes (added in the Two Cities update) to dynamically alter bots mid-wave based on map events, bot skill is one of the properties you're allowed to change on the fly.

MvM Endless Mode

Endless mode never officially shipped, but in it, bots spend their money on upgrades just like players do -- including a bot-exclusive upgrade that bumps their AI skill level mid-game.

The bot_generator entity

An obscure, largely undocumented entity believed to have been used in training mode and possibly in early MvM development. It exposes a SetDifficulty input to control skill level. Beyond that, the trail goes cold -- Valve never documented it and nobody's fully mapped its behavior.

Eye glow color

MvM robots have an eye-glow particle that changes color with skill level -- a visual tell nobody outside the community has ever explained:

Skill Eye color RGB
Easy/Normal Blue #24b4ff
Hard/Expert Yellow #fff000

TF2 Heavy bot in idle stance

Vision: recognition time

A bot doesn't react the instant something enters its field of view -- there's a hardcoded delay before the rest of the AI is even allowed to acknowledge the threat:

Skill Minimum recognition time
Easy 1.00 s
Normal 0.50 s
Hard 0.30 s
Expert 0.20 s

That's most of the "Easy bots feel dumb" effect in a single number -- an Easy bot doesn't aim worse once it notices you, it just takes five times longer to notice you exist.

Aim: follow rate

Bots don't track you continuously. They sample your position and velocity at a fixed interval and predict a straight line from there:

Skill Recalculation interval Equivalent rate
Easy 1.00 s 1x/sec
Normal 0.25 s 4x/sec
Hard 0.10 s 10x/sec
Expert 0.05 s 20x/sec

Exception: Spy bots are hardcoded to the Normal tracking rate no matter their actual skill level -- an Expert Spy still aims like a Normal bot. There's also a public demonstration video comparing tracking rates side by side if you want to see the 1x vs 20x gap in motion.

Aiming: weapon-specific skill

Bots don't just point at your center of mass -- they have per-weapon logic, some of it genuinely buggy:

Grenade Launcher & Sticky Launcher. All skill levels compensate for vertical arc, using a fixed value from the tf_bot_ballistic_elevation_rate cvar. Because that compensation only fires for the base weapon ID, faster projectile variants (Loch-n-Load, anything with a projectile-speed modifier) don't get correctly adjusted arcs. And since it's keyed by weapon ID specifically, the Loose Cannon -- a different ID entirely -- gets no arc compensation at all.

Huntsman. Easy bots don't compensate for arrow drop and never go for headshots. Normal-skill bots compensate for the arc, but only aim for the head within 150 HU. Hard/Expert bots always go for the head.

Rocket Launchers. Past 150 HU, non-Easy bots aim at your feet instead of center-mass, maximizing splash damage and knockback odds. Inside 150 HU they switch to headshots. Easy bots always aim center-mass regardless of range. This too is weapon-ID-locked: the Direct Hit and Cow Mangler don't inherit the behavior. Makes sense for the Direct Hit (no AoE to exploit); makes zero sense for the Cow Mangler -- this part of the AI predates the weapon's existence and was simply never revisited.

Sniper Rifles. Easy aims at the body. Normal aims roughly 33% of the way from body to head. Hard/Expert aim straight at the head. Matters less in MvM, where bot headshots don't get the damage bonus anyway.

Hearing: sensitivity to covert shots

Every gunshot alerts nearby bots to the shooter's position, even through walls, up to 3000 HU with a 100% notice chance (tf_bot_notice_gunfire_range). But a subset of weapons are flagged "stealth" -- audible only within 500 HU (tf_bot_notice_quiet_gunfire_range), and even then with a skill-dependent chance:

Skill Chance to notice a stealth shot
Easy 10%
Normal 30%
Hard 60%
Expert 90%

That probability is halved if a loud shot was heard in the last 3 seconds -- loud sounds mask quiet ones.

The stealth weapon-ID list hasn't been updated since December 2010. Anything added after that date using a brand-new weapon ID is treated as loud by default, no matter how quiet it logically should be, unless it happened to reuse an older ID. Concretely:

Weapon ID Covers
TF_WEAPON_KNIFE All Spy knives
TF_WEAPON_FISTS Heavy-specific punches (his multi-class punch is actually TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Believed unused directly
TF_WEAPON_PDA_ENGINEER_BUILD Engineer's Construction PDA
TF_WEAPON_PDA_ENGINEER_DESTROY Engineer's Destruction PDA
TF_WEAPON_PDA_SPY Spy's disguise kit
TF_WEAPON_BUILDER Spy's Engineer/Sapper toolkit
TF_WEAPON_MEDIGUN All Medi Guns
TF_WEAPON_DISPENSER Likely unused (Dispensers are objects, not weapons)
TF_WEAPON_INVIS All Spy cloak watches
TF_WEAPON_FLAREGUN All Pyro flare guns except the Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (not Mad Milk -- separate, non-stealth ID)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

The classic example of the list rotting: the Manmelter got its own ID (TF_WEAPON_RAYGUN_REVENGE), added after the stealth list was frozen -- so it's treated as loud, despite being a flare gun in every practical sense. The Scorch Shot, released even later, reuses the base TF_WEAPON_FLAREGUN ID and is therefore still considered stealth. Nonsensical, but that's the code.

Strategy: threat prioritization

When multiple enemies are visible at once, bots weigh distance, whether they're being shot at, and -- above Easy -- whether the primary threat is being healed:

Skill Targets the healer instead?
Easy No
Normal 50% chance
Hard Yes
Expert Yes

Enemies past 500 HU are normally deprioritized as non-immediate. Exceptions: Hard/Expert bots always treat distant Medics and Engineers as immediate threats, and any enemy Sniper aiming roughly your way is always treated as immediate regardless of distance and skill.

Skill Distant Medics/Engineers/aiming Snipers = immediate threat?
Easy/Normal No
Hard/Expert Yes

That Sniper check has a genuinely fun history. Sigsegv's original writeup assumed the game required the dot product between the sniper's aim vector and the bot's relative position to be exactly zero -- a comparison so precise it would almost never trigger in floating point math, making the whole feature effectively dead code. A correction issued later (credit to a cleaner Hex-Rays decompile) showed the actual check is dot product > 0: any Sniper facing anywhere from directly-at-you to perpendicular-to-you counts as an immediate threat; anything from perpendicular to facing-away doesn't. The original misread came from a bad decompilation of an SSE float comparison -- reverse-engineering a AAA binary isn't an exact science.

Movement: dodge

Easy bots never dodge, full stop. Normal-and-up bots dodge left/right (33% left, 33% right, 33% do nothing, weighted against detected gaps) when they're holding a combat weapon, have seen an enemy in the last 3 seconds, and that enemy has line of sight on them.

They will not dodge if any of these apply: DisableDodge attribute set, current behavior says to hurry, currently invulnerable (any über), mid-taunt/provocation, playing Engineer, invisible or disguised as Spy, scoped in as Sniper or revved as Heavy, or mid-Huntsman-draw.

Movement: avoid shoving enemies

Above Normal, bots specifically try not to bump into enemies while moving:

Skill Avoids bumping enemies?
Easy No
Normal No
Hard Yes
Expert Yes

In practice this only really matters for Spy bots -- avoiding an awkward collision with an enemy player is exactly the kind of thing that blows a disguise.

Pyro: airblast mastery

Airblast serves two purposes: reflecting projectiles (PvP and MvM) and shoving nearby enemies off ledges (PvP only). Whether the bot actually pulls the trigger on a valid opportunity is a skill-based coin flip:

Skill Airblast trigger chance
Easy 0%
Normal 50%
Hard 90%
Expert 100%

Easy Pyro bots literally cannot airblast -- the roll is hardcoded to never succeed, not just "rarely."

Spy: disguise effectiveness

Two separate axes scale with skill. Disguise choice:

Skill Disguise method
Easy/Normal Random class, ignoring what the enemy team is actually playing
Hard/Expert Picks a real enemy player and copies their exact class

Disguise acting:

Skill Behavior while disguised/cloaked
Easy/Normal Stares at enemy players when it sees them (suspicious)
Hard/Expert Deliberately avoids eye contact (more convincing)

Spy: backstab aggression

At long range (up to 300 HU, tf_bot_spy_knife_range), a Spy bot only commits to a backstab if it can see the victim and the victim's back is at least partially turned. Skill determines how far off-center that back angle is allowed to be:

Skill Angle tolerance
Easy Goes for it even facing you directly
Normal ±45° from your back
Hard ±78° from your back
Expert ±90° from your back (full rear 180° arc)

Easy Spy bots are functionally suicidal -- they'll attempt a stab on someone staring right at them. Exception: in Mann vs. Machine, every Spy bot is forced to the Normal angle constraint regardless of actual skill.

Tactics: weapon selection

Only kicks in above Easy, and mostly irrelevant in MvM since bots there usually have hard weapon restrictions:

  • Scout: switches to secondary when the primary's magazine is empty.
  • Soldier: switches to secondary on empty mag and target closer than 500 HU.
  • Sniper: switches to secondary for targets closer than 750 HU.
  • Pyro: switches to secondary for targets farther than 750 HU, unless that target is a Soldier or Demoman.

Tactics: cover reload

Not used in MvM. If the bot's current behavior isn't telling it to fall back, its main magazine is empty, and it isn't ubered, higher-skill bots will temporarily retreat to cover to reload instead of clicking an empty gun at you:

Skill Retreats to reload?
Easy No
Normal No
Hard Yes
Expert Yes

CP mode: defender wandering

Not used in MvM. Defending a control point, higher-skill bots are more likely to leave the point to hunt kills ("search and destroy"), but only with a decent chunk of time left on tf_bot_defense_must_defend_time:

Skill Chance to wander
Easy 10%
Normal 50%
Hard 75%
Expert 90%

CP mode: capture blocking

Not used in MvM. Defending bots contesting an enemy capture attempt:

Skill Will attempt to block the capture?
Easy No
Normal 50% chance
Hard Yes
Expert Yes

The full summary table

Aspect Easy Normal Hard Expert Notes
Vision: recognition time 1.00s 0.50s 0.30s 0.20s
Aim: follow-up rate 1x/s 4x/s 10x/s 20x/s Spies always use Normal
Grenade/sticky arc compensation Yes Yes Yes Yes Loose Cannon exempt
Huntsman vertical compensation No Yes Yes Yes
Huntsman headshots No <150 HU Yes Yes
Rocket Launcher foot-shots No Yes Yes Yes Direct Hit & Cow Mangler exempt
Sniper Rifle aim point Body ~33% to head Head Head
Chance to notice stealth shots 10% 30% 60% 90% Halved if masked by loud shots
Targets the healer No 50% Yes Yes
Distant Medic/Engineer/Sniper = threat No No Yes Yes
Dodge No Yes Yes Yes Long exception list
Avoids bumping enemies No No Yes Yes Mostly matters for Spy
Airblast trigger chance 0% 50% 90% 100%
Spy disguise class choice Random Random Matches real enemy Matches real enemy
Spy eye contact while disguised Stares (obvious) Stares Avoids (convincing) Avoids
Spy backstab angle ~0° ±45° ±78° ±90° MvM forces Normal
Weapon selection logic No Yes Yes Yes Less relevant in MvM
Cover reload No No Yes Yes Not in MvM
CP defender wandering 10% 50% 75% 90% Not in MvM
CP capture blocking No 50% Yes Yes Not in MvM

Conclusion

TF2 Heavy bot aiming a minigun

None of this is guesswork gone wrong on Valve's part -- it's a deliberate, fully deterministic scoring and probability system, just never written down anywhere official. A few things worth remembering:

  1. "Skill" is a bundle of independent dials, not one global multiplier. Reaction time, aim rate, and every tactical behavior scale separately, and a few (Spy tracking rate, MvM backstab angle) get hardcoded overrides regardless of skill.
  2. Some of this is genuinely buggy, not just old. The stealth weapon list frozen since 2010, the Cow Mangler missing foot-aim logic for no good reason, the Sniper dot-product check that took years to get correctly decompiled -- Valve's AI code has scar tissue like any other 17-year-old codebase.
  3. You can use all of this. Know that a Sniper bot won't headshot you on Normal, that an Easy Pyro literally cannot airblast your rocket back, that an Easy Spy will try to stab you face-to-face. It's not luck. It's a spec sheet.

Huge thanks to sigsegv for the original code-diving that made most of this possible, to the TF2 Wiki for the baseline documentation on bot commands and map support, and to everyone in the community still poking at a 17-year-old bot AI to figure out exactly why it does what it does.

Les bots TF2 ne sont pas aléatoires : J'ai redécouvert chaque paramètre de difficulté

Vision, visée, angles de backstab, logique de headshot, chaque bug connu -- Valve n'a jamais rien documenté. Alors on a fouillé le code et transformé le tout en fiche technique complète.

Introduction

Soldat bot TF2 visant avec un lance-roquettes

Chaque joueur de TF2 l'a dit au moins une fois : « ce bot triche. » Ou l'inverse : « pourquoi ce bot Facile reste planté à manger des roquettes. » Personne ne sait vraiment ce que « Facile », « Normal », « Difficile » et « Expert » signifient réellement sous le capot -- Valve a expédié quatre étiquettes de difficulté et exactement zéro documentation.

Alors une bande d'entre nous (moi, awimii, Mush The Possum, avec une énorme partie du travail de base fait par sigsegv, qui a vraiment fouillé le code décompilé du jeu) a rassemblé un document de recherche complet sur le comportement des TFBot. Chaque mécanique, chaque bug connu, chaque probabilité codée en dur. Cet article est le compte-rendu intégral, pas la version condensée. Prenez un Bonk, ça va être long.


Chapitre I : Les Bases

Bot vs Bot Marionnette

TF2 a deux choses complètement différentes que les gens appellent « bots » :

  • Bots IA (TFBots) : véritable IA, construite sur le même framework PlayerBot/Infected que Valve a utilisé pour la série Left 4 Dead. Ils choisissent une classe aléatoire, jouent l'objectif, fonctionnent sans sv_cheats et déclenchent les succès comme un vrai joueur.
  • Bots Marionnette : zéro IA, incapables de bouger ou d'agir par eux-mêmes. Ils existent uniquement pour être contrôlés manuellement -- un joueur peut les forcer à suivre, viser et tirer. Principalement utilisés pour les tests ou pour faire des captures d'écran et vidéos cinématiques. Les faire apparaître nécessite sv_cheats 1, ce qui désactive aussi les succès pour la session.

Cet article porte entièrement sur le premier type.

Ce qu'on peut (plus ou moins) dire aux bots IA de faire

Les TFBot ne sont pas directement contrôlables, mais on peut les inciter à faire certaines choses :

  • Visez n'importe quel bot (allié ou ennemi) avec votre crosshair et il vous narguera si vous utilisez les bonnes commandes vocales.
  • Un bot Medic allié vous soigne si vous utilisez la commande vocale « Medic! »
  • Si un bot Medic vous soigne et a une UberCharge prête, dire « Go go go! » ou « Activez la charge! » le fait déclencher la charge immédiatement.
  • Un bot Medic avec une charge prête l'active automatiquement dès que lui-même ou sa cible de soin prend des dégâts sérieux, sans commande vocale nécessaire.
  • Les bots effectuent spontanément des nargues en duo (High Five) ou des nargues de groupe (Conga) avec des coéquipiers proches.

Faire fonctionner les bots sur des cartes non supportées

Les bots dépendent d'un maillage de navigation pour savoir où ils ont le droit de marcher, et la plupart des cartes communautaires n'en fournissent pas. Pour forcer :

  1. sv_cheats 1
  2. nav_generate -- construit le navmesh initial, progression affichée dans la console
  3. Attendez que le jeu finisse de générer les chemins
  4. Optionnellement, corrigez manuellement les mauvaises données de navigation avec nav_edit 1
  5. Rechargez ou redémarrez le serveur (sauter cette étape désactive les succès)
  6. tf_bot_add <nombre> pour faire apparaître les bots

Avertissement : modifier le navmesh pendant que des bots sont actifs sur le serveur peut planter le jeu. Une fois le maillage existant, vous n'avez pas besoin de le régénérer pour les sessions futures -- ajoutez simplement les bots avec tf_bot_add.

Les maillages auto-générés fonctionnent mieux sur les cartes Point de Contrôle, King of the Hill, Payload et CTF. Sur les cartes Mannpower, les bots adoptent par défaut un comportement de type CTF mais utilisent à peine les grappins ou les powerups. Si une carte n'a pas d'objectif que l'IA du bot reconnaît mais possède une entité de salle d'apparition, définir tf_bot_offense_must_push_time 0 permet aux bots de combattre quand même.

(Source pour cette section : la page Bots du wiki officiel TF2.)

Statut actuel, carte par carte

Grâce à la mise à jour Hatless, chaque classe fonctionne correctement maintenant, y compris le Spy historiquement bugué. Les bots se comportent correctement sur la plupart des cartes KOTH officielles, certaines cartes Payload, Dustbowl/Gorge Attack-Defense et les cartes CTF/Mann Manor -- même si sur ces deux dernières vous ne pouvez pas les faire apparaître directement avec tf_bot_add. Sur les cartes non supportées (via le processus nav_generate ci-dessus), ils fonctionnent, mais sont nettement moins bons pour imiter un vrai joueur.

Les cartes PLR sont une cause perdue : les bots ne peuvent pas franchir les barrières sur Hightower et se coincent dans les coins, et sur toutes les autres cartes PLR ils font juste... une fête de la danse au lieu de jouer. Peut-être que ça sera corrigé un jour. Peut-être pas.

Comportement général des bots

Un fourre-tout de choses que chaque bot fait indépendamment de son niveau :

  • Les bots utilisent seulement des loadouts de base (un plugin peut leur forcer des armes non-standard, mais les bots vanilla ne choisissent jamais les leurs).
  • Les bots Faciles utilisent à peine leur arme secondaire. Les difficultés supérieures passent à l'arme secondaire dès que le chargeur principal est vide, ou pour compenser la distance.
  • Les bots ne savent pas faire de techniques de mouvement -- pas de rocket jump, pas de relocalisation de bâtiment.
  • Après un kill, un bot peut narguer, même sous le feu -- sauf s'il porte le renseignement ennemi, et cette règle s'applique aussi en MvM.
  • Les bots Spy déguisés (joueur ou IA) sont correctement ignorés par les autres bots -- jusqu'à ce qu'ils touchent un ennemi, sabotent quelque chose, tirent ou deviennent invisibles près d'un. Une fois « découverts », ce bot/joueur spécifique est mémorisé comme Spy jusqu'à ce qu'il change de déguisement tout en restant invisible, meure ou simule sa mort avec le Dead Ringer.
  • Les bots Pyro utilisent la Compression Blast libéralement à partir du niveau Normal.
  • Les bots Medic priorisent les soins sur tout le monde sauf les Snipers (et, dans une moindre mesure, les Engineers), même si vous spammez « Medic! » en tant que tel.
  • Les bots Medic gravitent vers les Heavies, Soldiers, Demomen et Pyros -- spécifiquement si un humain joue ces classes. Pas d'humain dans ces rôles, pas d'attention particulière du Medic.
  • Les bots restent en position pendant le temps de préparation sur les cartes Attack/Defense et Payload -- sauf les Engineers, Snipers et Spies, qui se déplacent librement (les bots Demoman sont aussi autorisés à pré-placer des bombes collantes).
  • Les bots Engineer n'améliorent ni ne désactivent jamais les constructions d'un autre Engineer allié, à moins que cette construction ne se trouve sur le chemin de leur cible. Ils ne réparent parfois tout simplement pas leur propre tourelle, même quand ça semble évident.
  • Les bots Spy repérés passent à leur revolver et reculent au lieu de forcer un coup de couteau.
  • Les bots Demoman qui ont localisé une sentinelle (généralement en mourant dessus une fois) peuvent parfaitement lancer des bombes collantes dessus depuis l'extérieur de sa portée, en arc de cercle à travers les murs et les plafonds quand la géométrie le permet.
  • Les bots Sniper qui ne trouvent pas de cible après avoir visé utilisent l'une des lignes vocales « Negatives. »
  • Les Medics alliés soignent un Spy déguisé sans hésitation.

Problèmes / bugs connus

Le document liste un bon nombre de bizarreries de longue date :

  • Les bots peuvent essayer de marcher ou de tirer à travers certains props statiques.
  • Chaque fois qu'un joueur/bot se démasque, se déguise ou se révèle, les bots proches le « voient » et se retournent pour réagir -- même si l'événement s'est produit en dehors de leur champ de vision réel. Ce n'est pas basé sur le son ; c'est un contournement du test de vision.
  • Rarement, les bots peuvent rester physiquement coincés ensemble en utilisant un téléporteur d'Engineer.
  • Les commandes vocales des bots (ex. « Spy! », « En avant! ») ne s'affichent pas en texte dans le chat comme celles des joueurs.
  • Un bot Medic soignant activement quelqu'un n'esquivera pas les tirs entrants ni ne prendra de kits de soin, même à des PV critiques.
  • Les bots peuvent continuer à bouger pendant une nargue en duo, ce qui brise l'effet prévu du Festive Critical Strike.
  • Les bots Medic récemment blessés refusent souvent d'utiliser le Syringe Gun à distance, préférant le corps à corps (ou, dans de très rares cas, essayant de vous toucher avec le rayon du Medi Gun lui-même).
  • Les bots Medic ne compensent pas la gravité pour les tirs du Syringe Gun -- probablement parce que l'arme n'est pas correctement marquée comme non-hitscan dans le code IA.
  • Les bots Spy peuvent voir et suivre un Spy invisible (joueur ou IA) si ce Spy a déjà été découvert une fois, indépendamment du niveau de compétence du bot qui le suit.
  • Même si un joueur-Spy se déguise en classe de sa propre équipe, heurter un ennemi le démasque quand même (les bots ne font jamais ça à eux-mêmes, puisque les bots ne se déguisent jamais en leur propre équipe).
  • Les bots respectent l'équilibrage automatique des équipes -- si vous essayez d'entasser des bots d'un côté, vous devez d'abord utiliser mp_teams_unbalance_limit 0.
  • Les bots Engineer peuvent complètement ignorer leurs propres constructions jusqu'à ce qu'elles soient détruites.
  • Les bots Heavy essaient parfois de tirer au Minigun alors qu'ils sont à court de munitions, surtout en dessous du niveau Difficile.
  • Les bots Medic de l'équipe perdante se suicident occasionnellement pendant la phase d'Humiliation quand aucun ennemi n'est proche -- quelque chose qu'un joueur humain ne peut pas reproduire même en essayant.
  • Régler votre aperçu d'équipe sur BLU dans l'écran de chargement fait que les bots RED vous semblent visuellement rendus en BLU.
  • Les bots avec une arme de corps à corps sortie refusent parfois de changer d'arme même après avoir ramassé des munitions.
  • Après Jungle Inferno, les bots apparus avec des paramètres explicites (ex. tf_bot_add 5 pyro bleu normal) peuvent mourir instantanément dans leur propre salle d'apparition. Correctif : tf_bot_reevaluate_class_in_spawnroom 0 (nécessite sv_cheats 1).

Noms des IA

Les noms des bots sont tirés d'un grand réservoir de références à TF2, à d'autres jeux Valve et à la culture de programmation, en grande partie parce que la communauté n'arrêtait pas d'en demander des spécifiques sur les forums Steam. Un échantillon de la liste : AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, et des dizaines d'autres dans le même genre.

Il y a aussi un lot de noms trouvés dans un build source fuité qui n'a jamais été expédié en production, pour des raisons peu claires -- principalement des références à Last Dragon et The Fifth Element comme John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh? et I'm your huckleberry.

Vous pouvez remplacer tout cela vous-même : tf_bot_add heavyweapons blue "Blu Hoovy" fait apparaître un Heavy BLU nommé « Blu Hoovy. »


Chapitre II : Les Bots Originaux / TFBots -- Plongée dans les Niveaux de Compétence

Le cadre original de Sigsegv tient toujours : il est évident que les bots Expert surpassent les bots Facile, mais Valve n'a jamais expliqué combien ni pourquoi. Donc la seule façon de savoir est de lire le code. Voici chaque mécanique qui évolue avec la compétence.

Régler la difficulté

En dehors du MvM, la difficulté est contrôlée par une cvar :

tf_bot_difficulty Niveau de difficulté
0 Facile
1 Normal (par défaut)
2 Difficile
3 Expert

tf_bot_add accepte aussi un argument de difficulté directement (easy/normal/hard/expert).

Popfiles MvM

Dans Mann vs. Machine, chaque bloc de spawn TFBot dans le popfile a une clé Skill optionnelle. Pas de clé signifie Facile. Dans les missions de Valve : les Géants sont presque toujours Expert, les Engineers et les Spies sont presque toujours Expert, et les Snipers sont généralement Difficile (occasionnellement Expert). Si vous utilisez EventChangeAttributes (ajouté dans la mise à jour Two Cities) pour modifier dynamiquement les bots en cours de vague en fonction d'événements de carte, la compétence du bot est l'une des propriétés que vous pouvez changer à la volée.

Mode Endless MvM

Le mode Endless n'a jamais été officiellement expédié, mais dedans, les bots dépensent leur argent en améliorations comme les joueurs -- y compris une amélioration exclusive aux bots qui augmente leur niveau de compétence IA en cours de jeu.

L'entité bot_generator

Une entité obscure, largement non documentée, présumée avoir été utilisée dans le mode entraînement et peut-être dans le développement précoce du MvM. Elle expose une entrée SetDifficulty pour contrôler le niveau de compétence. Au-delà, la piste se refroidit -- Valve ne l'a jamais documentée et personne n'a entièrement cartographié son comportement.

Couleur de lueur oculaire

Les robots MvM ont une particule de lueur oculaire qui change de couleur avec le niveau de compétence -- un indicateur visuel que personne en dehors de la communauté n'a jamais expliqué :

Compétence Couleur des yeux RVB
Facile/Normal Bleu #24b4ff
Difficile/Expert Jaune #fff000

Heavy bot TF2 en position d'attente

Vision : temps de reconnaissance

Un bot ne réagit pas instantanément quand quelque chose entre dans son champ de vision -- il y a un délai codé en dur avant que le reste de l'IA soit même autorisé à reconnaître la menace :

Compétence Temps de reconnaissance minimum
Facile 1,00 s
Normal 0,50 s
Difficile 0,30 s
Expert 0,20 s

C'est l'essentiel de l'effet « les bots Faciles ont l'air stupides » en un seul chiffre -- un bot Facile ne vise pas moins bien une fois qu'il vous a remarqué, il met juste cinq fois plus de temps à remarquer votre existence.

Visée : taux de suivi

Les bots ne vous traquent pas en continu. Ils échantillonnent votre position et votre vitesse à un intervalle fixe et prévoient une ligne droite à partir de là :

Compétence Intervalle de recalcul Taux équivalent
Facile 1,00 s 1x/s
Normal 0,25 s 4x/s
Difficile 0,10 s 10x/s
Expert 0,05 s 20x/s

Exception : les bots Spy sont codés en dur avec le taux de suivi Normal quel que soit leur niveau de compétence réel -- un Spy Expert vise toujours comme un bot Normal. Il existe aussi une vidéo de démonstration publique comparant les taux de suivi côte à côte si vous voulez voir l'écart 1x vs 20x en mouvement.

Visée : compétence spécifique aux armes

Les bots ne visent pas juste votre centre de masse -- ils ont une logique par arme, parfois vraiment buguée :

Lance-grenades & Lance-bombes collantes. Tous les niveaux de compétence compensent l'arc vertical, en utilisant une valeur fixe de la cvar tf_bot_ballistic_elevation_rate. Parce que cette compensation ne s'active que pour l'ID d'arme de base, les variantes de projectiles plus rapides (Loch-n-Load, tout ce qui a un modificateur de vitesse de projectile) n'ont pas d'arc correctement ajusté. Et comme c'est lié par l'ID d'arme spécifiquement, le Loose Cannon -- un ID différent -- ne reçoit aucune compensation d'arc.

Huntsman. Les bots Faciles ne compensent pas la chute de la flèche et ne cherchent jamais les headshots. Les bots de niveau Normal compensent l'arc, mais ne visent la tête qu'à moins de 150 HU. Les bots Difficile/Expert visent toujours la tête.

Lance-roquettes. Au-delà de 150 HU, les bots non-Faciles visent vos pieds au lieu du centre de masse, maximisant les chances de dégâts de zone et de repoussement. À moins de 150 HU, ils passent aux headshots. Les bots Faciles visent toujours le centre de masse quelle que soit la distance. C'est aussi verrouillé par ID d'arme : le Direct Hit et le Cow Mangler n'héritent pas de ce comportement. Logique pour le Direct Hit (pas de zone d'effet à exploiter) ; zéro sens pour le Cow Mangler -- cette partie de l'IA prédate l'existence de l'arme et n'a simplement jamais été revue.

Fusils de sniper. Facile vise le corps. Normal vise environ à 33% du corps vers la tête. Difficile/Expert visent directement la tête. Moins important en MvM, où les headshots des bots n'obtiennent pas le bonus de dégâts de toute façon.

Ouïe : sensibilité aux tirs discrets

Chaque coup de feu alerte les bots proches de la position du tireur, même à travers les murs, jusqu'à 3000 HU avec 100% de chance d'être remarqué (tf_bot_notice_gunfire_range). Mais un sous-ensemble d'armes sont marquées « discrètes » -- audibles seulement dans 500 HU (tf_bot_notice_quiet_gunfire_range), et même alors avec une chance dépendante de la compétence :

Compétence Chance de remarquer un tir discret
Facile 10%
Normal 30%
Difficile 60%
Expert 90%

Cette probabilité est divisée par deux si un tir bruyant a été entendu dans les 3 dernières secondes -- les sons forts masquent les sons faibles.

La liste des ID d'armes discrètes n'a pas été mise à jour depuis décembre 2010. Tout ajout ultérieur utilisant un nouvel ID d'arme est traité comme bruyant par défaut, peu importe à quel point il devrait logiquement être discret, sauf s'il réutilise un ID plus ancien. Concrètement :

ID d'arme Couvre
TF_WEAPON_KNIFE Tous les couteaux de Spy
TF_WEAPON_FISTS Coups de poing spécifiques au Heavy (son coup de poing multi-classe est en fait TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Présumé inutilisé directement
TF_WEAPON_PDA_ENGINEER_BUILD PDA de construction de l'Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA de destruction de l'Engineer
TF_WEAPON_PDA_SPY Kit de déguisement du Spy
TF_WEAPON_BUILDER Kit d'outils de Spy/Engineer/Saboteur
TF_WEAPON_MEDIGUN Tous les Medi Guns
TF_WEAPON_DISPENSER Probablement inutilisé (les Dispensers sont des objets, pas des armes)
TF_WEAPON_INVIS Toutes les montres d'invisibilité de Spy
TF_WEAPON_FLAREGUN Tous les pistolets à fusée Pyro sauf le Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (pas Mad Milk -- ID séparé, non-discret)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

L'exemple classique de la liste qui pourrit : le Manmelter a reçu son propre ID (TF_WEAPON_RAYGUN_REVENGE), ajouté après que la liste des armes discrètes ait été gelée -- donc il est traité comme bruyant, malgré être un pistolet à fusée dans tous les sens pratiques. Le Scorch Shot, sorti encore plus tard, réutilise l'ID de base TF_WEAPON_FLAREGUN et est donc toujours considéré comme discret. Insensé, mais c'est le code.

Stratégie : priorisation des menaces

Quand plusieurs ennemis sont visibles à la fois, les bots pondèrent la distance, s'ils se font tirer dessus et -- au-dessus de Facile -- si la menace principale est en train d'être soignée :

Compétence Vise le soigneur à la place ?
Facile Non
Normal 50% de chance
Difficile Oui
Expert Oui

Les ennemis à plus de 500 HU sont normalement dépriorisés comme non-immédiats. Exceptions : les bots Difficile/Expert traitent toujours les Medics et Engineers distants comme des menaces immédiates, et tout Sniper ennemi visant approximativement dans votre direction est toujours traité comme immédiat quelle que soit la distance et la compétence.

Compétence Medics/Engineers distants/Snipers visant = menace immédiate ?
Facile/Normal Non
Difficile/Expert Oui

Cette vérification du Sniper a une histoire vraiment amusante. L'écrit original de Sigsegv supposait que le jeu exigeait que le produit scalaire entre le vecteur de visée du sniper et la position relative du bot soit exactement zéro -- une comparaison si précise qu'elle ne se déclencherait presque jamais en calcul flottant, rendant toute la fonctionnalité effectivement du code mort. Une correction publiée plus tard (crédit à une décompilation Hex-Rays plus propre) a montré que la vérification réelle est produit scalaire > 0 : tout Sniper faisant face de directement vers vous à perpendiculairement à vous est considéré comme une menace immédiate ; tout ce qui va de perpendiculaire à tournant le dos ne l'est pas. La mauvaise lecture originale venait d'une mauvaise décompilation d'une comparaison SSE de flottants -- faire du reverse-engineering sur un binaire AAA n'est pas une science exacte.

Mouvement : esquive

Les bots Faciles n'esquivent jamais, point final. Les bots Normal et supérieurs esquivent à gauche/droite (33% gauche, 33% droite, 33% ne rien faire, pondéré contre les trous détectés) quand ils tiennent une arme de combat, ont vu un ennemi dans les 3 dernières secondes et que cet ennemi a une ligne de vue sur eux.

Ils n'esquiveront pas si l'un de ces cas s'applique : attribut DisableDodge défini, comportement actuel dit de se dépêcher, actuellement invulnérable (n'importe quel uber), en pleine nargue/provocation, joue Engineer, invisible ou déguisé en Spy, en visée comme Sniper ou en rotation comme Heavy, ou en train de bander le Huntsman.

Mouvement : éviter de bousculer les ennemis

Au-dessus de Normal, les bots essaient spécifiquement de ne pas rentrer dans les ennemis en se déplaçant :

Compétence Évite de bousculer les ennemis ?
Facile Non
Normal Non
Difficile Oui
Expert Oui

En pratique, cela n'a d'importance que pour les bots Spy -- éviter une collision gênante avec un joueur ennemi est exactement le genre de chose qui compromet un déguisement.

Pyro : maîtrise de l'airblast

L'airblast sert à deux choses : réfléchir les projectiles (PvP et MvM) et pousser les ennemis proches des rebords (PvP seulement). Que le bot appuie ou non sur la détente face à une opportunité valide est un pile-ou-face basé sur la compétence :

Compétence Chance de déclencher l'airblast
Facile 0%
Normal 50%
Difficile 90%
Expert 100%

Les bots Pyro Faciles ne peuvent littéralement pas faire d'airblast -- le tirage est codé en dur pour ne jamais réussir, pas juste « rarement. »

Spy : efficacité du déguisement

Deux axes distincts évoluent avec la compétence. Choix du déguisement :

Compétence Méthode de déguisement
Facile/Normal Classe aléatoire, ignorant ce que l'équipe ennemie joue réellement
Difficile/Expert Choisit un vrai joueur ennemi et copie sa classe exacte

Comportement en déguisement :

Compétence Comportement en déguisement/invisibilité
Facile/Normal Fixe les joueurs ennemis quand il les voit (suspect)
Difficile/Expert Évite délibérément le contact visuel (plus convaincant)

Spy : agressivité du backstab

À longue portée (jusqu'à 300 HU, tf_bot_spy_knife_range), un bot Spy ne s'engage dans un backstab que s'il peut voir la victime et que le dos de la victime est au moins partiellement tourné. La compétence détermine à quel point cet angle de dos peut être décentré :

Compétence Tolérance d'angle
Facile Tente même si vous lui faites face directement
Normal ±45° de votre dos
Difficile ±78° de votre dos
Expert ±90° de votre dos (arc arrière complet de 180°)

Les bots Spy Faciles sont fonctionnellement suicidaires -- ils tenteront un coup de couteau sur quelqu'un qui les regarde droit dans les yeux. Exception : dans Mann vs. Machine, chaque bot Spy est forcé à la contrainte d'angle Normal quel que soit son niveau de compétence réel.

Tactiques : sélection d'armes

Ne s'active qu'au-dessus de Facile, et surtout sans importance en MvM puisque les bots y ont généralement des restrictions d'armes strictes :

  • Scout : passe à l'arme secondaire quand le chargeur du primaire est vide.
  • Soldier : passe à l'arme secondaire quand le chargeur est vide et la cible a moins de 500 HU.
  • Sniper : passe à l'arme secondaire pour les cibles à moins de 750 HU.
  • Pyro : passe à l'arme secondaire pour les cibles à plus de 750 HU, sauf si cette cible est un Soldier ou un Demoman.

Tactiques : rechargement à couvert

Pas utilisé en MvM. Si le comportement actuel du bot ne lui dit pas de battre en retraite, que son chargeur principal est vide et qu'il n'est pas uberisé, les bots de niveau supérieur se retireront temporairement à couvert pour recharger au lieu de cliquer sur une arme vide face à vous :

Compétence Se retire pour recharger ?
Facile Non
Normal Non
Difficile Oui
Expert Oui

Mode CP : errance du défenseur

Pas utilisé en MvM. En défendant un point de contrôle, les bots de niveau supérieur sont plus susceptibles de quitter le point pour chasser des kills (« search and destroy »), mais seulement avec un temps décent restant sur tf_bot_defense_must_defend_time :

Compétence Chance d'errer
Facile 10%
Normal 50%
Difficile 75%
Expert 90%

Mode CP : blocage de capture

Pas utilisé en MvM. Les bots défenseurs contestant une tentative de capture ennemie :

Compétence Tentera de bloquer la capture ?
Facile Non
Normal 50% de chance
Difficile Oui
Expert Oui

Le tableau récapitulatif complet

Aspect Facile Normal Difficile Expert Notes
Vision : temps de reconnaissance 1,00s 0,50s 0,30s 0,20s
Visée : taux de suivi 1x/s 4x/s 10x/s 20x/s Les Spies utilisent toujours Normal
Compensation d'arc grenade/bombe collante Oui Oui Oui Oui Loose Cannon exempt
Compensation verticale Huntsman Non Oui Oui Oui
Headshots Huntsman Non <150 HU Oui Oui
Tir aux pieds Lance-roquettes Non Oui Oui Oui Direct Hit & Cow Mangler exempts
Point de visée Fusil de sniper Corps ~33% vers tête Tête Tête
Chance de remarquer les tirs discrets 10% 30% 60% 90% Divisée par 2 si masquée par tirs bruyants
Vise le soigneur Non 50% Oui Oui
Medic/Engineer/Sniper distant = menace Non Non Oui Oui
Esquive Non Oui Oui Oui Longue liste d'exceptions
Évite de bousculer les ennemis Non Non Oui Oui Surtout important pour Spy
Chance de déclencher l'airblast 0% 50% 90% 100%
Choix de classe du déguisement Spy Aléatoire Aléatoire Correspond à un vrai ennemi Correspond à un vrai ennemi
Contact visuel Spy en déguisement Fixe (évident) Fixe Évite (convaincant) Évite
Angle de backstab Spy ~0° ±45° ±78° ±90° MvM force Normal
Logique de sélection d'armes Non Oui Oui Oui Moins pertinent en MvM
Rechargement à couvert Non Non Oui Oui Pas en MvM
Errance défenseur CP 10% 50% 75% 90% Pas en MvM
Blocage de capture CP Non 50% Oui Oui Pas en MvM

Conclusion

Heavy bot TF2 visant avec un minigun

Rien de tout cela n'est le fruit d'une erreur de conception de la part de Valve -- c'est un système délibéré, entièrement déterministe, de scores et de probabilités, simplement jamais écrit nulle part officiellement. Quelques points à retenir :

  1. La « compétence » est un ensemble de curseurs indépendants, pas un multiplicateur global. Le temps de réaction, la cadence de visée et chaque comportement tactique évoluent séparément, et certains (taux de suivi Spy, angle de backstab MvM) ont des écrasements codés en dur quel que soit le niveau.
  2. Une partie est vraiment buguée, pas juste vieille. La liste des armes discrètes gelée depuis 2010, le Cow Mangler sans logique de tir aux pieds pour aucune bonne raison, la vérification du produit scalaire du Sniper qui a pris des années pour être correctement décompilée -- le code IA de Valve a des cicatrices comme n'importe quelle base de code de 17 ans.
  3. Vous pouvez utiliser tout cela. Sachez qu'un bot Sniper ne vous headshotera pas en Normal, qu'un Pyro Facile ne peut littéralement pas réfléchir votre roquette, qu'un Spy Facile essaiera de vous poignarder face à face. Ce n'est pas de la chance. C'est une fiche technique.

Un immense merci à sigsegv pour la plongée dans le code original qui a rendu la majeure partie de cela possible, au wiki TF2 pour la documentation de base sur les commandes de bots et le support des cartes, et à tous ceux dans la communauté qui continuent de trifouiller une IA de bot vieille de 17 ans pour comprendre exactement pourquoi elle fait ce qu'elle fait.

TF2 机器人并非随机:我逆向解析了每一个难度设置

视觉、瞄准跟踪、间谍背刺角度、狙击手爆头逻辑、所有已知的 Bug----Valve 从未记录过这些。所以我们翻阅了代码并将其整理成了一份完整的规格说明书。

引言

瞄准火箭发射器的 TF2 士兵机器人

每个 TF2 玩家至少说过一次:"这个机器人作弊了。"或者相反:"为什么这个简单机器人就站在那里吃火箭。"没人真正知道"简单"、"普通"、"困难"和"专家"在底层到底意味着什么----Valve 发布了四个难度标签和零个文档。

所以我们一群人(我、awimii、Mush The Possum,以及完成了大量基础工作的 sigsegv,他实际上去翻阅了反编译的游戏代码)整理了一份关于 TFBot 行为的完整研究文档。每一个机制、每一个已知的 Bug、每一个硬编码的概率。这篇文章是完整版,不是精简版。拿好 Bonk 饮料,这会很长。


第一章:基础

机器人 vs 傀儡机器人

TF2 有两种完全不同但都被称为"机器人"的东西:

  • AI 机器人(TFBots):真正的 AI,基于 Valve 用于《Left 4 Dead》系列的同一 PlayerBot/Infected 框架构建。它们随机选择职业,执行目标,无需 sv_cheats 即可工作,并且像真实玩家一样触发成就。
  • 傀儡机器人:没有 AI,无法自行移动或行动。它们纯粹为了手动控制而存在----玩家可以强制它们跟随、瞄准和开火,主要用于测试或制作电影截图/视频。生成它们需要 sv_cheats 1,这也会在该会话中禁用成就。

本文完全关于第一种。

AI 机器人(大致)可以被告知做什么

TFBots 不能直接控制,但有一小部分事情你可以引导它们去做:

  • 将你的准星对准任何机器人(友方或敌方),如果你使用正确的语音绑定,它会对你做出嘲讽动作。
  • 如果你使用"Medic!"语音命令,友方医疗兵机器人会治疗你。
  • 如果医疗兵机器人正在治疗你并且有 ÜberCharge 准备就绪,说"Go go go!"或"Activate charging!"会让它立即释放充能。
  • 有充能就绪的医疗兵机器人会在它或它的治疗目标受到严重伤害时自动释放充能,无需语音命令。
  • 机器人会自发地与附近的队友进行搭档嘲讽(击掌)或群体嘲讽(康加舞)。

让机器人在不支持的地图上工作

机器人依赖导航网格来知道它们可以走到哪里,大多数社区地图没有附带导航网格。要强制生成:

  1. sv_cheats 1
  2. nav_generate----构建初始导航网格,进度显示在控制台中
  3. 等待游戏完成路径生成
  4. 可选:使用 nav_edit 1 手动修复错误的导航数据
  5. 重新加载或重启服务器(跳过此步骤会禁用成就)
  6. tf_bot_add <数量> 来实际生成机器人

警告: 在机器人活跃于服务器上时更改导航网格可能会导致游戏崩溃。一旦网格存在,你在以后的会话中不需要重新生成它----只需使用 tf_bot_add 重新添加机器人即可。

自动生成的网格在控制点、山丘之王、推车和夺旗模式地图上效果最好。在魔力模式地图上,机器人默认采用夺旗模式的行为方式,但几乎不使用抓钩或强化道具。如果地图没有机器人 AI 能识别的目标,但确实有出生区域实体,设置 tf_bot_offense_must_push_time 0 可以让机器人照常战斗。

(本节来源:TF2 官方 Wiki 的机器人页面。)

当前状态,逐个地图

多亏了 Hatless 更新,现在每个职业都能正常工作,包括历来 Bug 最多的间谍。机器人在大多数官方 KOTH 地图、一些推车地图、Dustbowl/Gorge 攻防战地图以及夺旗/Mann Manor 地图上表现正常----不过在后者中你不能直接用 tf_bot_add 生成它们。在不受支持的地图上(通过上述 nav_generate 流程)它们也能工作,只是模仿真实玩家的效果明显较差。

PLR 地图则是无药可救的:机器人无法清除 Hightower 上的屏障并且会卡在角落里,而在所有其他 PLR 地图上,它们只是……开舞会而不是玩游戏。这也许最终会被修复。也许不会。

机器人一般行为

每个机器人都会做的一系列杂项事情,与技能无关:

  • 机器人只使用默认装备(插件可以强制它们使用非默认武器,但原版机器人从不自己选择)。
  • 简单机器人几乎不使用副武器。更高难度的机器人在主武器弹药耗尽时会立即切换到副武器,或者为了补偿射程而切换。
  • 机器人不会做移动技巧----没有火箭跳,没有建筑搬迁。
  • 击杀后,机器人可能会嘲讽,即使正在被攻击----携带敌方情报时除外,这一条规则也适用于 MvM 模式。
  • 伪装的间谍机器人(玩家或 AI)会被其他机器人正确忽略----直到它们碰到敌人、破坏某物、开枪或在附近隐形。一旦"暴露",该特定机器人/玩家会被记住为间谍,直到它在保持隐形的状态下更换伪装、死亡或用 Dead Ringer 假死。
  • 火焰兵机器人在简单以上难度会大量使用压缩爆。
  • 医疗兵机器人优先治疗除狙击手(以及在较小程度上,工程师)之外的所有人,即使你作为这些职业拼命喊"Medic!"。
  • 医疗兵机器人倾向于靠近机枪手、士兵、爆破手和火焰兵----特别是如果有人类在玩这些职业。如果没有人类扮演这些角色,医疗兵不会特别关注。
  • 机器人在攻防战和推车地图的备战期间会原地待命----但工程师、狙击手和间谍除外,它们可以自由移动(爆破手机器人也允许预先放置粘性炸弹)。
  • 工程师机器人从不升级或解除其他友好工程师建筑上的敌意侵蚀,除非该建筑恰好挡住了它们的路径。它们有时也……就是不去修理自己的炮塔,即使在安全的情况下。
  • 被发现行踪的间谍机器会切换到左轮手枪并后退,而不是强行背刺。
  • 已经定位到步哨枪(通常是通过被它杀死一次)的爆破手机器人可以完美地从步哨枪射程外曲射粘性炸弹,在几何条件允许时绕过墙壁和天花板弧线飞行。
  • 找不到目标的狙击手机器人瞄准后会说出一句"否定"语音台词。
  • 友方医疗兵会毫不犹豫地治疗伪装的间谍。

已知问题 / Bug

文档列出了大量长期存在的怪癖:

  • 机器人可能试图穿过某些静止的道具行走或射击。
  • 每当玩家/机器人解除伪装、伪装或暴露时,附近的机器人会"看到"它并转身做出反应----即使该事件发生在它们实际的视野之外。这不是基于声音的;这是一个视觉检查绕过。
  • 罕见情况下,机器人会在使用工程师传送器时物理卡在一起。
  • 机器人的语音命令(例如"Spy!"、"Forward!")不会像玩家那样以聊天文本显示。
  • 正在积极治疗他人的医疗兵机器人不会躲避来袭火力或拾取血包,即使在血量极低时。
  • 机器人可以在执行搭档嘲讽时继续移动,这破坏了节日暴击的预期效果。
  • 最近受伤的医疗兵机器人在远处通常拒绝使用注射枪,而更喜欢近战武器(或者在极少数情况下,试图直接用医疗枪束打你)。
  • 医疗兵机器人不会补偿注射枪射击的重力下落----可能是因为该武器在 AI 代码中没有被正确标记为非 hitscan 武器。
  • 间谍机器人可以看到和追踪隐形的间谍(玩家或 AI),如果该间谍已经暴露过一次,无论追踪机器人的技能水平如何。
  • 即使玩家间谍伪装成自己队伍的职业,撞到敌人仍然会暴露他们(机器人从不这样对自己,因为机器人从不伪装成自己的队伍)。
  • 机器人遵守队伍自动平衡----如果你试图在一方队伍堆叠机器人,你需要先设置 mp_teams_unbalance_limit 0。
  • 工程师机器人可能完全无视自己的建筑,直到它们被摧毁。
  • 机枪手机器人有时会在弹药极低时试图开火,主要在困难难度以下。
  • 失败一方的医疗兵机器人在羞辱阶段附近没有敌人时偶尔会自杀----这是人类玩家即使试图模仿也无法复制的行为。
  • 将加载界面队伍预览设置为 BLU 会使 RED 机器人在视觉上为你渲染为 BLU。
  • 装备近战武器的机器人有时在拾取弹药后拒绝切换武器。
  • Jungle Inferno 更新后,使用显式参数生成的机器人(例如 tf_bot_add 5 pyro blue normal)可能会在自己的出生室立即死亡。修复:tf_bot_reevaluate_class_in_spawnroom 0(需要 sv_cheats 1)。

AI 名称

机器人名称来自一个庞大的引用池,涉及 TF2、其他 Valve 游戏和编程文化,主要是因为社区一直在 Steam 论坛上要求特定的名称。列表的一部分示例:AimBot、Aperture Science Prototype XR7、Black Mesa、Companion Cube、C++、Divide by Zero、GLaDOS、H@XX0RZ、Saxton Hale、The G-Man、trigger_hurt、0xDEADBEEF,以及几十个类似的名称。

还有一批名称来自一个泄露的源代码构建版本,从未在生产环境中发布,原因不明----主要是《最后的龙》和《第五元素》的引用,如 John Spartan、Leeloo Dallas Multipass、Sho'nuff、Bruce Leroy、Big Gulp Huh? 和 I'm your huckleberry。

你也可以自己覆盖所有这些:tf_bot_add heavyweapons blue "Blu Hoovy" 会生成一个名为"Blu Hoovy"的蓝队机枪手。


第二章:原始机器人 / TFBots----技能深度解析

Sigsegv 的原始框架仍然成立:专家机器人明显比简单机器人强,但 Valve 从未解释过多少或为什么。所以唯一的方法是阅读代码。以下是每个随技能变化的机制。

设置难度

在 MvM 模式之外,难度由一个 cvar 控制:

tf_bot_difficulty 技能等级
0 简单
1 普通(默认)
2 困难
3 专家

tf_bot_add 也直接接受一个难度参数(easy/normal/hard/expert)。

MvM 配置文件

在 Mann vs. Machine 模式中,配置文件中的每个 TFBot 生成器块都有一个可选的 Skill 键。没有键则默认为简单。在 Valve 自己的任务中:巨人几乎总是专家,工程师和间谍几乎总是专家,狙击手通常是困难(偶尔是专家)。如果你使用 EventChangeAttributes(在 Two Cities 更新中添加)来根据地图事件动态变化机器人的属性,机器人技能是你可以在运行中更改的属性之一。

MvM 无尽模式

无尽模式从未正式发布,但在其中,机器人会像玩家一样花钱升级----包括一个机器人专属的升级,可以在游戏中期提升它们的 AI 技能等级。

bot_generator 实体

一个晦涩的、基本没有文档的实体,被认为曾在训练模式中使用过,可能也在早期的 MvM 开发中使用过。它暴露了一个 SetDifficulty 输入来控制技能等级。除此之外,线索就断了----Valve 从未记录过它,也没有人完全弄清其行为。

眼睛发光颜色

MvM 机器人有一个随技能等级变化颜色的眼睛发光粒子----社区以外没有人解释过的视觉提示:

技能 眼睛颜色 RGB
简单/普通 蓝色 #24b4ff
困难/专家 黄色 #fff000

待机姿态的 TF2 机枪手机器人

视觉:识别时间

机器人不会在物体进入其视野的瞬间做出反应----在 AI 被允许确认威胁之前有一个硬编码的延迟:

技能 最小识别时间
简单 1.00 秒
普通 0.50 秒
困难 0.30 秒
专家 0.20 秒

这就是"简单机器人感觉很笨"效果的大部分来源----简单机器人一旦注意到你,瞄准并不差,只是需要五倍的时间才能注意到你的存在。

瞄准:跟踪频率

机器人不会连续跟踪你。它们以一个固定间隔采样你的位置和速度,并从中预测一条直线:

技能 重新计算间隔 等效频率
简单 1.00 秒 1 次/秒
普通 0.25 秒 4 次/秒
困难 0.10 秒 10 次/秒
专家 0.05 秒 20 次/秒

例外: 间谍机器人被硬编码为使用普通跟踪频率,无论其实际技能等级如何----专家间谍仍然像普通机器人一样瞄准。还有一个公开演示视频,并排比较了跟踪频率,如果你想看到 1 倍与 20 倍差距的动态效果。

瞄准:武器专属技能

机器人不只是指向你的身体中心----它们有每把武器的逻辑,有些逻辑真的有问题:

榴弹发射器和粘性发射器。 所有技能等级都会补偿垂直弹道,使用来自 tf_bot_ballistic_elevation_rate cvar 的固定值。因为这种补偿只对基础武器 ID 生效,所以较快的射弹变体(Loch-n-Load,任何带有射弹速度修改器的武器)不会得到正确调整的弹道。而且由于它是按特定武器 ID 触发的,Loose Cannon----一个完全不同的 ID----根本得不到弹道补偿。

猎人弓。 简单机器人不补偿箭矢下坠,也从不瞄准头部。普通技能机器人会补偿弹道,但只在 150 HU 范围内瞄准头部。困难/专家机器人总是瞄准头部。

火箭发射器。 超过 150 HU,非简单机器人会瞄准你的脚而不是身体中心,以最大化溅射伤害和击退几率。在 150 HU 以内,它们切换为瞄准头部。简单机器人总是瞄准身体中心,无论距离如何。这也受武器 ID 锁定:Direct Hit 和 Cow Mangler 不继承这个行为。对 Direct Hit 来说合理(没有 AoE 可利用);对 Cow Mangler 来说完全没有意义----这部分 AI 在该武器存在之前就已编写,之后从未被重新审视过。

狙击步枪。 简单瞄身体。普通大约从身体到头部的三分之一处瞄准。困难/专家直接瞄准头部。这在 MvM 中不那么重要,因为机器人的爆头无论如何都不获得伤害加成。

听觉:对隐秘射击的敏感性

每次枪声都会将射手的位置提示给附近机器人,即使穿墙,范围可达 3000 HU,100% 几率注意到(tf_bot_notice_gunfire_range)。但有一部分武器被标记为"隐秘"----仅在 500 HU 内可闻(tf_bot_notice_quiet_gunfire_range),即使在这个范围内,也有一个随技能变化的几率:

技能 注意到隐秘射击的几率
简单 10%
普通 30%
困难 60%
专家 90%

如果过去 3 秒内听到过响亮的射击声,该概率减半----响亮的声音掩盖了安静的声音。

隐秘武器 ID 列表自 2010 年 12 月以来就没有更新过。此后添加的任何使用全新武器 ID 的武器默认都被视为响亮,无论逻辑上它有多安静----除非它恰好重用了旧的 ID。具体来说:

武器 ID 涵盖范围
TF_WEAPON_KNIFE 所有间谍匕首
TF_WEAPON_FISTS 机枪手专属拳击(他的多职业拳击实际上是 TF_WEAPON_FIREAXE)
TF_WEAPON_PDA 认为未直接使用
TF_WEAPON_PDA_ENGINEER_BUILD 工程师的建筑 PDA
TF_WEAPON_PDA_ENGINEER_DESTROY 工程师的拆除 PDA
TF_WEAPON_PDA_SPY 间谍的伪装工具
TF_WEAPON_BUILDER 间谍的工程师/破坏工具包
TF_WEAPON_MEDIGUN 所有医疗枪
TF_WEAPON_DISPENSER 可能未使用(补给器是物体,不是武器)
TF_WEAPON_INVIS 所有间谍隐形手表
TF_WEAPON_FLAREGUN 所有火焰兵信号枪,除了 Manmelter
TF_WEAPON_LUNCHBOX 三明治、Dalokohs 棒、Buffalo 牛排三明治、Bonk!、Crit-a-Cola
TF_WEAPON_JAR Jarate(不是 Mad Milk----单独的、非隐秘 ID)
TF_WEAPON_COMPOUND_BOW 猎人弓
TF_WEAPON_SWORD Eyelander、Skullcutter、Claidheamh Mòr、Persian Persuader、Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

列表腐烂的经典例子:Manmelter 有自己的 ID(TF_WEAPON_RAYGUN_REVENGE),是在隐秘列表冻结后添加的----所以它被视为响亮,尽管实际上它是一把信号枪。Scorch Shot 发布得更晚,但重用了基础的 TF_WEAPON_FLAREGUN ID,因此仍然被视为隐秘。不合逻辑,但代码就是如此。

策略:威胁优先级

当多个敌人同时可见时,机器人会权衡距离、是否正在被攻击,以及----简单难度以上----主要威胁是否正在被治疗:

技能 转而攻击治疗者?
简单 否
普通 50% 几率
困难 是
专家 是

500 HU 以外的敌人通常被降级为非紧迫威胁。例外:困难/专家机器人始终将远处的医疗兵和工程师视为紧迫威胁,并且任何大致朝你方向瞄准的敌方狙击手始终被视为紧迫威胁,无论距离和技能等级如何。

技能 远处的医疗兵/工程师/正在瞄准的狙击手 = 紧迫威胁?
简单/普通 否
困难/专家 是

那个狙击手检查有一段有趣的历史。Sigsegv 最初的文档假设游戏要求狙击手的瞄准向量与机器人的相对位置之间的点积恰好为零----这个比较精度太高,以至于在浮点数运算中几乎永远不会触发,使整个特性成为死代码。后来发布的更正(归功于更干净的 Hex-Rays 反编译)显示实际检查是 点积 > 0:任何正对着你到你垂直方向之间的狙击手都算作紧迫威胁;从垂直到你背对方向则不算。最初的误读来自于对 SSE 浮点比较的不良反编译----逆向工程一个 AAA 级游戏的二进制文件并非精确科学。

移动:躲避

简单机器人从不躲避,到此为止。普通及以上机器人在持有战斗武器、过去 3 秒内看到过敌人且该敌人对它们有视线时,会左右躲避(33% 向左、33% 向右、33% 不做任何事,根据检测到的空隙加权)。

如果以下任一条件适用,它们将不会躲避:设置了 DisableDodge 属性、当前行为要求加速、当前无敌(任何类型的 über)、正在嘲讽/挑衅、正在玩工程师、隐形或被伪装成间谍、作为狙击手开镜或作为机枪手预热转轮、或正在拉弓准备猎人弓。

移动:避免推挤敌人

普通以上难度,机器人会特意避免在移动时撞到敌人:

技能 避免撞到敌人?
简单 否
普通 否
困难 是
专家 是

实际上这主要对间谍机器人重要----避免与敌方玩家尴尬碰撞正是会暴露伪装的那种事。

火焰兵:压缩爆精通

压缩爆有两个用途:反射射弹(PvP 和 MvM)以及将附近敌人推下悬崖(仅 PvP)。机器人是否会在有效机会时开火是一个基于技能的概率判断:

技能 压缩爆触发几率
简单 0%
普通 50%
困难 90%
专家 100%

简单火焰兵机器人字面上无法使用压缩爆----这个判定被硬编码为永远不会成功,不仅仅是很"罕见"。

间谍:伪装有效性

两个独立的轴随技能变化。伪装的选择:

技能 伪装方法
简单/普通 随机职业,忽略敌方队伍实际正在玩的职业
困难/专家 选择一个真实的敌方玩家并复制其确切职业

伪装的表演:

技能 伪装/隐身时的行为
简单/普通 看到敌方玩家时会盯着他们看(可疑)
困难/专家 故意避免眼神接触(更令人信服)

间谍:背刺攻击倾向

在远距离(最高 300 HU,tf_bot_spy_knife_range),间谍机器人只会在能看到受害者并且受害者的背部至少部分朝向它时才会尝试背刺。技能决定了这个背部角度允许偏离中心的程度:

技能 角度容差
简单 即使正对着它也会尝试
普通 离你背部 ±45°
困难 离你背部 ±78°
专家 离你背部 ±90°(完整后方 180° 弧)

简单间谍机器人实际上是自杀式的----它们会尝试刺杀一个正盯着它们看的人。例外: 在 Mann vs. Machine 模式中,每个间谍机器人无论实际技能如何都被强制使用普通角度限制。

战术:武器选择

仅在简单以上触发,在 MvM 中基本无关紧要,因为那里的机器人通常有严格的武器限制:

  • 侦察兵:主武器弹匣为空时切换到副武器。
  • 士兵:弹匣为空且目标在 500 HU 以内时切换到副武器。
  • 狙击手:目标在 750 HU 以内时切换到副武器。
  • 火焰兵:目标在 750 HU 以外时切换到副武器,除非目标是士兵或爆破手。

战术:掩护换弹

不在 MvM 中使用。如果机器人的当前行为没有指示它撤退、主武器弹匣为空且没有被 über 充能,较高技能的机器人会暂时退到掩护下换弹,而不是对着你空击:

技能 撤退换弹?
简单 否
普通 否
困难 是
专家 是

控制点模式:防守者巡逻

不在 MvM 中使用。在防守控制点时,较高技能的机器人更可能离开控制点去猎杀敌人("搜索并摧毁"),但只有在 tf_bot_defense_must_defend_time 还剩足够多时间时才如此:

技能 巡逻几率
简单 10%
普通 50%
困难 75%
专家 90%

控制点模式:阻挡占领

不在 MvM 中使用。防守机器人争夺敌方占领尝试时的行为:

技能 会尝试阻挡占领吗?
简单 否
普通 50% 几率
困难 是
专家 是

完整总结表

方面 简单 普通 困难 专家 备注
视觉:识别时间 1.00秒 0.50秒 0.30秒 0.20秒
瞄准:跟踪频率 1次/秒 4次/秒 10次/秒 20次/秒 间谍始终使用普通
榴弹/粘性弹道补偿 是 是 是 是 Loose Cannon 除外
猎人弓垂直补偿 否 是 是 是
猎人弓爆头 否 <150 HU 是 是
火箭发射器瞄脚 否 是 是 是 Direct Hit 和 Cow Mangler 除外
狙击步枪瞄准点 身体 ~33% 到头部 头部 头部
注意到隐秘射击的几率 10% 30% 60% 90% 被响亮声音掩盖时减半
攻击治疗者 否 50% 是 是
远处医疗兵/工程师/狙击手 = 威胁 否 否 是 是
躲避 否 是 是 是 有长的例外列表
避免撞到敌人 否 否 是 是 主要对间谍重要
压缩爆触发几率 0% 50% 90% 100%
间谍伪装职业选择 随机 随机 匹配真实敌人 匹配真实敌人
间谍伪装时的眼神接触 盯着看(明显) 盯着看 避免(令人信服) 避免
间谍背刺角度 ~0° ±45° ±78° ±90° MvM 强制使用普通
武器选择逻辑 否 是 是 是 在 MvM 中不太相关
掩护换弹 否 否 是 是 不在 MvM 中
控制点防守者巡逻 10% 50% 75% 90% 不在 MvM 中
控制点阻挡占领 否 50% 是 是 不在 MvM 中

结论

瞄准转轮机枪的 TF2 机枪手机器人

这些都不是 Valve 的猜测错误----这是一个故意的、完全确定性的评分和概率系统,只是从未在任何官方文档中写下来。有几件事值得记住:

  1. "技能"是一组独立的调节旋钮,而非一个全局乘数。反应时间、瞄准频率和每个战术行为都独立地按比例变化,其中一些(间谍跟踪频率、MvM 背刺角度)会无论技能如何都被硬编码覆盖。
  2. 有些问题是真的有 Bug,而不仅仅是老旧。 自 2010 年以来冻结的隐秘武器列表、Cow Mangler 毫无理由地缺少瞄脚逻辑、花了多年才被正确反编译的狙击手点积检查----Valve 的 AI 代码和其他任何一个 17 年历史的代码库一样有伤痕。
  3. 你可以利用所有这些。 知道狙击手机器人在普通难度不会爆你的头、简单火焰兵机器人字面上无法把你的火箭反射回来、简单间谍机器人会尝试当面刺杀你。这不是运气。这是一份规格说明书。

非常感谢 sigsegv 最初的代码挖掘工作,这些工作使得本文的大部分内容成为可能;感谢 TF2 Wiki 提供的关于机器人命令和地图支持的基准文档;以及感谢社区中每一位仍然在探究这个 17 年历史的机器人 AI、试图弄清楚它为什么做它所做的那些事情的成员。

TF2 Botはランダムじゃない:すべての難易度設定をリバースエンジニアリングした

視覚、照準追跡、スパイの背面攻撃角度、スナイパーのヘッドショットロジック、既知のバグ――Valveはそれらを一切ドキュメント化しなかった。そこで我々はコードを調べ、完全な仕様書にまとめた。

はじめに

TF2 Soldier bot aiming a rocket launcher

TF2プレイヤーなら誰でも少なくとも一度は言ったことがある:「このボットはチートだ」。あるいはその逆:「なんでこのEasyボットは立ち尽くしてロケットを食らってるんだ」。誰も「Easy」「Normal」「Hard」「Expert」が実際に何を意味するのか本当のところを知らない――Valveは4つの難易度ラベルとまったくのドキュメントゼロを出荷した。

そこで我々(私、awimii、Mush The Possum、そして大半の下準備を行ったsigsegv――彼は実際に逆コンパイルされたゲームコードを掘り起こした)は、TFBotの行動に関する完全な研究資料をまとめた。すべてのメカニズム、すべての既知のバグ、すべてのハードコードされた確率。この記事はその完全版である。Bonkを手に取れ、長いぞ。


第I章:基本

Bot vs Puppet Bot

TF2には「ボット」と呼ばれるまったく異なる2つのものがある:

  • AIボット(TFBots):本物のAI。ValveがLeft 4 Deadシリーズで使ったのと同じPlayerBot/Infectedフレームワーク上に構築されている。ランダムなクラスを選び、目標をこなし、sv_cheatsなしで動作し、実プレイヤーのように実績をトリガーする。
  • Puppetボット:AIゼロ。自分では動けず行動もできない。手動で操作されるためだけに存在する――プレイヤーはそれらに追従、照準、射撃を強制できる。主にテストやシネマティックなスクリーンショット/動画のために使われる。スポーンにはsv_cheats 1が必要で、セッション中は実績も無効になる。

この記事は完全に前者についてのものである。

AIボットに(ある程度)指示できること

TFBotsは直接制御できないが、ちょっとした働きかけができることがいくつかある:

  • どのボット(味方でも敵でも)に照準を合わせ、正しいボイスバインドを使うと、そのボットはあなたに向かって挑発する。
  • 味方のMedicボットが「Medic!」ボイスコマンドを使うとあなたを回復する。
  • Medicボットがあなたを回復中でÜberChargeの準備ができているときに「Go go go!」または「Activate charging!」と言うと、即座にチャージを発動する。
  • チャージ準備済みのMedicボットは、自分または回復対象が深刻なダメージを受けた瞬間にボイスコマンドなしで自動的にチャージを発動する。
  • ボットは近くのチームメイトと自発的にパータナウント(ハイタッチ)やグループタウント(コンガ)を行う。

非対応マップでボットを動かす

ボットはナビゲーションメッシュに依存してどこを歩けるかを把握しており、ほとんどのコミュニティマップにはそれが付属していない。強制するには:

  1. sv_cheats 1
  2. nav_generate――初期ナビメッシュを生成、進捗はコンソールに表示
  3. ゲームが経路の生成を終えるのを待つ
  4. 必要に応じてnav_edit 1で不良なナビデータを手動修正
  5. サーバーをリロードまたは再起動(これをスキップすると実績が無効に)
  6. tf_bot_add <数>で実際にボットをスポーン

警告: ボットがサーバーでアクティブな状態でナビメッシュを変更するとゲームがクラッシュする可能性がある。メッシュが一度存在すれば、以降のセッションで再生成する必要はない――単にtf_bot_addでボットを追加し直せばよい。

自動生成メッシュはControl Point、King of the Hill、Payload、CTFマップで最もよく機能する。MannpowerマップではボットはデフォルトでCTFスタイルのプレイをするが、グラップルフックやパワーアップはほとんど使わない。ボットAIが認識する目標がなくてもスポーンルームエンティティがあるマップでは、tf_bot_offense_must_push_time 0を設定すればボットはとにかく戦闘を行う。

(このセクションのソース:公式TF2 WikiのBotsページ。)

現在の状況(マップごと)

Hatlessアップデートのおかげで、過去にバグが多かったSpyを含め、すべてのクラスが正しく動作するようになった。ボットはほとんどの公式KOTHマップ、一部のPayloadマップ、Dustbowl/Gorge Attack-Defense、CTF/Mann Manorマップで適切に動作する――ただし後者2つではtf_bot_addで直接スポーンさせることはできない。非対応マップ(上記のnav_generateプロセス経由)でも動作するが、実プレイヤーの模倣精度は著しく低下する。

PLRマップは絶望的だ:Hightowerではボットがバリアをクリアできず角で立ち往生し、他のPLRマップでは…プレイする代わりにダンスパーティーをする。これはいつか修正されるかもしれない。されないかもしれない。

一般的なボットの行動

スキルに関係なくすべてのボットが行う雑多な事柄:

  • ボットはストック装備のみを使用する(プラグインで非ストック武器を強制することは可能だが、バニラボットは自分で選ぶことはない)。
  • Easyボットはセカンダリ武器をほとんど使わない。高難易度ではプライマリが切れた瞬間、または射程を補うためにセカンダリに切り替える。
  • ボットは移動テクニックができない――ロケットジャンプも拠点移動もできない。
  • キル後、ボットは攻撃下でも挑発することがある――ただし敵のインテルを持っている場合は除く。このルールはMvMにも適用される。
  • 偽装中のSpyボット(プレイヤーまたはAI)は他のボットに正しく無視される――敵に接触、サッパー設置、射撃、または近くでクロークするまでは。一度「正体がバレる」と、その特定のボット/プレイヤーはSpyとして記憶され、偽装を変えて透明状態を保つか、死亡するか、Dead Ringerで死を偽装するまで追跡される。
  • PyroボットはEasy以上では圧縮空気を積極的に使う。
  • MedicボットはSniper(そしてやや劣るがEngineer)よりも他の全員の回復を優先する――たとえSniperで「Medic!」を連打しても。
  • MedicボットはHeavy、Soldier、Demoman、Pyroに引き寄せられる――特に人間がそのクラスをプレイしている場合。人間がいなければMedicの特別な注意はない。
  • ボットはAttack/DefenseおよびPayloadマップのセットアップ時間中はその場に留まる――ただしEngineer、Sniper、Spyは自由に動ける(Demomanボットも事前にスティッキーを設置できる)。
  • Engineerボットは他の味方Engineerの建築物をアップグレードしたりサッパーを外したりしない――ただしその建築物がたまたま自分の目標の経路上にある場合は除く。また、安全な状況であっても自分のタレットを修理しないことがある。
  • 発見されたSpyボットはリボルバーに切り替えて後退し、刺しに行こうとはしない。
  • セントリーの位置を特定したDemomanボット(通常一度死んで特定する)は、射程外からスティッキーを完璧に投げ込み、地形が許せば壁や天井を弧状に越えて飛ばすことができる。
  • スコープ中に目標を見つけられなかったSniperボットは「Negative」ボイスラインのいずれかを使う。
  • 味方Medicは偽装したSpyを躊躇なく回復する。

既知の問題 / バグ

この文書は長年にわたる多くの奇妙な挙動を列挙している:

  • ボットは特定の静止プロップを通り抜けようとしたり、越えて射撃しようとすることがある。
  • プレイヤー/ボットが変装を解除、偽装、または正体を明かすたびに、近くのボットはそれが実際の視野外で起こってもそれを「見て」反応する。これは音ベースではなく、視覚チェックのバイパスである。
  • 稀に、ボットがEngineerテレポーター使用中に物理的にくっついて動けなくなることがある。
  • ボットのボイスコマンド(例:「Spy!」、「Forward!」)はプレイヤーのようにチャットテキストとして表示されない。
  • アクティブに回復中のMedicボットは、自分が致命的に低HPでも、飛んでくる攻撃を回避したりヘルスキットを拾ったりしない。
  • ボットはパータナウント中も移動し続けることができ、これによりFestive Critical Strikeの意図した効果が破壊される。
  • 最近ダメージを受けたMedicボットは遠距離でのSyringe Gunの使用を拒否し、近接攻撃を好む(またはごく稀にMedi Gunビーム自体で攻撃しようとする)。
  • MedicボットはSyringe Gunの射撃に重力落下補正をしない――おそらく武器がAIコードで非ヒットスキャンとして正しくフラグ設定されていないためである。
  • Spyボットは、一度正体がバレたクローク中のSpy(プレイヤーまたはAI)を、追跡するボットのスキルレベルに関係なく視認・追跡できる。
  • プレイヤーSpyが自チームのクラスに偽装しても、敵にぶつかると正体がバレる(ボットは自チームに偽装することがないので、ボット同士でこれが起こることはない)。
  • ボットはチームの自動バランスを尊重する――片方のチームにボットを詰め込みたい場合は、まずmp_teams_unbalance_limit 0が必要。
  • Engineerボットは自分の建築物が破壊されるまで完全に無視することがある。
  • Heavyボットは、特にHard未満の難易度で、弾薬が致命的に少ない状態でMinigunを発射しようとすることがある。
  • 敗北チームのMedicボットはHumiliationフェーズ中に敵が近くにいない状態で自殺することがある――人間プレイヤーは意図的にやっても再現できない。
  • ローディング画面のチームプレビューをBLUに設定すると、REDボットが視覚的にBLUとしてレンダリングされる。
  • 近接武器を出したままのボットは、弾薬を拾った後でも武器を切り替えるのを拒否することがある。
  • Jungle Inferno以降、明示的なパラメータ(例:tf_bot_add 5 pyro blue normal)でスポーンされたボットは自分のスポーンルームで即死することがある。修正:tf_bot_reevaluate_class_in_spawnroom 0(sv_cheats 1が必要)。

AIの名前

ボットの名前はTF2、他のValveゲーム、プログラミング文化への参照の大きなプールから引き出されている。これは主にコミュニティがSteamフォーラムで特定の名前をリクエストし続けたためである。リストの一部:AimBot、Aperture Science Prototype XR7、Black Mesa、Companion Cube、C++、Divide by Zero、GLaDOS、H@XX0RZ、Saxton Hale、The G-Man、trigger_hurt、0xDEADBEEF、そして同様のものが数十ある。

また、リークされたソースビルドに含まれていたが本番に出荷されることはなかった名前のバッチもある――理由は不明――主にLast DragonやThe Fifth Elementの参照で、John Spartan、Leeloo Dallas Multipass、Sho'nuff、Bruce Leroy、Big Gulp Huh?、I'm your huckleberryなどである。

自分で上書きすることもできる:tf_bot_add heavyweapons blue "Blu Hoovy"で「Blu Hoovy」という名前のBLU Heavyがスポーンする。


第II章:オリジナルボット / TFBots -- スキルレベルの詳細

Sigsegvの当初の枠組みは今も有効だ:ExpertボットがEasyボットを凌駕するのは明らかだが、Valveはどの程度かなぜかを説明しなかった。だから知る唯一の方法はコードを読むことだ。以下がスキルに応じて変化するすべてのメカニズムである。

難易度の設定

MvM以外では、難易度は1つのcvarで制御される:

tf_bot_difficulty スキルレベル
0 Easy
1 Normal(デフォルト)
2 Hard
3 Expert

tf_bot_addも難易度引数を直接受け付ける(easy/normal/hard/expert)。

MvMポップファイル

Mann vs. Machineでは、ポップファイル内の各TFBotスポーナーブロックにはオプションのSkillキーがある。キーがない場合はEasy。Valve自身のミッションでは:Giantはほぼ常にExpert、EngineerとSpyはほぼ常にExpert、Sniperは通常Hard(たまにExpert)。EventChangeAttributes(Two Citiesアップデートで追加)を使ってマップイベントに基づいてウェーブ途中でボットを動的に変更する場合、ボットのスキルはその場で変更できるプロパティの一つである。

MvMエンドレスモード

エンドレスモードは公式に出荷されることはなかったが、その中ではボットはプレイヤーと同じようにアップグレードにお金を使う――ゲーム途中でAIスキルレベルを引き上げるボット専用アップグレードも含む。

bot_generatorエンティティ

ほとんど文書化されていない obscure なエンティティで、トレーニングモードや初期のMvM開発で使われたと考えられている。スキルレベルを制御するSetDifficulty入力を公開している。それ以外は情報が途絶えている――Valveは決して文書化せず、誰もその動作を完全にマッピングしていない。

目の発光色

MvMロボットはスキルレベルによって色が変わる目の発光パーティクルを持つ――コミュニティ外では誰も説明したことのない視覚的な手がかりである:

スキル 目の色 RGB
Easy/Normal 青 #24b4ff
Hard/Expert 黄 #fff000

TF2 Heavy bot in idle stance

視覚:認識時間

ボットは何かが視野に入った瞬間に反応するわけではない――残りのAIが脅威を認識する前にハードコードされた遅延がある:

スキル 最小認識時間
Easy 1.00 秒
Normal 0.50 秒
Hard 0.30 秒
Expert 0.20 秒

「Easyボットは間抜けに見える」効果の大部分はこのたった1つの数値による――Easyボットは気づいてからの照準が下手なのではなく、あなたの存在に気づくまで5倍の時間がかかるだけなのだ。

照準:追跡レート

ボットはあなたを継続的に追跡しない。固定された間隔であなたの位置と速度をサンプリングし、そこから直線を予測する:

スキル 再計算間隔 相当するレート
Easy 1.00 秒 1回/秒
Normal 0.25 秒 4回/秒
Hard 0.10 秒 10回/秒
Expert 0.05 秒 20回/秒

例外: Spyボットは実際のスキルレベルに関係なくNormalの追跡レートにハードコードされている――Expert SpyでもNormalボットのように照準する。また、1回/秒と20回/秒の差を実際に見ることができる追跡レート比較動画も公開されている。

照準:武器別スキル

ボットは単にあなたの重心を狙うだけではない――武器ごとのロジックがあり、一部は本当にバグっている:

グレネードランチャー&スティッキーランチャー。 すべてのスキルレベルが垂直アークを補正し、tf_bot_ballistic_elevation_rate cvarの固定値を使用する。この補正はベース武器IDに対してのみ発火するため、より速い発射体バリアント(Loch-n-Load、発射体速度修正のあるもの)は正しく調整されたアークを得られない。そして武器IDでキー設定されているため、まったく別のIDであるLoose Cannonはアーク補正をまったく受けられない。

ハンツマン。 Easyボットは矢の落下を補正せず、ヘッドショットを狙うこともない。Normalスキルのボットはアークを補正するが、150 HU以内でのみ頭を狙う。Hard/Expertボットは常に頭を狙う。

ロケットランチャー。 150 HUを超えると、非Easyボットは重心ではなく足元を狙い、スプラッシュダメージとノックバック確率を最大化する。150 HU以内ではヘッドショットに切り替える。Easyボットは距離に関係なく常に重心を狙う。これも武器IDロックされている:Direct HitとCow Manglerはこの挙動を継承しない。Direct Hitは理にかなっている(利用できるAoEがない)。Cow Manglerはまったく意味をなさない――AIのこの部分は武器の存在より前に書かれ、単に見直されることがなかったのだ。

スナイパーライフル。 Easyは体を狙う。Normalは体から頭までの約33%の位置を狙う。Hard/Expertは直接頭を狙う。MvMではあまり重要ではない。ボットのヘッドショットはそもそもダメージボーナスを得られないからだ。

聴覚:隠密射撃への感度

すべての銃声は、壁越しでも、最大3000 HUの範囲内で100%の通知確率(tf_bot_notice_gunfire_range)で近くのボットに射手の位置を知らせる。しかし一部の武器は「ステルス」とフラグ設定されており、500 HU以内(tf_bot_notice_quiet_gunfire_range)でのみ聞こえ、さらにその場合でもスキル依存の確率で通知される:

スキル ステルス射撃に気づく確率
Easy 10%
Normal 30%
Hard 60%
Expert 90%

この確率は、過去3秒以内に大きな銃声が聞こえた場合は半分になる――大きな音は小さな音をマスクする。

ステルス武器IDリストは2010年12月以降更新されていない。それ以降に新しい武器IDで追加されたものは、論理的にはステルスであるべきでも、デフォルトで大きな音として扱われる――古いIDを偶然再利用していなければ。具体的には:

武器ID 対象
TF_WEAPON_KNIFE すべてのSpyナイフ
TF_WEAPON_FISTS Heavy専用パンチ(マルチクラスパンチは実際にはTF_WEAPON_FIREAXE)
TF_WEAPON_PDA 直接使用されていないと考えられる
TF_WEAPON_PDA_ENGINEER_BUILD EngineerのConstruction PDA
TF_WEAPON_PDA_ENGINEER_DESTROY EngineerのDestruction PDA
TF_WEAPON_PDA_SPY Spyの偽装キット
TF_WEAPON_BUILDER SpyのEngineer/Sapperツールキット
TF_WEAPON_MEDIGUN すべてのMedi Gun
TF_WEAPON_DISPENSER おそらく未使用(Dispenserは武器ではなくオブジェクト)
TF_WEAPON_INVIS すべてのSpyクロークウォッチ
TF_WEAPON_FLAREGUN Manmelterを除くすべてのPyroフレアガン
TF_WEAPON_LUNCHBOX サンドイッチ、Dalokohs Bar、Buffalo Steak Sandvich、Bonk!、Crit-a-Cola
TF_WEAPON_JAR Jarate(Mad Milkではない――別の非ステルスID)
TF_WEAPON_COMPOUND_BOW ハンツマン
TF_WEAPON_SWORD Eyelander、Skullcutter、Claidheamh Mòr、Persian Persuader、Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

リストが腐っている典型的な例:Manmelterは独自のID(TF_WEAPON_RAYGUN_REVENGE)を持ち、ステルスリストが凍結された後に追加された――そのため実用的にはすべての点でフレアガンであるにもかかわらず、大きな音として扱われる。さらに後でリリースされたScorch ShotはベースのTF_WEAPON_FLAREGUN IDを再利用しているため、今でもステルスとみなされる。無意味だが、それがコードだ。

戦略:脅威の優先順位付け

複数の敵が同時に見える場合、ボットは距離、自分が攻撃されているかどうか、そしてEasy以上では主要な脅威が回復を受けているかを考慮する:

スキル 代わりにヒーラーを狙うか?
Easy いいえ
Normal 50%の確率
Hard はい
Expert はい

500 HUを超える敵は通常、非即時脅威として優先度が下げられる。例外:Hard/Expertボットは遠距離のMedicとEngineerを常に即時脅威として扱い、あなたの方向を狙っている敵Sniperは距離とスキルに関係なく常に即時脅威として扱われる。

スキル 遠距離のMedic/Engineer/狙っているSniper = 即時脅威?
Easy/Normal いいえ
Hard/Expert はい

そのSniperチェックには実に面白い歴史がある。Sigsegvの当初の解説では、スナイパーの照準ベクトルとボットの相対位置の内積が完全にゼロであることをゲームが要求すると仮定していた――浮動小数点演算ではほぼ決してトリガーしないほど精密な比較で、この機能全体を事実上のデッドコードにしていた。後日発行された訂正(よりクリーンなHex-Rays逆コンパイルによる)では、実際のチェックは内積 > 0であることが示された:あなたの方を直接向いている状態から垂直に向いている状態までのSniperはすべて即時脅威としてカウントされ、垂直から背を向けるまではカウントされない。当初の誤読はSSE浮動小数点比較の悪い逆コンパイルに起因する――AAAバイナリのリバースエンジニアリングは正確な科学ではない。

移動:回避

Easyボットは絶対に回避しない。Normal以上のボットは、戦闘用武器を持ち、過去3秒以内に敵を見ており、その敵が自分に視線を持っている場合、左右に回避する(33%左、33%右、33%何もしない、検出されたギャップに対して重み付け)。以下のいずれかが該当する場合は回避しない:DisableDodge属性が設定されている、現在の行動が急げと指示している、現在無敵(任意のüber)、挑発中、Engineerをプレイ中、Spyとして透明または偽装中、Sniperとしてスコープ中またはHeavyとして回転中、ハンツマン引き絞り中。

移動:敵との衝突回避

Normal以上では、ボットは特に移動中に敵にぶつからないようにする:

スキル 敵との衝突を回避するか?
Easy いいえ
Normal いいえ
Hard はい
Expert はい

実際にはこれはSpyボットにのみ重要である――敵プレイヤーとの気まずい衝突はまさに偽装を台無しにする類のことだからだ。

Pyro:エアブラストの熟練度

エアブラストには2つの目的がある:発射体の反射(PvPとMvM)と近くの敵を崖から突き落とすこと(PvPのみ)。ボットが有効な機会に実際にトリガーを引くかどうかはスキルベースのコインフリップである:

スキル エアブラスト発動確率
Easy 0%
Normal 50%
Hard 90%
Expert 100%

Easy Pyroボットは文字通りエアブラストができない――判定は「めったに成功しない」ではなく、決して成功しないようハードコードされている。

Spy:偽装の効果

2つの独立した軸がスキルに応じて変化する。偽装の選択:

スキル 偽装方法
Easy/Normal 敵チームが実際にプレイしているクラスを無視してランダムなクラス
Hard/Expert 実際の敵プレイヤーを選び、そのクラスを正確にコピー

偽装の演技:

スキル 偽装/クローク中の行動
Easy/Normal 敵プレイヤーを見ると凝視する(不審)
Hard/Expert 意図的にアイコンタクトを避ける(より信憑性が高い)

Spy:背面攻撃の積極性

長距離(最大300 HU、tf_bot_spy_knife_range)では、Spyボットは標的の背中が少なくとも部分的に向いている場合にのみ背面攻撃を仕掛ける。スキルによってその背中角度の許容範囲が決まる:

スキル 角度許容範囲
Easy 正面を向いていても仕掛ける
Normal 背中から±45°
Hard 背中から±78°
Expert 背中から±90°(後方180°全域)

Easy Spyボットは実質的に自殺行為をする――自分をじっと見つめている相手にも刺しに行く。例外: Mann vs. Machineでは、すべてのSpyボットは実際のスキルに関係なくNormalの角度制約に強制される。

戦術:武器選択

Easy以上でのみ機能し、MvMではほとんど無関係――MvMのボットは通常厳しい武器制限があるため:

  • Scout:プライマリのマガジンが空になるとセカンダリに切り替え。
  • Soldier:マガジン空かつ標的が500 HU未満の距離にいる場合にセカンダリに切り替え。
  • Sniper:標的が750 HU未満の距離にいる場合にセカンダリに切り替え。
  • Pyro:標的が750 HUを超える距離にいる場合にセカンダリに切り替え。ただし標的がSoldierまたはDemomanの場合は除く。

戦術:カバーリロード

MvMでは使用されない。ボットの現在の行動が後退を指示しておらず、メインマガジンが空で、über状態でない場合、高スキルのボットは空の銃をクリックし続ける代わりに一時的にカバーに退却してリロードする:

スキル リロードのために退却するか?
Easy いいえ
Normal いいえ
Hard はい
Expert はい

CPモード:防衛側の徘徊

MvMでは使用されない。コントロールポイントを防衛する際、高スキルのボットはキルを探しに行く可能性が高いが、これはtf_bot_defense_must_defend_timeにある程度の時間が残っている場合のみである:

スキル 徘徊確率
Easy 10%
Normal 50%
Hard 75%
Expert 90%

CPモード:キャプチャ阻止

MvMでは使用されない。敵のキャプチャ試行に対抗する防衛ボット:

スキル キャプチャを阻止しようとするか?
Easy いいえ
Normal 50%の確率
Hard はい
Expert はい

完全サマリーテーブル

項目 Easy Normal Hard Expert 備考
視覚:認識時間 1.00秒 0.50秒 0.30秒 0.20秒
照準:追跡レート 1回/秒 4回/秒 10回/秒 20回/秒 Spyは常にNormal
グレネード/スティッキーアーク補正 あり あり あり あり Loose Cannonは除外
ハンツマン垂直補正 なし あり あり あり
ハンツマンヘッドショット なし <150 HU あり あり
ロケットランチャー足元射撃 なし あり あり あり Direct HitとCow Manglerは除外
スナイパーライフル照準点 体 頭まで約33% 頭 頭
ステルス射撃に気づく確率 10% 30% 60% 90% 大きな音にマスクされると半減
ヒーラーを狙う なし 50% あり あり
遠距離Medic/Engineer/Sniper = 脅威 なし なし あり あり
回避 なし あり あり あり 長い例外リスト
敵との衝突回避 なし なし あり あり 主にSpyに関係
エアブラスト発動確率 0% 50% 90% 100%
Spy偽装クラス選択 ランダム ランダム 実際の敵に一致 実際の敵に一致
偽装中のアイコンタクト 凝視(明らか) 凝視 回避(信憑性高い) 回避
Spy背面攻撃角度 ~0° ±45° ±78° ±90° MvMではNormalに強制
武器選択ロジック なし あり あり あり MvMでは関係薄
カバーリロード なし なし あり あり MvMではなし
CP防衛側徘徊 10% 50% 75% 90% MvMではなし
CPキャプチャ阻止 なし 50% あり あり MvMではなし

結論

TF2 Heavy bot aiming a minigun

これらはValve側の推測の誤りではない――意図的で完全に決定論的なスコアリングと確率のシステムであり、ただ公式にどこにも書き留められていなかっただけだ。覚えておく価値のあるいくつかのこと:

  1. 「スキル」は独立したダイヤルの束であって、1つのグローバル倍率ではない。反応時間、照準レート、そしてすべての戦術的行動は別々にスケールし、いくつか(Spy追跡レート、MvM背面攻撃角度)はスキルに関係なくハードコードされた上書きを受ける。
  2. この一部は単に古いだけでなく、本当にバグっている。 2010年から凍結されたステルス武器リスト、理由もなく足元照準ロジックが欠けているCow Mangler、正しく逆コンパイルされるまでに何年もかかったSniper内積チェック――ValveのAIコードには他の17年物コードベースと同様に傷跡がある。
  3. これらすべてを活用できる。 NormalではSniperボットがヘッドショットしてこないこと、Easy Pyroは文字通りあなたのロケットをエアブラストで跳ね返せないこと、Easy Spyは面と向かって刺そうとしてくることを知っている。それは運ではない。仕様書なのだ。

sigsegvには、これのほとんどを可能にしたオリジナルのコードダイビングに、TF2 Wikiにはボットコマンドとマップサポートの基本ドキュメントに、そして17年前のボットAIをいじってその行動の理由を正確に解明しようとしているコミュニティの全員に、多大なる感謝を。

TF2 봇은 무작위가 아닙니다: 모든 난이도 설정을 리버스 엔지니어링했습니다

시야, 조준 추적, 스파이 백스탭 각도, 스나이퍼 헤드샷 로직, 모든 알려진 버그 -- Valve는 이 중 어느 것도 문서화하지 않았습니다. 그래서 우리는 코드를 파헤쳐 전체 사양 시트로 만들었습니다.

서론

TF2 솔져 봇이 로켓 런처를 조준하는 모습

모든 TF2 플레이어는 적어도 한 번쯤 말해봤다: "이 봇 치트 치네." 또는 그 반대: "왜 이 Easy 봇은 가만히 서서 로켓만 맞고 있는 거야." 아무도 "Easy", "Normal", "Hard", "Expert"가 실제로 내부적으로 무슨 의미인지 진짜로 알지 못한다 -- Valve는 난이도 레이블 네 개와 문서 정확히 제로를 제공했다.

그래서 우리 몇 명(나, awimii, Mush The Possum, 그리고 실제로 디컴파일된 게임 코드를 파헤친 sigsegv의 엄청난 기초 작업)이 TFBot 행동에 대한 전체 연구 문서를 만들었다. 모든 메커니즘, 모든 알려진 버그, 모든 하드코딩된 확률. 이 글은 전체 정리본이며, 축약판이 아니다. Bonk를 집어라, 긴 글이다.


제1장: 기본

봇 vs. Puppet 봇

TF2에는 사람들이 "봇"이라고 부르는 완전히 다른 두 가지가 있다:

  • AI 봇 (TFBot): 실제 AI, Valve가 Left 4 Dead 시리즈에 사용한 것과 동일한 PlayerBot/Infected 프레임워크 위에 구축되었다. 무작위 클래스를 선택하고, 목표를 수행하며, sv_cheats 없이 작동하고, 실제 플레이어처럼 업적을 트리거한다.
  • Puppet 봇: AI 제로, 스스로 움직이거나 행동할 수 없다. 순전히 수동 제어를 위해 존재한다 -- 플레이어가 강제로 따라오게 하고, 조준하고, 발사하게 할 수 있으며, 주로 테스트나 시네마틱 스크린샷/영상 제작에 사용된다. 생성하려면 sv_cheats 1이 필요하며, 세션 내내 업적도 비활성화된다.

이 글은 전적으로 첫 번째 종류에 관한 것이다.

AI 봇이 (어느 정도) 하라고 지시받을 수 있는 것

TFBot은 직접 제어할 수 없지만, 봇이 하도록 유도할 수 있는 몇 가지가 있다:

  • 아군이나 적군 봇에 조준선을 맞추고 올바른 음성 명령을 사용하면 봇이 당신에게 도발한다.
  • 아군 메딕 봇은 "Medic!" 음성 명령을 사용하면 당신을 치료한다.
  • 메딕 봇이 당신을 치료 중이고 ÜberCharge가 준비되어 있을 때 "Go go go!" 또는 "Activate charging!"이라고 말하면 즉시 차지를 사용한다.
  • 차지가 준비된 메딕 봇은 자신이나 치료 대상이 심각한 피해를 입는 순간 음성 명령 없이 자동으로 차지를 사용한다.
  • 봇은 가까운 팀원과 파트너 도발(하이파이브)이나 그룹 도발(콩가)을 자발적으로 수행한다.

지원되지 않는 맵에서 봇 작동시키기

봇은 이동 가능한 영역을 알기 위해 내비게이션 메시( NavMesh)에 의존하며, 대부분의 커뮤니티 맵에는 이것이 포함되어 있지 않다. 강제로 생성하려면:

  1. sv_cheats 1
  2. nav_generate -- 초기 내비메시 생성, 진행 상황은 콘솔에 표시됨
  3. 게임이 경로 생성을 완료할 때까지 기다림
  4. 선택적으로 nav_edit 1로 잘못된 내비 데이터를 수동으로 수정
  5. 서버 재로드 또는 재시작 (건너뛰면 업적 비활성화)
  6. tf_bot_add <숫자>로 실제 봇 생성

경고: 봇이 서버에서 활성화된 상태에서 내비메시를 변경하면 게임이 크래시될 수 있다. 메시가 한 번 생성되면 이후 세션에서 다시 생성할 필요가 없다 -- 그냥 tf_bot_add로 봇을 다시 추가하면 된다.

자동 생성된 메시는 Control Point, King of the Hill, Payload, CTF 맵에서 가장 잘 작동한다. Mannpower 맵에서 봇은 기본적으로 CTF 스타일로 플레이하지만 그래플 훅이나 파워업을 거의 사용하지 않는다. 맵에 봇 AI가 인식하는 목표가 없지만 스폰 룸 엔티티가 있는 경우, tf_bot_offense_must_push_time 0을 설정하면 봇이 그래도 전투할 수 있다.

(이 섹션의 출처: 공식 TF2 Wiki의 Bots 페이지.)

현재 상태, 맵별로

Hatless 업데이트 덕분에 역사적으로 버그가 많았던 Spy를 포함한 모든 클래스가 이제 올바르게 작동한다. 봇은 대부분의 공식 KOTH 맵, 일부 Payload 맵, Dustbowl/Gorge Attack-Defense, CTF/Mann Manor 맵에서 정상적으로 행동한다 -- 후자 두 맵에서는 tf_bot_add로 직접 생성할 수는 없지만. 지원되지 않는 맵에서는 (위의 nav_generate 과정을 통해) 작동하지만, 실제 플레이어를 모방하는 데는 눈에 띄게 더 나쁘다.

PLR 맵은 사실상 포기 상태다: 봇은 Hightower의 장벽을 제거할 수 없고 코너에 갇히며, 다른 모든 PLR 맵에서는 그냥... 플레이 대신 댄스 파티를 한다. 언젠가 수정될 수도 있다. 아닐 수도 있다.

일반 봇 행동

스킬과 관계없이 모든 봇이 하는 여러 가지:

  • 봇은 재고 무기만 사용한다 (플러그인으로 비재고 무기를 강제할 수는 있지만, 바닐라 봇은 스스로 선택하지 않는다).
  • Easy 봇은 보조 무기를 거의 사용하지 않는다. 더 높은 난이도에서는 주 무기가 떨어지는 즉시 보조로 전환하거나, 사거리를 보완하기 위해 전환한다.
  • 봇은 이동 기술을 할 수 없다 -- 로켓 점프, 건물 이전 불가.
  • 사살 후, 봇은 심지어 공격을 받는 중에도 도발할 수 있다 -- 적군 정보를 운반 중일 때는 제외하며, 이 규칙은 MvM에서도 적용된다.
  • 위장한 Spy 봇 (플레이어 또는 AI)은 다른 봇에게 올바르게 무시된다 -- 적을 건드리거나, 건물을 사포하거나, 발사하거나, 근처에서 클로킹할 때까지. 일단 발각되면, 해당 특정 봇/플레이어는 위장을 바꾸면서 투명 상태를 유지하거나, 죽거나, Dead Ringer로 죽은 척하기 전까지 Spy로 기억된다.
  • 파이로 봇은 Easy 이상에서 압축 공기를 자유롭게 사용한다.
  • 메딕 봇은 스나이퍼(그리고 덜하지만 엔지니어)보다 모든 사람을 치료하는 것을 우선시한다, 심지어 당신이 스나이퍼로 "Medic!"을 외쳐도 마찬가지다.
  • 메딕 봇은 Heavy, Soldier, Demoman, Pyro 쪽으로 끌린다 -- 특히 인간이 해당 클래스를 플레이 중일 때. 그 역할에 인간이 없으면 메딕의 특별한 관심은 없다.
  • 봇은 Attack/Defense 및 Payload 맵의 준비 시간 동안 위치를 고수한다 -- Engineer, Sniper, Spy는 예외로 자유롭게 이동한다 (Demoman 봇도 스티키를 미리 설치할 수 있다).
  • 엔지니어 봇은 다른 아군 엔지니어의 건물을 업그레이드하거나 디삽하지 않는다, 단 그 건물이 우연히 대상의 경로에 있는 경우는 제외. 또한 가끔은... 안전할 때조차 자신의 센트리를 수리하지 않는다.
  • 발각된 Spy 봇은 리볼버로 전환하고 뒤로 물러나며, 찌르기를 강행하지 않는다.
  • 센트리를 찾은 Demoman 봇은 (보통 한 번 죽어서) 센트리 사거리 밖에서 스티키를 완벽하게 떨어뜨릴 수 있으며, 지형이 허용하면 벽과 천장을 타고 날아간다.
  • 조준 후 대상을 찾을 수 없는 스나이퍼 봇은 "Negative" 음성 대사 중 하나를 사용한다.
  • 아군 메딕은 망설임 없이 위장한 Spy를 치료한다.

알려진 문제 / 버그

문서에는 오랜 기간 지속된 여러 문제가 나열되어 있다:

  • 봇이 특정 고정 소품을 통해 걷거나 발사하려고 시도할 수 있다.
  • 플레이어/봇이 변장 해제, 위장, 또는 발각될 때마다, 주변 봇이 이를 "보고" 반응한다 -- 심지어 실제 시야 밖에서 발생한 경우에도. 소리 기반이 아니며, 시야 검사를 우회하는 것이다.
  • 드물게, 봇이 엔지니어 텔레포터를 사용하는 동안 물리적으로 서로 붙을 수 있다.
  • 봇 음성 명령(예: "Spy!", "Forward!")은 플레이어처럼 채팅 텍스트로 표시되지 않는다.
  • 누군가를 적극적으로 치료 중인 메딕 봇은 HP가 매우 낮아도 들어오는 공격을 회피하거나 체력 키트를 줍지 않는다.
  • 봇은 파트너 도발을 수행하는 동안 계속 움직일 수 있어, Festive Critical Strike의 의도된 효과를 깨뜨린다.
  • 최근 피해를 입은 메딕 봇은 원거리에서 Syringe Gun 사용을 거부하고 근접 무기를 선호한다 (또는 아주 드물게 Medi Gun 빔 자체로 때리려고 시도한다).
  • 메딕 봇은 Syringe Gun 샷의 중력 낙차를 보정하지 않는다 -- 아마도 AI 코드에서 해당 무기가 hitscan이 아닌 것으로 올바르게 플래그되지 않았기 때문이다.
  • Spy 봇은 이미 한 번 정체가 드러난 클로킹된 Spy(플레이어 또는 AI)를 볼 수 있고 추적할 수 있다, 추적 봇의 스킬 레벨과 관계없이.
  • 플레이어-Spy가 자신 팀의 클래스로 위장하더라도, 적과 부딪히면 여전히 발각된다 (봇은 자신 팀으로 위장하지 않으므로 스스로 이렇게 하지 않는다).
  • 봇은 팀 자동 균형을 존중한다 -- 한 팀에 봇을 몰아넣으려면 먼저 mp_teams_unbalance_limit 0이 필요하다.
  • 엔지니어 봇은 건물이 파괴될 때까지 건물을 완전히 무시할 수 있다.
  • Heavy 봇은 탄약이 매우 부족한 상태에서 미니건을 발사하려고 시도하기도 하며, 주로 Hard 미만 난이도에서 발생한다.
  • 패배 팀의 메딕 봇은 Humiliation 단계에서 적이 근처에 없을 때 가끔 자살한다 -- 인간 플레이어는 시도해도 재현할 수 없는 현상이다.
  • 로딩 화면 팀 미리보기를 BLU로 설정하면 RED 봇이 당신에게 BLU로 시각적으로 렌더링된다.
  • 근접 무기를 든 봇은 탄약을 주운 후에도 무기 전환을 거부하는 경우가 있다.
  • Jungle Inferno 이후, 명시적 매개변수로 생성된 봇(예: tf_bot_add 5 pyro blue normal)은 자신의 스폰 룸에서 즉시 죽을 수 있다. 수정: tf_bot_reevaluate_class_in_spawnroom 0 (sv_cheats 1 필요).

AI 이름

봇 이름은 TF2, 다른 Valve 게임, 그리고 프로그래밍 문화에 대한 참조의 큰 풀에서 가져온다, 주로 커뮤니티가 Steam 포럼에서 특정 이름을 계속 요청했기 때문이다. 목록 샘플: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF 등등 수십 개.

또한 유출된 소스 빌드에서 발견되었지만 프로덕션에는 출시되지 않은 이름들도 있다, 명확하지 않은 이유로 -- 주로 Last Dragon과 The Fifth Element 참조인 John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh?, I'm your huckleberry 등이다.

이 모든 것을 직접 재정의할 수 있다: tf_bot_add heavyweapons blue "Blu Hoovy"는 "Blu Hoovy"라는 이름의 BLU Heavy를 생성한다.


제2장: 오리지널 봇 / TFBot -- 스킬 레벨 심층 분석

Sigsegv의 원래 프레이밍은 여전히 유효하다: Expert 봇이 Easy 봇을 압도하는 것은 명백하지만, Valve는 얼마나 또는 왜인지 설명한 적이 없다. 그래서 알 수 있는 유일한 방법은 코드를 읽는 것이다. 여기 스킬에 따라 변하는 모든 메커니즘이 있다.

난이도 설정

MvM 외부에서 난이도는 하나의 cvar로 제어된다:

tf_bot_difficulty 스킬 레벨
0 Easy
1 Normal (기본값)
2 Hard
3 Expert

tf_bot_add는 난이도 인수를 직접 받을 수도 있다 (easy/normal/hard/expert).

MvM 팝파일

Mann vs. Machine에서 팝파일의 각 TFBot 스포너 블록에는 선택적 Skill 키가 있다. 키가 없으면 Easy다. Valve의 자체 미션에서: Giant는 거의 항상 Expert, Engineer와 Spy는 거의 항상 Expert, Sniper는 보통 Hard (가끔 Expert)다. Two Cities 업데이트에서 추가된 EventChangeAttributes를 사용하여 맵 이벤트에 따라 웨이브 중간에 봇을 동적으로 변경하는 경우, 봇 스킬은 즉석에서 변경할 수 있는 속성 중 하나다.

MvM 엔드리스 모드

엔드리스 모드는 공식적으로 출시된 적이 없지만, 이 모드에서 봇은 플레이어처럼 업그레이드에 돈을 사용한다 -- 게임 도중 AI 스킬 레벨을 높이는 봇 전용 업그레이드도 포함된다.

bot_generator 엔티티

트레이닝 모드와 아마도 초기 MvM 개발에 사용된 것으로 여겨지는, 잘 알려지지 않고 거의 문서화되지 않은 엔티티다. 스킬 레벨을 제어하는 SetDifficulty 입력을 노출한다. 그 이상으로는 행방이 묘연하다 -- Valve는 이를 문서화한 적이 없고 아무도 그 행동을 완전히 매핑하지 못했다.

눈 발광 색상

MvM 로봇은 스킬 레벨에 따라 색상이 변하는 눈 발광 파티클 효과가 있다 -- 커뮤니티 외부에서는 아무도 설명한 적 없는 시각적 단서다:

스킬 눈 색상 RGB
Easy/Normal 파랑 #24b4ff
Hard/Expert 노랑 #fff000

TF2 Heavy 봇이 대기 자세를 취하고 있음

시야: 인식 시간

봇은 무언가가 시야에 들어오는 즉시 반응하지 않는다 -- 나머지 AI가 위협을 인지하기 전에 하드코딩된 지연이 있다:

스킬 최소 인식 시간
Easy 1.00초
Normal 0.50초
Hard 0.30초
Expert 0.20초

이것이 "Easy 봇은 멍청해 보인다"는 느낌의 대부분을 단일 숫자로 설명한다 -- Easy 봇은 당신을 알아차리면 조준이 나쁜 것이 아니라, 당신의 존재를 인지하는 데 5배 더 오래 걸린다.

조준: 추적 속도

봇은 당신을 연속적으로 추적하지 않는다. 고정된 간격으로 당신의 위치와 속도를 샘플링하고 그로부터 직선을 예측한다:

스킬 재계산 간격 등가 속도
Easy 1.00초 1회/초
Normal 0.25초 4회/초
Hard 0.10초 10회/초
Expert 0.05초 20회/초

예외: Spy 봇은 실제 스킬 레벨과 관계없이 Normal 추적 속도로 하드코딩되어 있다 -- Expert Spy는 여전히 Normal 봇처럼 조준한다. 또한 실제 추적 속도를 나란히 비교하는 공개 데모 영상도 있다, 1회 대 20회의 차이를 직접 보고 싶다면.

조준: 무기별 스킬

봇은 단순히 당신의 중심을 겨누지 않는다 -- 무기별 로직이 있으며, 일부는 진짜 버그가 있다:

Grenade Launcher & Sticky Launcher. 모든 스킬 레벨이 수직 포물선을 보정하며, tf_bot_ballistic_elevation_rate cvar의 고정 값을 사용한다. 이 보정이 기본 무기 ID에 대해서만 발동하기 때문에, 더 빠른 투사체 변형(Loch-n-Load, 투사체 속도 수정자가 있는 모든 것)은 올바르게 조정된 포물선을 얻지 못한다. 그리고 무기 ID에 키가 지정되어 있기 때문에, 완전히 다른 ID인 Loose Cannon은 포물선 보정을 전혀 받지 못한다.

Huntsman. Easy 봇은 화살 낙차를 보정하지 않으며 헤드샷을 시도하지 않는다. Normal 스킬 봇은 포물선을 보정하지만 150 HU 이내에서만 헤드를 조준한다. Hard/Expert 봇은 항상 헤드를 조준한다.

Rocket Launcher. 150 HU 이상에서, Easy가 아닌 봇은 중심 대신 발을 조준하여 스플래시 데미지와 넉백 확률을 극대화한다. 150 HU 이내에서는 헤드샷으로 전환한다. Easy 봇은 사거리에 관계없이 항상 중심을 조준한다. 이것도 무기 ID에 잠겨 있다: Direct Hit와 Cow Mangler는 이 행동을 상속받지 않는다. Direct Hit는 이해가 간다 (활용할 AoE가 없음); Cow Mangler는 전혀 말이 안 된다 -- AI의 이 부분은 무기의 존재보다 앞서며 단순히 재방문된 적이 없다.

Sniper Rifle. Easy는 몸통을 조준한다. Normal은 몸통에서 헤드까지 약 33% 지점을 조준한다. Hard/Expert는 헤드를 직접 조준한다. MvM에서는 덜 중요하다, 봇 헤드샷이 어차피 데미지 보너스를 받지 못하기 때문이다.

청각: 은밀한 사격에 대한 민감도

모든 총격은 근처 봇에게 사수의 위치를 알리며, 벽을 통해서도 최대 3000 HU까지 100% 인지 확률로 전달된다 (tf_bot_notice_gunfire_range). 하지만 일부 무기는 "은밀"로 플래그되어 있다 -- 500 HU 이내에서만 들리며 (tf_bot_notice_quiet_gunfire_range), 그마저도 스킬에 의존하는 확률로 인지한다:

스킬 은밀 사격 인지 확률
Easy 10%
Normal 30%
Hard 60%
Expert 90%

이 확률은 지난 3초 동안 큰 사격이 들렸으면 절반으로 감소한다 -- 큰 소리가 작은 소리를 가린다.

은밀 무기 ID 목록은 2010년 12월 이후로 업데이트되지 않았다. 그 날짜 이후에 완전히 새로운 무기 ID로 추가된 모든 것은, 논리적으로 아무리 조용해야 하더라도 기본적으로 시끄러운 것으로 처리된다. 단, 우연히 이전 ID를 재사용한 경우는 예외다. 구체적으로:

무기 ID 대상
TF_WEAPON_KNIFE 모든 Spy 나이프
TF_WEAPON_FISTS Heavy 전용 주먹 (멀티클래스 주먹은 실제로 TF_WEAPON_FIREAXE)
TF_WEAPON_PDA 직접 사용되지 않는 것으로 추정
TF_WEAPON_PDA_ENGINEER_BUILD 엔지니어의 건설 PDA
TF_WEAPON_PDA_ENGINEER_DESTROY 엔지니어의 파괴 PDA
TF_WEAPON_PDA_SPY Spy의 위장 키트
TF_WEAPON_BUILDER Spy의 엔지니어/사퍼 도구 키트
TF_WEAPON_MEDIGUN 모든 Medi Gun
TF_WEAPON_DISPENSER 사용되지 않는 것으로 추정 (디스펜서는 무기가 아닌 오브젝트)
TF_WEAPON_INVIS 모든 Spy 클로크 시계
TF_WEAPON_FLAREGUN Manmelter를 제외한 모든 파이로 플레어 건
TF_WEAPON_LUNCHBOX Sandvich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (Mad Milk 아님 -- 별도의 비은밀 ID)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

목록이 썩었다는 전형적인 예: Manmelter는 고유 ID(TF_WEAPON_RAYGUN_REVENGE)를 받았으며, 은밀 목록이 동결된 후에 추가되었다 -- 따라서 모든 실용적 의미에서 플레어 건임에도 불구하고 시끄러운 것으로 처리된다. 더 늦게 출시된 Scorch Shot은 기본 TF_WEAPON_FLAREGUN ID를 재사용하므로 계속 은밀로 간주된다. 말도 안 되지만, 그게 코드다.

전략: 위협 우선순위

여러 적이 동시에 보일 때, 봇은 거리, 자신이 공격받고 있는지, 그리고 Easy 이상에서는 주요 위협이 치료받고 있는지를 고려한다:

스킬 힐러를 대신 조준?
Easy 아니오
Normal 50% 확률
Hard 예
Expert 예

500 HU 이상의 적은 일반적으로 비긴급으로 우선순위가 낮아진다. 예외: Hard/Expert 봇은 항상 멀리 있는 Medic과 Engineer를 즉시 위협으로 간주하며, 당신 쪽을 조준하는 적 Sniper는 거리와 스킬에 관계없이 항상 즉시 위협으로 간주된다.

스킬 먼 Medic/Engineer/조준 중인 Sniper = 즉시 위협?
Easy/Normal 아니오
Hard/Expert 예

그 Sniper 검사에는 정말 재미있는 역사가 있다. Sigsegv의 원래 글은 게임이 스나이퍼의 조준 벡터와 봇의 상대적 위치 사이의 내적이 정확히 0이어야 한다고 가정했다 -- 부동 소수점 연산에서 거의 절대 트리거되지 않을 정도로 정밀한 비교여서, 전체 기능이 사실상 죽은 코드였다. 나중에 수정된 내용(더 깨끗한 Hex-Rays 디컴파일 덕분에)은 실제 검사가 내적 > 0임을 보여주었다: 당신을 직접 향하는 것부터 수직인 것까지 모든 방향을 향한 Sniper는 즉시 위협으로 간주되며, 수직부터 반대 방향은 그렇지 않다. 원래 오독은 SSE 부동 소수점 비교의 잘못된 디컴파일에서 비롯되었다 -- AAA 바이너리를 리버스 엔지니어링하는 것은 정확한 과학이 아니다.

이동: 회피

Easy 봇은 절대 회피하지 않는다, 완전히. Normal 이상의 봇은 전투 무기를 들고 있고, 지난 3초 동안 적을 보았으며, 그 적이 자신을 볼 수 있을 때 좌/우로 회피한다 (33% 왼쪽, 33% 오른쪽, 33% 아무것도 안 함, 감지된 갭에 대해 가중치 적용).

다음 중 하나라도 해당되면 회피하지 않는다: DisableDodge 속성 설정, 현재 행동이 서두르라고 지시함, 현재 무적(모든 종류의 über), 도발/선동 중, Engineer 플레이 중, Spy로 투명/위장 중, Sniper로 조준 중 또는 Heavy로 미니건 회전 중, Huntsman 장전 중.

이동: 적과의 충돌 회피

Normal 이상에서, 봇은 이동 중에 적과 부딪히지 않으려고 특별히 노력한다:

스킬 적과 충돌 회피?
Easy 아니오
Normal 아니오
Hard 예
Expert 예

실제로는 Spy 봇에게만 중요하다 -- 적 플레이어와의 어색한 충돌은 위장을 망치는 정확한 종류의 상황이다.

파이로: 에어블래스트 숙련도

에어블래스트는 두 가지 목적을 가진다: 투사체 반사(PvP 및 MvM)와 근처 적을 절벽에서 밀어내기(PvP 전용). 봇이 유효한 기회에 실제로 방아쇠를 당길지는 스킬 기반의 동전 던지기에 달려 있다:

스킬 에어블래스트 발동 확률
Easy 0%
Normal 50%
Hard 90%
Expert 100%

Easy 파이로 봇은 문자 그대로 에어블래스트를 할 수 없다 -- 난수가 성공하지 못하도록 하드코딩되어 있으며, 단순히 "드물게"가 아니다.

Spy: 위장 효과

두 가지 별개 축이 스킬에 따라 확장된다. 위장 선택:

스킬 위장 방법
Easy/Normal 적 팀이 실제로 플레이 중인 것을 무시하고 무작위 클래스
Hard/Expert 실제 적 플레이어를 선택하여 정확한 클래스를 복사

위장 연기:

스킬 위장/클로킹 중 행동
Easy/Normal 적 플레이어를 보면 쳐다봄 (의심스러움)
Hard/Expert 의도적으로 눈 맞춤을 피함 (더 설득력 있음)

Spy: 백스탭 공격성

장거리(최대 300 HU, tf_bot_spy_knife_range)에서 Spy 봇은 희생자를 볼 수 있고 희생자의 등이 적어도 부분적으로 보일 때만 백스탭을 시도한다. 스킬은 등 각도가 얼마나 중심에서 벗어날 수 있는지를 결정한다:

스킬 각도 허용 오차
Easy 당신이 정면을 봐도 시도함
Normal 등에서 ±45°
Hard 등에서 ±78°
Expert 등에서 ±90° (완전 후방 180° 범위)

Easy Spy 봇은 기능적으로 자살 돌격이다 -- 정면으로 자신을 바라보는 상대에게도 찌르기를 시도한다. 예외: Mann vs. Machine에서 모든 Spy 봇은 실제 스킬과 관계없이 Normal 각도 제약으로 강제된다.

전술: 무기 선택

Easy 이상에서만 발동하며, MvM에서는 대부분 관련이 없다 -- 그곳의 봇은 보통 엄격한 무기 제한이 있기 때문이다:

  • Scout: 주 무기 탄창이 비면 보조 무기로 전환.
  • Soldier: 탄창이 비고 그리고 대상이 500 HU 이내면 보조 무기로 전환.
  • Sniper: 대상이 750 HU 이내면 보조 무기로 전환.
  • Pyro: 대상이 750 HU 이상이면 보조 무기로 전환, 단 그 대상이 Soldier나 Demoman인 경우는 제외.

전술: 엄폐 재장전

MvM에서 사용되지 않음. 봇의 현재 행동이 후퇴를 지시하지 않고, 주 탄창이 비었으며, uber 상태가 아닐 때, 더 높은 스킬의 봇은 빈 총을 당신에게 겨누는 대신 일시적으로 엄폐 후퇴하여 재장전한다:

스킬 재장전을 위해 후퇴?
Easy 아니오
Normal 아니오
Hard 예
Expert 예

CP 모드: 수비수 배회

MvM에서 사용되지 않음. 컨트롤 포인트를 방어할 때, 더 높은 스킬의 봇은 포인트를 떠나 킬을 찾을 가능성이 더 높다("수색 및 파괴"), 하지만 tf_bot_defense_must_defend_time에 충분한 시간이 남아 있을 때만:

스킬 배회 확률
Easy 10%
Normal 50%
Hard 75%
Expert 90%

CP 모드: 캡처 차단

MvM에서 사용되지 않음. 적의 캡처 시도에 대항하는 방어 봇:

스킬 캡처 차단 시도?
Easy 아니오
Normal 50% 확률
Hard 예
Expert 예

전체 요약 표

측면 Easy Normal Hard Expert 비고
시야: 인식 시간 1.00초 0.50초 0.30초 0.20초
조준: 추적 속도 1회/초 4회/초 10회/초 20회/초 Spy는 항상 Normal 사용
수류탄/스티키 포물선 보정 예 예 예 예 Loose Cannon 제외
Huntsman 수직 보정 아니오 예 예 예
Huntsman 헤드샷 아니오 <150 HU 예 예
로켓 발사기 발 조준 아니오 예 예 예 Direct Hit & Cow Mangler 제외
스나이퍼 라이플 조준점 몸통 ~33% 헤드 헤드 헤드
은밀 사격 인지 확률 10% 30% 60% 90% 큰 사격에 가려지면 절반
힐러 조준 아니오 50% 예 예
먼 Medic/Engineer/Sniper = 위협 아니오 아니오 예 예
회피 아니오 예 예 예 긴 예외 목록
적과 충돌 회피 아니오 아니오 예 예 주로 Spy에게 중요
에어블래스트 발동 확률 0% 50% 90% 100%
Spy 위장 클래스 선택 무작위 무작위 실제 적 일치 실제 적 일치
Spy 위장 중 시선 쳐다봄 (의심) 쳐다봄 회피 (설득력) 회피
Spy 백스탭 각도 ~0° ±45° ±78° ±90° MvM에서는 Normal 강제
무기 선택 로직 아니오 예 예 예 MvM에서는 덜 관련 있음
엄폐 재장전 아니오 아니오 예 예 MvM에서는 아님
CP 수비수 배회 10% 50% 75% 90% MvM에서는 아님
CP 캡처 차단 아니오 50% 예 예 MvM에서는 아님

결론

TF2 Heavy 봇이 미니건을 조준하는 모습

이 중 어느 것도 Valve 측의 잘못된 추측이 아니다 -- 완전히 의도적이고 완전히 결정론적인 점수 및 확률 시스템이며, 단지 공식적으로 어디에도 기록되지 않았을 뿐이다. 기억할 만한 몇 가지:

  1. "스킬"은 독립적인 다이얼의 묶음이지, 하나의 글로벌 배율이 아니다. 반응 시간, 조준 속도, 모든 전술적 행동이 개별적으로 확장되며, 일부(Spy 추적 속도, MvM 백스탭 각도)는 스킬과 관계없이 하드코딩된 재정의를 받는다.
  2. 이 중 일부는 단순히 오래된 것이 아니라 진짜 버그다. 2010년부터 동결된 은밀 무기 목록, 아무런 이유 없이 발 조준 로직이 누락된 Cow Mangler, 올바르게 디컴파일하는 데 수년이 걸린 Sniper 내적 검사 -- Valve의 AI 코드는 다른 17년 된 코드베이스처럼 흉터 조직을 가지고 있다.
  3. 이 모든 것을 활용할 수 있다. Normal에서 스나이퍼 봇이 당신을 헤드샷하지 않을 것이고, Easy 파이로가 당신의 로켓을 문자 그대로 에어블래스트할 수 없으며, Easy Spy가 정면에서 당신을 찌르려고 시도할 것임을 알라. 운이 아니다. 사양 시트다.

원래 코드 다이빙으로 이 모든 것을 가능하게 한 sigsegv, 봇 명령어와 맵 지원에 대한 기본 문서를 제공한 TF2 Wiki, 그리고 17년 된 봇 AI를 계속 파헤쳐 정확히 왜 그렇게 행동하는지 알아내려는 커뮤니티의 모든 사람에게 큰 감사를 전한다.

TF2 Botları Rastgele Değil: Her Zorluk Ayarını Tersine Mühendislikle Çözdüm

Görüş, nişan alma takibi, casus bıçaklama açıları, nişancı kafa vuruşu mantığı, bilinen her hata -- Valve bunların hiçbirini belgelemedi. Biz de kodu inceledik ve tam bir teknik şartname haline getirdik.

Giriş

TF2 Soldier bot roketatarla nişan alıyor

Her TF2 oyuncusu en az bir kez şöyle demiştir: "bu bot hile yapıyor." Ya da tam tersi: "neden bu Kolay bot öylece durup roket yiyor?" Kimse "Kolay," "Normal," "Zor" ve "Uzman" seviyelerinin perde arkasında gerçekte ne anlama geldiğini bilmiyor -- Valve dört zorluk etiketi ve sıfır dokümantasyon yayınladı.

Biz de bir grup insan (ben, awimii, Mush The Possum ve temel çalışmaların büyük kısmını yapan, derlenmiş oyun kodunu didik didik eden sigsegv) TFBot davranışları hakkında kapsamlı bir araştırma belgesi hazırladık. Her mekanik, bilinen her hata, sabit kodlanmış her olasılık. Bu makale tam yazı, kısaltılmışı değil. Bir Bonk alın, uzun bir yazı olacak.


Bölüm I: Temel Bilgiler

Bot vs Kukla Bot

TF2'de insanların "bot" dediği iki tamamen farklı şey vardır:

  • Yapay zeka botları (TFBot'lar): gerçek yapay zeka, Valve'ın Left 4 Dead serisinde kullandığı PlayerBot/Infected altyapısı üzerine inşa edilmiştir. Rastgele bir sınıf seçerler, hedefe yönelik oynarlar, sv_cheats olmadan çalışırlar ve gerçek bir oyuncu gibi başarımları tetiklerler.
  • Kukla botlar: sıfır yapay zeka, kendi başlarına hareket edemez veya iş yapamazlar. Tamamen manuel kontrol için vardırlar -- bir oyuncu onları takip etmeye, nişan almaya ve ateş etmeye zorlayabilir, çoğunlukla test etmek veya sinematik ekran görüntüleri/videoları çekmek için kullanılır. Onları oluşturmak sv_cheats 1 gerektirir ve bu da oturum boyunca başarımları devre dışı bırakır.

Bu makale tamamen birinci tür hakkındadır.

Yapay zeka botlarına (bir şekilde) ne yaptırılabilir?

TFBot'lar doğrudan kontrol edilemez, ancak onları yönlendirebileceğiniz kısa bir liste vardır:

  • Nişangahınızı herhangi bir bota (dost veya düşman) doğrultun ve doğru ses komutlarını kullanırsanız size karşılık verir.
  • Dost bir Medic botu, "Medic!" ses komutunu kullanırsanız sizi iyileştirir.
  • Bir Medic botu sizi iyileştiriyorsa ve ÜberCharge'ı hazırsa, "Go go go!" veya "Activate charging!" demek şarjı anında kullanmasını sağlar.
  • Şarjı hazır olan bir Medic botu, kendisi veya iyileştirdiği hedef ciddi hasar aldığında, ses komutuna gerek kalmadan otomatik olarak şarjı patlatır.
  • Botlar, yakındaki takım arkadaşlarıyla kendiliğinden partner taklitleri (High Five) veya grup taklitleri (Conga) yaparlar.

Desteklenmeyen haritalarda botları çalıştırma

Botlar, nerede yürüyebileceklerini bilmek için bir navigasyon ağına ihtiyaç duyar ve çoğu topluluk haritası bununla birlikte gelmez. Zorlamak için:

  1. sv_cheats 1
  2. nav_generate -- ilk navmesh'i oluşturur, ilerleme konsolda gösterilir
  3. Oyunun yolları oluşturmayı bitirmesini bekleyin
  4. İsteğe bağlı olarak nav_edit 1 ile hatalı nav verilerini manuel olarak düzeltin
  5. Sunucuyu yeniden yükleyin veya yeniden başlatın (bunu atlamak başarımları devre dışı bırakır)
  6. Botları oluşturmak için tf_bot_add <sayı>

Uyarı: botlar sunucuda aktifken navmesh'i değiştirmek oyunu çökertebilir. Mesh bir kere oluştuktan sonra gelecekteki oturumlar için yeniden oluşturmanız gerekmez -- sadece tf_bot_add ile botları tekrar ekleyin.

Otomatik oluşturulan mesh'ler en iyi Kontrol Noktası, Tepenin Kralı, Payload ve CTF haritalarında çalışır. Mannpower haritalarında botlar varsayılan olarak CTF tarzı oynar ancak kanca veya güçlendirmeleri pek kullanmazlar. Bir haritanın bot yapay zekasının tanıdığı bir hedefi yoksa ancak bir doğum odası varlığı varsa, tf_bot_offense_must_push_time 0 ayarını yapmak botların yine de savaşmasını sağlar.

(Bu bölümün kaynağı: resmi TF2 Wiki'nin Botlar sayfası.)

Güncel durum, harita harita

Hatless güncellemesi sayesinde, tarihsel olarak hatalı Casus da dahil olmak üzere her sınıf artık doğru çalışıyor. Botlar çoğu resmi KOTH haritasında, bazı Payload haritalarında, Dustbowl/Gorge Attack-Defense haritalarında ve CTF/Mann Manor haritalarında düzgün davranıyor -- ancak son ikisinde onları doğrudan tf_bot_add ile oluşturamazsınız. Desteklenmeyen haritalarda (yukarıdaki nav_generate süreciyle) çalışıyorlar, ancak gerçek bir oyuncuyu taklit etmede belirgin şekilde daha kötüler.

PLR haritaları kayıp bir dava: botlar Hightower'daki bariyerleri temizleyemiyor ve köşelere sıkışıyor, diğer tüm PLR haritalarında ise oyun oynamak yerine... dans partisi yapıyorlar. Bu bir gün düzeltilebilir. Düzeltilmeyebilir de.

Genel bot davranışı

Zorluktan bağımsız olarak her botun yaptığı şeyler:

  • Botlar yalnızca stok yüklemeleri kullanır (bir eklenti stok olmayan silahları zorlayabilir, ancak çıplak botlar kendi silahlarını asla seçmez).
  • Kolay botlar ikincil silahlarına neredeyse hiç dokunmaz. Yüksek zorluklar, ana silahları biter bitmez veya menzili telafi etmek için ikincile geçer.
  • Botlar hareket teknikleri yapamaz -- roket zıplaması, bina taşıma gibi şeyler yok.
  • Bir öldürmeden sonra, bir bot ateş altındayken bile taklit yapabilir -- düşman istihbaratını taşırken hariç, bu kural MvM'de de geçerlidir.
  • Gizlenmiş Casus botları (oyuncu veya yapay zeka), bir düşmana dokunana, bir şeyi sabote edene, ateş edene veya yakınlarında görünmez olana kadar diğer botlar tarafından doğru şekilde yok sayılır. "Açığa çıktıktan" sonra, o belirli bot/oyuncu, görünmez kalırken kılık değiştirene, ölene veya Dead Ringer ile ölüm taklidi yapana kadar Casus olarak hatırlanır.
  • Pyro botları, Kolay'ın üzerindeki her zorlukta Sıkıştırma Patlaması'nı cömertçe kullanır.
  • Medic botları, "Medic!" diye ne kadar spam yaparsanız yapın, herkesi iyileştirmeyi Nişancılara (ve daha az ölçüde Mühendislere) tercih eder.
  • Medic botları, Ağır Sıkletler, Askerler, Bombacılar ve Pyrolara yönelir -- özellikle de bir insan bu sınıfları oynuyorsa. Bu rollerde insan yoksa, Medic'in özel bir ilgisi olmaz.
  • Botlar, Saldırı/Savunma ve Payload haritalarında hazırlık süresi boyunca pozisyon korur -- Mühendisler, Nişancılar ve Casuslar hariç, onlar serbestçe hareket eder (Bombacı botlarının da önceden sticky yerleştirmesine izin verilir).
  • Mühendis botları, başka bir dost Mühendisin binalarını asla yükseltmez veya sabote etmezi temizlemez, meğerki o bina hedeflerinin yolunda olmasın. Ayrıca bazen... güvenli olsa bile kendi taretlerini tamir etmezler.
  • Fark edilen Casus botları, bıçaklamayı zorlamak yerine tabancalarına geçip geri çekilirler.
  • Bir sentryi tespit etmiş Bombacı botları (genellikle ona bir kez ölerek), menzil dışından mükemmel bir şekilde sticky bombalarını fırlatabilir, geometri izin verdiğinde duvarların ve tavanların etrafından dolaştırabilir.
  • Nişancı botları, nişan aldıktan sonra hedef bulamazsa "Negatif" ses satırlarından birini kullanır.
  • Dost Medic'ler, gizlenmiş bir Casusu tereddüt etmeden iyileştirir.

Bilinen sorunlar / hatalar

Belge, uzun süredir var olan bir dizi tuhaflığı listeler:

  • Botlar, bazı sabit sahne dekorlarının içinden yürümeye veya ateş etmeye çalışabilir.
  • Bir oyuncu/bot maske çıkardığında, kılık değiştirdiğinde veya açığa çıktığında, yakındaki botlar onu "görür" ve tepki vermek için döner -- bu olay gerçek görüş alanları dışında gerçekleşse bile. Ses tabanlı değildir; görüş kontrolünü atlayan bir durumdur.
  • Nadiren, botlar bir Mühendis teleporter'ını kullanırken fiziksel olarak birbirine sıkışabilir.
  • Bot ses komutları (örn. "Spy!", "Forward!"), oyuncularınki gibi sohbet metni olarak görüntülenmez.
  • Birini aktif olarak iyileştiren Medic botu, kritik derecede düşük canı olsa bile gelen ateşten kaçmaz veya sağlık kitleri almaz.
  • Botlar, bir partner taklidi yaparken hareket etmeye devam edebilir, bu da Festive Critical Strike'ın amaçlanan etkisini bozar.
  • Yakın zamanda hasar almış Medic botları, menzilde Şırınga Tabancası'nı kullanmayı reddedip yakın dövüşü tercih eder (veya çok nadir durumlarda, size Medi Gun ışınıyla vurmaya çalışır).
  • Medic botları, Şırınga Tabancası atışlarında yerçekimi düşüşünü telafi etmez -- muhtemelen silah, yapay zeka kodunda hitscan olmayan olarak doğru şekilde işaretlenmediği için.
  • Casus botları, gizlenmiş bir Casusu (oyuncu veya yapay zeka), o Casus bir kez bile gizliliğini ifşa etmişse, izleyen botun beceri seviyesinden bağımsız olarak görebilir ve takip edebilir.
  • Bir oyuncu-Casus kendi takımının sınıfı gibi gizlense bile, bir düşmana çarpmak onu hala ele verir (botlar bunu kendilerine asla yapmaz, çünkü botlar asla kendi takımları gibi gizlenmez).
  • Botlar takım otomatik dengesine saygı duyar -- botları bir takımda yığmaya çalışıyorsanız, önce mp_teams_unbalance_limit 0 gerekir.
  • Mühendis botları, kendi binalarını yok olana kadar tamamen görmezden gelebilir.
  • Ağır Sıklet botları, çoğunlukla Zor zorluğunun altında, kritik derecede düşük cephaneyken Minigun'u ateşlemeye çalışabilir.
  • Kaybeden takımın Medic botları, yakınlarda düşman yokken Aşağılama aşamasında bazen intihar eder -- bir insan oyuncunun denese bile tekrarlayamayacağı bir şey.
  • Yükleme ekranı takım önizlemenizi BLU olarak ayarlamak, RED botlarının size BLU olarak görünmesini sağlar.
  • Yakın dövüş silahı çıkarmış botlar, cephane aldıktan sonra bile bazen silah değiştirmeyi reddeder.
  • Jungle Inferno sonrası, açık parametrelerle oluşturulan botlar (örn. tf_bot_add 5 pyro blue normal) kendi doğum odalarında anında ölebilir. Düzeltme: tf_bot_reevaluate_class_in_spawnroom 0 (sv_cheats 1 gerektirir).

Yapay zeka isimleri

Bot isimleri, TF2, diğer Valve oyunları ve programlama kültürüne referanslar içeren geniş bir havuzdan çekilir, büyük ölçüde topluluğun Steam forumlarında belirli isimleri talep etmesi nedeniyle. Listenin bir örneği: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF ve bu minvalde düzinelerce daha.

Ayrıca, sızdırılmış bir kaynak yapısında bulunan ancak net olmayan nedenlerle üretime hiç gönderilmemiş bir dizi isim daha vardır -- çoğunlukla Last Dragon ve The Fifth Element referansları: John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh? ve I'm your huckleberry.

Bunların hepsini kendiniz geçersiz kılabilirsiniz: tf_bot_add heavyweapons blue "Blu Hoovy", "Blu Hoovy" adlı bir BLU Ağır Sıklet oluşturur.


Bölüm II: Orijinal Botlar / TFBot'lar -- Beceri Seviyesi Derinlemesine İnceleme

Sigsegv'in orijinal çerçevesi hâlâ geçerlidir: Uzman botların Kolay botları geride bıraktığı açıktır, ancak Valve ne kadar veya neden olduğunu asla açıklamadı. Tek yol kodu okumaktır. İşte beceriyle ölçeklenen her mekanik.

Zorluk ayarlama

MvM dışında, zorluk tek bir cvar ile kontrol edilir:

tf_bot_difficulty Beceri seviyesi
0 Kolay
1 Normal (varsayılan)
2 Zor
3 Uzman

tf_bot_add ayrıca doğrudan bir zorluk argümanı kabul eder (easy/normal/hard/expert).

MvM pop dosyaları

Mann vs. Machine'de, pop dosyasındaki her TFBot oluşturma bloğunda isteğe bağlı bir Skill anahtarı bulunur. Anahtar yoksa Kolay anlamına gelir. Valve'ın kendi görevlerinde: Devler neredeyse her zaman Uzman, Mühendisler ve Casuslar neredeyse her zaman Uzman ve Nişancılar genellikle Zor'dur (ara sıra Uzman). Botları harita olaylarına göre dalga ortasında dinamik olarak değiştirmek için EventChangeAttributes (İki Şehir güncellemesinde eklendi) kullanıyorsanız, bot becerisi anında değiştirmenize izin verilen özelliklerden biridir.

MvM Sonsuz Mod

Sonsuz mod hiçbir zaman resmi olarak yayınlanmadı, ancak bu modda botlar tıpkı oyuncular gibi paralarını yükseltmelere harcar -- oyun ortasında yapay zeka beceri seviyelerini artıran bota özel bir yükseltme de dahil.

bot_generator varlığı

Eğitim modunda ve muhtemelen erken MvM geliştirmesinde kullanıldığı düşünülen, belirsiz, büyük ölçüde belgelenmemiş bir varlık. Beceri seviyesini kontrol etmek için bir SetDifficulty girdisi sunar. Bunun ötesinde iz kaybolur -- Valve onu asla belgelemedi ve kimse davranışını tam olarak haritalamadı.

Göz parıltısı rengi

MvM robotlarının, beceri seviyesine göre renk değiştiren bir göz parıltısı parçacığı vardır -- topluluk dışında kimsenin açıklamadığı görsel bir ipucu:

Beceri Göz rengi RGB
Kolay/Normal Mavi #24b4ff
Zor/Uzman Sarı #fff000

TF2 Heavy bot bekleme pozisyonunda

Görüş: tanıma süresi

Bir bot, bir şey görüş alanına girer girmez tepki vermez -- yapay zekanın tehdidi kabul etmesine izin verilmeden önce sabit kodlanmış bir gecikme vardır:

Beceri Minimum tanıma süresi
Kolay 1.00 s
Normal 0.50 s
Zor 0.30 s
Uzman 0.20 s

"Kolay botlar aptal hissettiriyor" etkisinin çoğu tek bir sayıdadır -- bir Kolay bot sizi fark ettiğinde daha kötü nişan almaz, sadece var olduğunuzu fark etmesi beş kat daha uzun sürer.

Nişan: takip hızı

Botlar sizi sürekli takip etmez. Konumunuzu ve hızınızı sabit bir aralıkta örnekler ve oradan düz bir çizgi tahmin ederler:

Beceri Yeniden hesaplama aralığı Eşdeğer hız
Kolay 1.00 s 1x/sn
Normal 0.25 s 4x/sn
Zor 0.10 s 10x/sn
Uzman 0.05 s 20x/sn

İstisna: Casus botları, gerçek beceri seviyelerinden bağımsız olarak Normal takip hızına sabit kodlanmıştır -- bir Uzman Casus hâlâ Normal bir bot gibi nişan alır. Ayrıca, 1x'e karşı 20x farkını hareket halinde görmek isterseniz, takip hızlarını yan yana karşılaştıran halka açık bir gösterim videosu da vardır.

Nişan alma: silaha özgü beceri

Botlar sadece kütle merkezinize nişan almaz -- silah başına mantıkları vardır, bazıları gerçekten hatalıdır:

Bombaatar ve Yapışkan Bombaatar. Tüm beceri seviyeleri, tf_bot_ballistic_elevation_rate cvar'ından sabit bir değer kullanarak dikey yayı telafi eder. Bu telafi yalnızca temel silah kimliği için çalıştığından, daha hızlı mermi varyantları (Loch-n-Load, mermi hızı değiştiricili herhangi bir şey) doğru ayarlanmış yaylar alamaz. Ve silah kimliğine göre anahtarlandığı için, Loose Cannon -- tamamen farklı bir kimlik -- hiç yay telafisi almaz.

Huntsman. Kolay botlar ok düşüşünü telafi etmez ve asla kafa vuruşu yapmaz. Normal beceri botları yayı telafi eder, ancak yalnızca 150 HU içinde kafayı hedefler. Zor/Uzman botlar her zaman kafaya gider.

Roketatarlar. 150 HU'nun ötesinde, Kolay olmayan botlar kütle merkezi yerine ayaklarınıza nişan alır, sıçrama hasarını ve geri tepme şansını maksimize eder. 150 HU içinde kafa vuruşlarına geçerler. Kolay botlar menzilden bağımsız olarak her zaman kütle merkezine nişan alır. Bu da silah kimliğine kilitlidir: Direct Hit ve Cow Mangler bu davranışı devralmaz. Direct Hit için mantıklıdır (kullanılacak AoE yoktur); Cow Mangler için hiçbir anlam ifade etmez -- yapay zekanın bu kısmı silahın var olmasından öncedir ve asla güncellenmemiştir.

Nişancı Tüfekleri. Kolay vücuda nişan alır. Normal, vücuttan kafaya yaklaşık %33 oranında nişan alır. Zor/Uzman doğrudan kafaya nişan alır. MvM'de daha az önemlidir, çünkü bot kafa vuruşları zaten hasar bonusu almaz.

Duyma: gizli atışlara duyarlılık

Her silah sesi, yakındaki botları atıcının konumuna karşı uyarır, duvarların içinden bile, 3000 HU'ya kadar %100 fark etme şansıyla (tf_bot_notice_gunfire_range). Ancak bir alt küme silah "gizli" olarak işaretlenmiştir -- yalnızca 500 HU içinde duyulabilir (tf_bot_notice_quiet_gunfire_range) ve o zaman bile beceriye bağlı bir şansla:

Beceri Gizli atışı fark etme şansı
Kolay %10
Normal %30
Zor %60
Uzman %90

Son 3 saniye içinde yüksek bir atış duyulduysa bu olasılık yarıya iner -- yüksek sesler sessizleri maskeler.

Gizli silah kimliği listesi Aralık 2010'dan beri güncellenmemiştir. Bu tarihten sonra yepyeni bir silah kimliği kullanılarak eklenen herhangi bir şey, mantıksal olarak ne kadar sessiz olması gerekirse gereksin, varsayılan olarak yüksek sesli kabul edilir -- meğerki eski bir kimliği yeniden kullanmış olsun. Somut olarak:

Silah kimliği Kapsadıkları
TF_WEAPON_KNIFE Tüm Casus bıçakları
TF_WEAPON_FISTS Ağır Sıklet'e özel yumruklar (çok sınıflı yumruğu aslında TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Doğrudan kullanılmadığı düşünülüyor
TF_WEAPON_PDA_ENGINEER_BUILD Mühendis'in İnşa PDA'sı
TF_WEAPON_PDA_ENGINEER_DESTROY Mühendis'in Yıkım PDA'sı
TF_WEAPON_PDA_SPY Casus'un kılık değiştirme seti
TF_WEAPON_BUILDER Casus'un Mühendis/Sapper araç seti
TF_WEAPON_MEDIGUN Tüm Medi Gun'lar
TF_WEAPON_DISPENSER Muhtemelen kullanılmamıştır (Dağıtıcılar nesnedir, silah değildir)
TF_WEAPON_INVIS Tüm Casus görünmezlik saatleri
TF_WEAPON_FLAREGUN Manmelter hariç tüm Pyro işaret fişek tabancaları
TF_WEAPON_LUNCHBOX Sandviç, Dalokohs Bar, Buffalo Biftek Sandviçi, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (Mad Milk değil -- ayrı, gizli olmayan kimlik)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Listenin çürüdüğünün klasik örneği: Manmelter, gizli liste dondurulduktan sonra eklenen kendi kimliğini (TF_WEAPON_RAYGUN_REVENGE) aldı -- bu yüzden her pratik anlamda bir işaret fişek tabancası olmasına rağmen yüksek sesli kabul edilir. Daha sonra çıkan Scorch Shot, temel TF_WEAPON_FLAREGUN kimliğini yeniden kullanır ve bu nedenle hâlâ gizli kabul edilir. Mantıksız, ama kod böyle.

Strateji: tehdit önceliklendirmesi

Aynı anda birden fazla düşman görünür olduğunda, botlar mesafe, ateş altında olup olmadıkları ve -- Kolay'ın üzerinde -- birincil tehdidin iyileştirilip iyileştirilmediğini değerlendirir:

Beceri Bunun yerine iyileştiriciyi hedefler?
Kolay Hayır
Normal %50 şans
Zor Evet
Uzman Evet

500 HU'nun ötesindeki düşmanlar normalde acil olmayan olarak önceliksizleştirilir. İstisnalar: Zor/Uzman botlar uzaktaki Medic'leri ve Mühendisleri her zaman acil tehdit olarak görür ve kabaca size doğru nişan alan herhangi bir düşman Nişancı, mesafe ve beceriden bağımsız olarak her zaman acil kabul edilir.

Beceri Uzaktaki Medic'ler/Mühendisler/nişan alan Nişancılar = acil tehdit?
Kolay/Normal Hayır
Zor/Uzman Evet

Bu Nişancı kontrolünün gerçekten eğlenceli bir geçmişi vardır. Sigsegv'in orijinal yazısı, oyunun nişancının nişan vektörü ile botun göreceli konumu arasındaki nokta çarpımının tam olarak sıfır olmasını gerektirdiğini varsaydı -- kayan nokta matematiğinde neredeyse hiç tetiklenmeyecek kadar hassas bir karşılaştırma, tüm özelliği fiilen ölü kod haline getiriyor. Daha sonra yapılan bir düzeltme (daha temiz bir Hex-Rays derlemesine teşekkürler) gerçek kontrolün nokta çarpımı > 0 olduğunu gösterdi: doğrudan size bakan ile size dik açıyla bakan arasındaki herhangi bir Nişancı acil tehdit sayılır; dikten arkaya dönük olan herhangi bir şey sayılmaz. Orijinal yanlış okuma, bir SSE float karşılaştırmasının kötü bir derlemesinden geldi -- bir AAA ikili dosyasını tersine mühendislikle çözmek kesin bir bilim değildir.

Hareket: kaçınma

Kolay botlar asla kaçınmaz, nokta. Normal ve üstü botlar, bir savaş silahı tutuyorlarsa, son 3 saniye içinde bir düşman görmüşlerse ve bu düşmanın onlara görüş hattı varsa, sola/sağa kaçarlar (3'te 1 sol, 3'te 1 sağ, 3'te 1 hiçbir şey, tespit edilen boşluklara göre ağırlıklandırılır).

Şu durumlardan herhangi biri geçerliyse kaçınmazlar: DisableDodge özelliği ayarlanmışsa, mevcut davranış acele etmeyi söylüyorsa, şu anda dokunulmazsa (herhangi bir über), taklit/tahrik ortasındaysa, Mühendis oynuyorsa, Casus olarak görünmez veya gizlenmişse, Nişancı olarak nişan almış veya Ağır Sıklet olarak döndürülmüşse veya Huntsman çekişi ortasındaysa.

Hareket: düşmanları itmekten kaçınma

Normal'in üzerinde, botlar hareket ederken özellikle düşmanlara çarpmamaya çalışır:

Beceri Düşmanlara çarpmaktan kaçınır?
Kolay Hayır
Normal Hayır
Zor Evet
Uzman Evet

Pratikte bu yalnızca Casus botları için önemlidir -- bir düşman oyuncusuyla garip bir çarpışmayı önlemek, bir kılık değiştirmeyi bozacak türden bir şeydir.

Pyro: hava patlaması ustalığı

Hava patlaması iki amaca hizmet eder: mermileri yansıtmak (PvP ve MvM) ve yakındaki düşmanları uçurumlardan itmek (yalnızca PvP). Botun geçerli bir fırsatta tetiği çekmesi, beceri tabanlı bir yazı tura atışıdır:

Beceri Hava patlaması tetikleme şansı
Kolay %0
Normal %50
Zor %90
Uzman %100

Kolay Pyro botları kelimenin tam anlamıyla hava patlaması yapamaz -- atış, "nadiren" değil, asla başarılı olmayacak şekilde sabit kodlanmıştır.

Casus: kılık değiştirme etkililiği

İki ayrı eksen beceriyle ölçeklenir. Kılık değiştirme seçimi:

Beceri Kılık değiştirme yöntemi
Kolay/Normal Düşman takımının gerçekte ne oynadığını yok sayarak rastgele sınıf
Zor/Uzman Gerçek bir düşman oyuncusu seçer ve onların tam sınıfını kopyalar

Kılık değiştirme rol yapma:

Beceri Gizliyken/görünmezken davranış
Kolay/Normal Düşman oyuncuları gördüğünde onlara bakar (şüpheli)
Zor/Uzman Kasıtlı olarak göz temasından kaçınır (daha inandırıcı)

Casus: bıçaklama saldırganlığı

Uzun mesafede (300 HU'ya kadar, tf_bot_spy_knife_range), bir Casus botu yalnızca kurbanı görebiliyorsa ve kurbana en azından kısmen sırtı dönükse bıçaklamaya girişir. Beceri, bu sırt açısının merkezden ne kadar sapmasına izin verildiğini belirler:

Beceri Açı toleransı
Kolay Doğrudan size baksa bile dener
Normal Sırtınızdan ±45°
Zor Sırtınızdan ±78°
Uzman Sırtınızdan ±90° (tam arka 180° yay)

Kolay Casus botları işlevsel olarak intihara meyillidir -- tam karşılarına bakan birine bıçaklamayı deneyeceklerdir. İstisna: Mann vs. Machine'de, her Casus botu gerçek beceriden bağımsız olarak Normal açı kısıtlamasına zorlanır.

Taktikler: silah seçimi

Yalnızca Kolay'ın üzerinde devreye girer ve MvM'de çoğunlukla önemsizdir çünkü botların genellikle katı silah kısıtlamaları vardır:

  • Scout: ana silahın şarjörü boşaldığında ikincile geçer.
  • Soldier: boş şarjörde ve hedef 500 HU'dan yakınsa ikincile geçer.
  • Sniper: 750 HU'dan yakın hedefler için ikincile geçer.
  • Pyro: 750 HU'dan uzak hedefler için ikincile geçer, meğerki o hedef bir Soldier veya Demoman olmasın.

Taktikler: siperde yeniden doldurma

MvM'de kullanılmaz. Botun mevcut davranışı geri çekilmesini söylemiyorsa, ana şarjörü boşsa ve überli değilse, yüksek becerili botlar geçici olarak sipere çekilip size boş silahla tıklamak yerine yeniden doldurur:

Beceri Yeniden doldurmak için geri çekilir?
Kolay Hayır
Normal Hayır
Zor Evet
Uzman Evet

KP modu: savunmacı gezintisi

MvM'de kullanılmaz. Bir kontrol noktasını savunurken, yüksek becerili botların öldürmek için noktayı terk etme olasılığı daha yüksektir ("ara ve yok et"), ancak yalnızca tf_bot_defense_must_defend_time üzerinde makul bir süre kalmışsa:

Beceri Gezinti şansı
Kolay %10
Normal %50
Zor %75
Uzman %90

KP modu: ele geçirmeyi engelleme

MvM'de kullanılmaz. Düşman ele geçirme girişimine itiraz eden savunmacı botlar:

Beceri Ele geçirmeyi engellemeye çalışır?
Kolay Hayır
Normal %50 şans
Zor Evet
Uzman Evet

Tam özet tablosu

Özellik Kolay Normal Zor Uzman Notlar
Görüş: tanıma süresi 1.00s 0.50s 0.30s 0.20s
Nişan: takip hızı 1x/s 4x/s 10x/s 20x/s Casuslar her zaman Normal kullanır
Bomba/sticky yay telafisi Evet Evet Evet Evet Loose Cannon hariç
Huntsman dikey telafi Hayır Evet Evet Evet
Huntsman kafa vuruşları Hayır <150 HU Evet Evet
Roketatar ayak atışları Hayır Evet Evet Evet Direct Hit & Cow Mangler hariç
Nişancı Tüfeği nişan noktası Vücut ~%33 kafaya Kafa Kafa
Gizli atışları fark etme şansı %10 %30 %60 %90 Yüksek atışlar maskelerse yarıya iner
İyileştiriciyi hedefleme Hayır %50 Evet Evet
Uzaktaki Medic/Mühendis/Nişancı = tehdit Hayır Hayır Evet Evet
Kaçınma Hayır Evet Evet Evet Uzun istisna listesi
Düşmanlara çarpmaktan kaçınma Hayır Hayır Evet Evet Çoğunlukla Casus için önemli
Hava patlaması tetikleme şansı %0 %50 %90 %100
Casus kılık sınıfı seçimi Rastgele Rastgele Gerçek düşmanla eşleşir Gerçek düşmanla eşleşir
Casus kılıktayken göz teması Bakar (belli) Bakar Kaçınır (inandırıcı) Kaçınır
Casus bıçaklama açısı ~0° ±45° ±78° ±90° MvM Normal'i zorlar
Silah seçimi mantığı Hayır Evet Evet Evet MvM'de daha az önemli
Siperde yeniden doldurma Hayır Hayır Evet Evet MvM'de yok
KP savunmacı gezintisi %10 %50 %75 %90 MvM'de yok
KP ele geçirmeyi engelleme Hayır %50 Evet Evet MvM'de yok

Sonuç

TF2 Heavy bot minigun ile nişan alıyor

Bunların hiçbiri Valve'ın yanlış tahminleri değil -- kasıtlı, tamamen belirlenmiş bir puanlama ve olasılık sistemi, sadece hiçbir yerde resmi olarak yazılmamış. Hatırlamaya değer birkaç şey:

  1. "Beceri" bağımsız kadranlardan oluşan bir demettir, tek bir küresel çarpan değil. Tepki süresi, nişan hızı ve her taktiksel davranış ayrı ayrı ölçeklenir ve birkaçı (Casus takip hızı, MvM bıçaklama açısı) beceriden bağımsız olarak sabit kodlanmış geçersiz kılmalar alır.
  2. Bunların bir kısmı gerçekten hatalı, sadece eski değil. 2010'dan beri dondurulmuş gizli silah listesi, hiçbir iyi sebep olmadan ayak atışı mantığı eksik olan Cow Mangler, yıllar süren doğru derleme çalışmaları gerektiren Nişancı nokta-çarpım kontrolü -- Valve'ın yapay zeka kodunun, diğer 17 yaşındaki herhangi bir kod tabanı gibi yara izleri vardır.
  3. Bunların hepsini kullanabilirsiniz. Bir Nişancı botunun Normal'de size kafa vuruşu yapmayacağını, bir Kolay Pyro'nun roketinizi gerçekten geri gönderemeyeceğini, bir Kolay Casus'un yüz yüze size bıçaklamaya çalışacağını bilin. Bu şans değil. Bu bir teknik şartname.

Bu mümkün kılan orijinal kod dalışları için sigsegv'e, bot komutları ve harita desteği hakkındaki temel dokümantasyon için TF2 Wiki'sine ve 17 yıllık bir bot yapay zekasını kurcalayıp tam olarak neden böyle davrandığını anlamaya çalışan topluluktaki herkese çok teşekkürler.

I Bot di TF2 Non Sono Casuali: Ho Reverse-Engineered Ogni Impostazione di Difficoltà

Visione, tracciamento della mira, angoli delle pugnalate alle spalle della Spia, logica dei colpi in testa del Cecchino, ogni bug conosciuto -- Valve non ha mai documentato nulla. Quindi abbiamo frugato nel codice e l'abbiamo trasformato in un foglio tecnico completo.

Introduzione

Soldato bot di TF2 che mira con un lanciarazzi

Ogni giocatore di TF2 lo ha detto almeno una volta: "questo bot sta barando." O l'opposto: "perché questo bot Facile se ne sta lì fermo a mangiarsi razzi." Nessuno sa veramente cosa "Facile," "Normale," "Difficile," ed "Esperto" significhino effettivamente sotto il cofano -- Valve ha pubblicato quattro etichette di difficoltà e zero documentazione.

Quindi un gruppo di noi (io, awimii, Mush The Possum, con un'enorme parte del lavoro preparatorio fatto da sigsegv, che si è davvero immerso nel codice decompilato del gioco) ha messo insieme un documento di ricerca completo sul comportamento dei TFBot. Ogni meccanica, ogni bug conosciuto, ogni probabilità hardcoded. Questo articolo è il resoconto completo, non quello condensato. Prenditi un Bonk, questo è lungo.


Capitolo I: Le Basi

Bot vs Puppet Bot

TF2 ha due cose completamente diverse che la gente chiama "bot":

  • Bot AI (TFBot): vera IA, costruita sullo stesso framework PlayerBot/Infected che Valve ha usato per la serie Left 4 Dead. Scelgono una classe casuale, giocano per l'obiettivo, funzionano senza sv_cheats, e attivano gli achievement come farebbe un vero giocatore.
  • Puppet bot (burattini): zero IA, non possono muoversi o agire da soli. Esistono puramente per essere controllati manualmente -- un giocatore può forzarli a seguire, mirare e sparare, usati principalmente per test o per fare screenshot/video cinematografici. Generarli richiede sv_cheats 1, che disabilita anche gli achievement per la sessione.

Questo articolo parla interamente del primo tipo.

Cosa si può (più o meno) dire ai bot AI di fare

I TFBot non sono direttamente controllabili, ma c'è una breve lista di cose che puoi spingerli a fare:

  • Punta il mirino verso qualsiasi bot (amico o nemico) e farà una provocazione se usi i giusti comandi vocali.
  • Un bot Medico amico ti cura se usi il comando vocale "Medico!"
  • Se un bot Medico ti sta curando e ha un ÜberCharge pronto, dire "Andiamo andiamo!" o "Attiva carica!" lo farà attivare immediatamente.
  • Un bot Medico con la carica pronta la attiverà automaticamente nel momento in cui lui o il suo bersaglio curato subisce danni seri, senza bisogno di comandi vocali.
  • I bot eseguono spontaneamente provocazioni di coppia (Batti il Cinque) o di gruppo (Conga) con i compagni di squadra nelle vicinanze.

Far funzionare i bot su mappe non supportate

I bot si basano su un navigation mesh per sapere dove possono camminare, e la maggior parte delle mappe della community non ne include una. Per forzarlo:

  1. sv_cheats 1
  2. nav_generate -- costruisce il navmesh iniziale, l'avanzamento è mostrato in console
  3. Aspetta che il gioco finisca di generare i percorsi
  4. Opzionalmente correggi i dati di navigazione errati manualmente con nav_edit 1
  5. Ricarica o riavvia il server (saltare questo passaggio disabilita gli achievement)
  6. tf_bot_add <numero> per far effettivamente spawnare i bot

Attenzione: modificare il navmesh mentre i bot sono attivi sul server può far crashare il gioco. Una volta che la mesh esiste, non devi rigenerarla per le sessioni future -- basta riaggiungere i bot con tf_bot_add.

Le mesh generate automaticamente funzionano meglio sulle mappe Control Point, King of the Hill, Payload e CTF. Sulle mappe Mannpower i bot usano per impostazione predefinita lo stile CTF ma usano a malapena i rampini o i potenziamenti. Se una mappa non ha un obiettivo che l'IA dei bot riconosce ma ha un'entità spawn room, impostare tf_bot_offense_must_push_time 0 permette comunque ai bot di combattere.

(Fonte per questa sezione: la pagina ufficiale dei Bot della Wiki di TF2.)

Stato attuale, mappa per mappa

Grazie all'aggiornamento Hatless, ogni classe funziona correttamente ora, inclusa la Spia, storicamente piena di bug. I bot si comportano correttamente sulla maggior parte delle mappe KOTH ufficiali, alcune mappe Payload, Dustbowl/Gorge Attack-Defense, e mappe CTF/Mann Manor -- anche se su queste ultime due non puoi generarli direttamente con tf_bot_add. Sulle mappe non supportate (tramite il processo nav_generate sopra) funzionano, ma sono notevolmente peggiori nell'imitare un vero giocatore.

Le mappe PLR sono una causa persa: i bot non riescono a superare le barriere su Hightower e si bloccano negli angoli, e su ogni altra mappa PLR fanno... un party di ballo invece di giocare. Potrebbe essere sistemato un giorno. O forse no.

Comportamento generale dei bot

Una raccolta di cose che ogni bot fa indipendentemente dall'abilità:

  • I bot usano solo equipaggiamento base (un plugin può forzare armi non standard, ma i bot vanilla non scelgono mai le proprie).
  • I bot Facile usano a malapena l'arma secondaria. Le difficoltà superiori passano alla secondaria appena la primaria è scarica, o per compensare la distanza.
  • I bot non sanno fare tecniche di movimento -- niente rocket jump, niente spostamento di costruzioni.
  • Dopo un'uccisione, un bot può fare una provocazione, anche sotto il fuoco -- tranne mentre trasporta le intelligence nemiche, e questa regola vale anche in MvM.
  • I bot Spia travestiti (giocatore o AI) sono correttamente ignorati dagli altri bot -- finché non toccano un nemico, mettono un sapper, sparano, o si attivano vicino a uno. Una volta "scoperto," quel bot/giocatore specifico viene ricordato come Spia finché non cambia travestimento rimanendo invisibile, muore, o finge la morte con il Dead Ringer.
  • I bot Pyro usano lo Scarica Compressiva liberamente su qualsiasi cosa sopra Facile.
  • I bot Medici danno priorità alla cura di tutti tranne i Cecchini (e, in misura minore, gli Ingegneri), anche se spammi "Medico!" come uno di loro.
  • I bot Medici gravitano verso Pesanti, Soldati, Demoman e Pyro -- specificamente se un umano sta giocando quelle classi. Nessun umano in quei ruoli, nessuna particolare attenzione del Medico.
  • I bot mantengono la posizione durante il setup sulle mappe Attacco/Difesa e Payload -- tranne Ingegneri, Cecchini e Spie, che si muovono liberamente (anche i bot Demoman possono pre-piazzare stickybomb).
  • I bot Ingegnere non aggiornano né rimuovono i sapper dalle costruzioni di un altro Ingegnere amico, a meno che quella costruzione non si trovi per caso nel loro percorso. A volte inoltre... semplicemente non riparano il proprio stesso turret, anche quando è sicuro farlo.
  • I bot Spia scoperti passano alla rivoltella e arretrano invece di forzare una pugnalata.
  • I bot Demoman che hanno localizzato una sentry (di solito morendoci una volta) possono lanciare stickybomb perfettamente sopra di essa da fuori portata, arcuando attorno a muri e soffitti quando la geometria lo permette.
  • I bot Cecchino che non trovano un bersaglio dopo aver mirato usano una delle linee vocali "Negative".
  • I medici amici cureranno una Spia travestita senza esitazione.

Problemi noti / bug

Il documento elenca una solida pila di stranezze di lunga data:

  • I bot possono tentare di camminare o sparare attraverso certi oggetti di scena fissi.
  • Ogni volta che un giocatore/bot si smaschera, si traveste o si rivela, i bot nelle vicinanze "lo vedono" e si girano per reagire -- anche se l'evento è avvenuto fuori dal loro campo visivo effettivo. Non è basato sul suono; è un bypass del controllo visivo.
  • Raramente, i bot possono rimanere fisicamente incastrati insieme mentre usano un teletrasporto dell'Ingegnere.
  • I comandi vocali dei bot (es. "Spia!", "Avanti!") non vengono mostrati come testo in chat come quelli dei giocatori.
  • Un bot Medico che sta curando attivamente qualcuno non schiva il fuoco in arrivo né raccoglie kit medici, anche a PV criticamente bassi.
  • I bot possono continuare a muoversi mentre eseguono una provocazione di coppia, il che rompe l'effetto previsto del Festive Critical Strike.
  • I bot Medici danneggiati di recente spesso si rifiutano di usare il Syringe Gun a distanza, preferendo il corpo a corpo (o, in rarissimi casi, cercando di colpirti con il raggio del Medi Gun stesso).
  • I bot Medici non compensano la caduta di gravità sui colpi del Syringe Gun -- probabilmente perché l'arma non è correttamente flaggata come non-hitscan nel codice AI.
  • I bot Spia possono vedere e tracciare una Spia invisibile (giocatore o AI) se quella Spia si è già fatta scoprire una volta, indipendentemente dal livello di abilità del bot che la traccia.
  • Anche se un giocatore-Spia si traveste come la classe della propria squadra, sbattere contro un nemico lo smaschera comunque (i bot non lo fanno mai, poiché i bot non si travestono mai come la propria squadra).
  • I bot rispettano il bilanciamento automatico delle squadre -- se stai cercando di accumulare bot su una squadra, hai bisogno prima di mp_teams_unbalance_limit 0.
  • I bot Ingegnere possono ignorare completamente le proprie costruzioni finché non vengono distrutte.
  • I bot Pesante a volte cercano di sparare con il Minigun quando hanno pochissime munizioni, soprattutto sotto difficoltà Difficile.
  • I bot Medici della squadra perdente occasionalmente si suicidano durante la fase di Umiliazione quando non ci sono nemici nelle vicinanze -- qualcosa che un giocatore umano non può replicare nemmeno provandoci.
  • Impostare l'anteprima della squadra nella schermata di caricamento su BLU fa sì che i bot RED vengano visualizzati come BLU per te.
  • I bot con il corpo a corpo in mano a volte si rifiutano di cambiare arma anche dopo aver raccolto munizioni.
  • Dopo l'aggiornamento Jungle Inferno, i bot spawnati con parametri espliciti (es. tf_bot_add 5 pyro blue normal) possono morire all'istante nella loro stessa stanza di spawn. Soluzione: tf_bot_reevaluate_class_in_spawnroom 0 (richiede sv_cheats 1).

Nomi AI

I nomi dei bot sono presi da un grande pool di riferimenti a TF2, altri giochi Valve e cultura della programmazione, in gran parte perché la community continuava a richiederne di specifici sui forum di Steam. Un campione della lista: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, e dozzine di altri in questo stile.

C'è anche un gruppo di nomi trovati in una build sorgente trapelata che non è mai stata rilasciata in produzione, per ragioni poco chiare -- per lo più riferimenti a Last Dragon e Il Quinto Elemento come John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh?, e I'm your huckleberry.

Puoi sovrascrivere tutto questo tu stesso: tf_bot_add heavyweapons blue "Blu Hoovy" fa spawnare un Pesante BLU chiamato "Blu Hoovy."


Capitolo II: I Bot Originali / TFBot -- Analisi Approfondita dei Livelli di Abilità

La struttura originale di Sigsegv è ancora valida: è ovvio che i bot Esperti superano i bot Facili, ma Valve non ha mai spiegato quanto o perché. Quindi l'unico modo per saperlo è leggere il codice. Ecco ogni meccanica che scala con l'abilità.

Impostare la difficoltà

Fuori da MvM, la difficoltà è controllata da un cvar:

tf_bot_difficulty Livello di abilità
0 Facile
1 Normale (predefinito)
2 Difficile
3 Esperto

tf_bot_add accetta anche un argomento di difficoltà direttamente (easy/normal/hard/expert).

Popfile MvM

In Mann vs. Machine, ogni blocco di spawn TFBot nel popfile ha una chiave Skill opzionale. Nessuna chiave significa Facile. Nelle missioni ufficiali di Valve: i Giganti sono quasi sempre Esperti, Ingegneri e Spie sono quasi sempre Esperti, e i Cecchini sono solitamente Difficili (occasionalmente Esperti). Se stai usando EventChangeAttributes (aggiunto nell'aggiornamento Two Cities) per alterare dinamicamente i bot a metà ondata in base agli eventi della mappa, l'abilità del bot è una delle proprietà che puoi cambiare al volo.

Modalità Endless MvM

La modalità Endless non è mai stata rilasciata ufficialmente, ma in essa i bot spendono i loro soldi in potenziamenti proprio come i giocatori -- incluso un potenziamento esclusivo dei bot che aumenta il loro livello di abilità AI a metà partita.

L'entità bot_generator

Un'entità oscura, in gran parte non documentata, che si ritiene sia stata usata nella modalità training e forse nel primo sviluppo di MvM. Espone un input SetDifficulty per controllare il livello di abilità. Oltre a questo, le tracce si perdono -- Valve non l'ha mai documentata e nessuno ne ha mappato completamente il comportamento.

Colore del bagliore degli occhi

I robot MvM hanno una particella di bagliore agli occhi che cambia colore con il livello di abilità -- un indicatore visivo che nessuno al di fuori della community ha mai spiegato:

Abilità Colore occhi RGB
Facile/Normale Blu #24b4ff
Difficile/Esperto Giallo #fff000

Bot Pesante di TF2 in posa di idle

Visione: tempo di riconoscimento

Un bot non reagisce nell'istante in cui qualcosa entra nel suo campo visivo -- c'è un ritardo hardcoded prima che al resto dell'IA sia permesso di riconoscere la minaccia:

Abilità Tempo di riconoscimento minimo
Facile 1.00 s
Normale 0.50 s
Difficile 0.30 s
Esperto 0.20 s

Questo è la maggior parte dell'effetto "i bot Facili sembrano stupidi" in un singolo numero -- un bot Facile non mira peggio una volta che ti nota, impiega solo cinque volte più tempo per notare che esisti.

Mira: frequenza di aggiornamento

I bot non ti tracciano continuamente. Campionano la tua posizione e velocità a un intervallo fisso e predicono una linea retta da lì:

Abilità Intervallo di ricalcolo Frequenza equivalente
Facile 1.00 s 1x/sec
Normale 0.25 s 4x/sec
Difficile 0.10 s 10x/sec
Esperto 0.05 s 20x/sec

Eccezione: i bot Spia sono hardcodeati alla frequenza di tracciamento Normale indipendentemente dal loro effettivo livello di abilità -- una Spia Esperta mira ancora come un bot Normale. C'è anche un video dimostrativo pubblico che confronta le frequenze di tracciamento affiancate se vuoi vedere il divario 1x vs 20x in azione.

Mira: abilità specifica per arma

I bot non puntano semplicemente al tuo centro di massa -- hanno logiche per arma, alcune genuinamente piene di bug:

Lanciagranate e Lanciasticky. Tutti i livelli di abilità compensano l'arco verticale, usando un valore fisso dal cvar tf_bot_ballistic_elevation_rate. Poiché quella compensazione scatta solo per l'ID dell'arma base, le varianti di proiettile più veloci (Loch-n-Load, qualsiasi cosa con un modificatore di velocità del proiettile) non ricevono archi correttamente regolati. E poiché è legato specificamente all'ID dell'arma, il Loose Cannon -- un ID completamente diverso -- non riceve alcuna compensazione d'arco.

Huntsman. I bot Facili non compensano la caduta della freccia e non cercano mai colpi in testa. I bot di abilità Normale compensano l'arco, ma mirano alla testa solo entro 150 HU. I bot Difficili/Esperti mirano sempre alla testa.

Lanciarazzi. Oltre 150 HU, i bot non Facili mirano ai tuoi piedi invece che al centro del corpo, massimizzando i danni da splash e le probabilità di knockback. Entro 150 HU passano ai colpi in testa. I bot Facili mirano sempre al centro del corpo indipendentemente dalla distanza. Anche questo è bloccato dall'ID dell'arma: il Direct Hit e il Cow Mangler non ereditano il comportamento. Ha senso per il Direct Hit (nessun AoE da sfruttare); non ha alcun senso per il Cow Mangler -- questa parte dell'AI precede l'esistenza dell'arma e non è mai stata rivisitata.

Fucili da Cecchino. Facile mira al corpo. Normale mira circa al 33% dal corpo alla testa. Difficile/Esperto mirano direttamente alla testa. Importa meno in MvM, dove i colpi in testa dei bot non ricevono il bonus di danno comunque.

Udito: sensibilità ai colpi silenziosi

Ogni sparo allerta i bot nelle vicinanze sulla posizione del tiratore, anche attraverso i muri, fino a 3000 HU con una probabilità di avvistamento del 100% (tf_bot_notice_gunfire_range). Ma un sottoinsieme di armi è flaggato come "furtivo" -- udibile solo entro 500 HU (tf_bot_notice_quiet_gunfire_range), e anche in quel caso con una probabilità dipendente dall'abilità:

Abilità Probabilità di notare un colpo silenzioso
Facile 10%
Normale 30%
Difficile 60%
Esperto 90%

Quella probabilità è dimezzata se un colpo forte è stato sentito negli ultimi 3 secondi -- i suoni forti mascherano quelli silenziosi.

La lista degli ID delle armi furtive non è stata aggiornata dal dicembre 2010. Qualsiasi cosa aggiunta dopo quella data usando un ID arma nuovo di zecca viene trattata come forte per impostazione predefinita, non importa quanto logicamente dovrebbe essere silenziosa, a meno che non abbia riutilizzato un ID più vecchio. Nello specifico:

ID arma Copre
TF_WEAPON_KNIFE Tutti i coltelli della Spia
TF_WEAPON_FISTS Pugni specifici del Pesante (il suo pugno multiclasse è in realtà TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Si ritiene non usato direttamente
TF_WEAPON_PDA_ENGINEER_BUILD PDA di costruzione dell'Ingegnere
TF_WEAPON_PDA_ENGINEER_DESTROY PDA di distruzione dell'Ingegnere
TF_WEAPON_PDA_SPY Kit di travestimento della Spia
TF_WEAPON_BUILDER Toolkit Spia/Ingegnere/Sapper
TF_WEAPON_MEDIGUN Tutti i Medi Gun
TF_WEAPON_DISPENSER Probabilmente non usato (i Dispenser sono oggetti, non armi)
TF_WEAPON_INVIS Tutti gli orologi da invisibilità della Spia
TF_WEAPON_FLAREGUN Tutte le pistole lanciafiamme del Pyro eccetto il Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (non Mad Milk -- ID separato, non furtivo)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

L'esempio classico del decadimento della lista: il Manmelter ha ricevuto il proprio ID (TF_WEAPON_RAYGUN_REVENGE), aggiunto dopo che la lista furtiva è stata congelata -- quindi viene trattato come rumoroso, nonostante sia una pistola lanciafiamme in ogni senso pratico. Lo Scorch Shot, rilasciato ancora dopo, riutilizza l'ID base TF_WEAPON_FLAREGUN ed è quindi ancora considerato furtivo. Insensato, ma è il codice.

Strategia: priorità delle minacce

Quando più nemici sono visibili contemporaneamente, i bot valutano la distanza, se vengono presi di mira e -- sopra Facile -- se la minaccia primaria è in cura:

Abilità Prende di mira il curatore invece?
Facile No
Normale 50% di probabilità
Difficile Sì
Esperto Sì

I nemici oltre 500 HU sono normalmente deprioritizzati come non immediati. Eccezioni: i bot Difficili/Esperti trattano sempre i Medici e gli Ingegneri distanti come minacce immediate, e qualsiasi Cecchino nemico che mira approssimativamente nella tua direzione è sempre trattato come immediato indipendentemente da distanza e abilità.

Abilità Medici/Ingegneri/Cecchini che mirano distanti = minaccia immediata?
Facile/Normale No
Difficile/Esperto Sì

Quel controllo del Cecchino ha una storia genuinamente divertente. Il documento originale di Sigsegv presumeva che il gioco richiedesse che il prodotto scalare tra il vettore di mira del cecchino e la posizione relativa del bot fosse esattamente zero -- un confronto così preciso che non si sarebbe quasi mai attivato nell'aritmetica in virgola mobile, rendendo l'intera funzionalità effettivamente codice morto. Una correzione pubblicata in seguito (grazie a una decompilazione Hex-Rays più pulita) ha mostrato che il controllo effettivo è prodotto scalare > 0: qualsiasi Cecchino che guarda da direttamente verso di te a perpendicolare a te conta come minaccia immediata; qualsiasi cosa da perpendicolare a guardare altrove no. L'errata lettura originale proveniva da una cattiva decompilazione di un confronto SSE in virgola mobile -- il reverse-engineering di un binario AAA non è una scienza esatta.

Movimento: schivata

I bot Facili non schivano mai, punto e basta. I bot Normale e superiori schivano a sinistra/destra (33% sinistra, 33% destra, 33% non fare nulla, ponderato contro i vuoti rilevati) quando hanno un'arma da combattimento in mano, hanno visto un nemico negli ultimi 3 secondi, e quel nemico ha linea di vista su di loro.

Non schiveranno se si applica una di queste: attributo DisableDodge impostato, il comportamento corrente dice di sbrigarsi, attualmente invulnerabile (qualsiasi über), in mezzo a una provocazione/provocazione, sta giocando Ingegnere, invisibile o travestito come Spia, mirando come Cecchino o con il minigun acceso come Pesante, o in mezzo al tiro dell'Huntsman.

Movimento: evitare di spingere i nemici

Sopra Normale, i bot cercano specificamente di non sbattere contro i nemici mentre si muovono:

Abilità Evita di spingere i nemici?
Facile No
Normale No
Difficile Sì
Esperto Sì

In pratica questo è importante soprattutto per i bot Spia -- evitare una collisione imbarazzante con un giocatore nemico è esattamente il tipo di cosa che fa saltare un travestimento.

Pyro: padronanza dello scarica compressiva

Lo scarica compressiva serve a due scopi: riflettere i proiettili (PvP e MvM) e spingere i nemici vicini giù dalle piattaforme (solo PvP). Se il bot tiri effettivamente il grilletto su un'opportunità valida è un lancio della moneta basato sull'abilità:

Abilità Probabilità di attivazione scarica compressiva
Facile 0%
Normale 50%
Difficile 90%
Esperto 100%

I bot Pyro Facili non possono letteralmente usare lo scarica compressiva -- il tiro è hardcodeato per non riuscire mai, non solo "raramente."

Spia: efficacia del travestimento

Due assi separati scalano con l'abilità. Scelta del travestimento:

Abilità Metodo di travestimento
Facile/Normale Classe casuale, ignorando cosa sta effettivamente giocando la squadra nemica
Difficile/Esperto Sceglie un vero giocatore nemico e copia la sua classe esatta

Recitazione del travestimento:

Abilità Comportamento mentre travestito/invisibile
Facile/Normale Fissa i giocatori nemici quando li vede (sospetto)
Difficile/Esperto Evita deliberatamente il contatto visivo (più convincente)

Spia: aggressività della pugnalata alle spalle

A lunga distanza (fino a 300 HU, tf_bot_spy_knife_range), un bot Spia si impegna in una pugnalata alle spalle solo se può vedere la vittima e la schiena della vittima è almeno parzialmente girata. L'abilità determina quanto quel angolo dalla schiena può essere decentrato:

Abilità Tolleranza dell'angolo
Facile Ci prova anche se ti guarda direttamente
Normale ±45° dalla tua schiena
Difficile ±78° dalla tua schiena
Esperto ±90° dalla tua schiena (arco posteriore completo di 180°)

I bot Spia Facili sono funzionalmente suicidi -- tenteranno una pugnalata su qualcuno che li guarda dritto in faccia. Eccezione: in Mann vs. Machine, ogni bot Spia è forzato al vincolo di angolo Normale indipendentemente dall'abilità effettiva.

Tattiche: selezione delle armi

Scatta solo sopra Facile, e per lo più irrilevante in MvM poiché i bot lì hanno di solito restrizioni d'arma rigide:

  • Scout: passa alla secondaria quando il caricatore dell'arma primaria è vuoto.
  • Soldato: passa alla secondaria a caricatore vuoto e bersaglio più vicino di 500 HU.
  • Cecchino: passa alla secondaria per bersagli più vicini di 750 HU.
  • Pyro: passa alla secondaria per bersagli più lontani di 750 HU, a meno che quel bersaglio non sia un Soldato o un Demoman.

Tattiche: ricarica al coperto

Non usato in MvM. Se il comportamento attuale del bot non gli dice di ritirarsi, il suo caricatore principale è vuoto, e non è uberato, i bot di abilità superiore si ritirano temporaneamente al coperto per ricaricare invece di sparare a vuoto contro di te:

Abilità Si ritira per ricaricare?
Facile No
Normale No
Difficile Sì
Esperto Sì

Modalità CP: vagabondaggio del difensore

Non usato in MvM. Difendendo un punto di controllo, i bot di abilità superiore sono più propensi a lasciare il punto per cercare uccisioni ("cerca e distruggi"), ma solo con un tempo decente rimasto su tf_bot_defense_must_defend_time:

Abilità Probabilità di vagabondaggio
Facile 10%
Normale 50%
Difficile 75%
Esperto 90%

Modalità CP: blocco della cattura

Non usato in MvM. I bot difensori che contrastano un tentativo di cattura nemico:

Abilità Tenterà di bloccare la cattura?
Facile No
Normale 50% di probabilità
Difficile Sì
Esperto Sì

Tabella riassuntiva completa

Aspetto Facile Normale Difficile Esperto Note
Visione: tempo di riconoscimento 1.00s 0.50s 0.30s 0.20s
Mira: frequenza di aggiornamento 1x/s 4x/s 10x/s 20x/s Le Spie usano sempre Normale
Compensazione arco granate/sticky Sì Sì Sì Sì Loose Cannon esente
Compensazione verticale Huntsman No Sì Sì Sì
Colpi in testa Huntsman No <150 HU Sì Sì
Tiro ai piedi Lanciarazzi No Sì Sì Sì Direct Hit & Cow Mangler esenti
Punto di mira Fucile da Cecchino Corpo ~33% verso testa Testa Testa
Probabilità di notare colpi silenziosi 10% 30% 60% 90% Dimezzata se mascherata da colpi forti
Prende di mira il curatore No 50% Sì Sì
Medico/Ingegnere/Cecchino distante = minaccia No No Sì Sì
Schivata No Sì Sì Sì Lunga lista di eccezioni
Evita di spingere i nemici No No Sì Sì Rilevante soprattutto per la Spia
Probabilità di attivazione scarica compressiva 0% 50% 90% 100%
Scelta classe travestimento Spia Casuale Casuale Copia nemico reale Copia nemico reale
Contatto visivo Spia mentre travestita Fissa (ovvio) Fissa Evita (convincente) Evita
Angolo pugnalata alle spalle Spia ~0° ±45° ±78° ±90° MvM forza Normale
Logica selezione armi No Sì Sì Sì Meno rilevante in MvM
Ricarica al coperto No No Sì Sì Non in MvM
Vagabondaggio difensore CP 10% 50% 75% 90% Non in MvM
Blocco cattura CP No 50% Sì Sì Non in MvM

Conclusione

Bot Pesante di TF2 che mira con un minigun

Niente di tutto questo è il risultato di supposizioni sbagliate da parte di Valve -- è un sistema di punteggio e probabilità deliberato, completamente deterministico, semplicemente mai messo per iscritto in modo ufficiale. Qualche cosa degna di nota:

  1. "Abilità" è un insieme di manopole indipendenti, non un moltiplicatore globale. Il tempo di reazione, la frequenza di mira e ogni comportamento tattico scalano separatamente, e alcuni (frequenza di tracciamento della Spia, angolo di pugnalata in MvM) ricevono override hardcodeati indipendentemente dall'abilità.
  2. Parte di questo è genuinamente pieno di bug, non solo vecchio. La lista delle armi furtive congelata dal 2010, il Cow Mangler a cui manca la logica di tiro ai piedi senza una buona ragione, il controllo del prodotto scalare del Cecchino che ha richiesto anni per essere decompilato correttamente -- il codice AI di Valve ha tessuto cicatriziale come qualsiasi altra codebase di 17 anni.
  3. Puoi usare tutto questo. Sappi che un bot Cecchino non ti colpirà in testa in Normale, che un Pyro Facile non può letteralmente rispedirti indietro il razzo con lo scarica compressiva, che una Spia Facile proverà ad accoltellarti faccia a faccia. Non è fortuna. È un foglio tecnico.

Un enorme ringraziamento a sigsegv per l'immersione originale nel codice che ha reso possibile gran parte di questo, alla Wiki di TF2 per la documentazione di base sui comandi dei bot e il supporto delle mappe, e a tutti nella community che ancora studiano un'AI bot di 17 anni per capire esattamente perché fa quello che fa.

TF2-Bots sind nicht zufällig: Ich habe jede Schwierigkeitseinstellung zurückentwickelt

Sicht, Zielverfolgung, Spy-Rückenstich-Winkel, Sniper-Kopfschuss-Logik, jeder bekannte Bug – Valve hat nie etwas davon dokumentiert. Also haben wir den Code durchforstet und daraus ein vollständiges Datenblatt gemacht.

Einleitung

TF2-Soldier-Bot zielt mit einem Raketenwerfer

Jeder TF2-Spieler hat es mindestens einmal gesagt: "dieser Bot cheatet." Oder das Gegenteil: "warum steht dieser Easy-Bot einfach nur rum und frisst Raketen." Niemand weiß wirklich, was "Easy," "Normal," "Hard" und "Expert" unter der Haube tatsächlich bedeuten – Valve hat vier Schwierigkeitsstufen ausgeliefert und exakt null Dokumentation.

Also haben ein paar von uns (ich, awimii, Mush The Possum, mit einem großen Teil der Vorarbeit von sigsegv, der tatsächlich den dekompilierten Spielcode durchforstet hat) ein vollständiges Forschungsdokument über TFBot-Verhalten zusammengestellt. Jeder Mechanismus, jeder bekannte Bug, jede hartcodierte Wahrscheinlichkeit. Dieser Artikel ist die vollständige Ausarbeitung, nicht die gekürzte. Holt euch einen Bonk, das wird ein langer.


Kapitel I: Die Grundlagen

Bot vs. Puppet Bot

TF2 hat zwei völlig verschiedene Dinge, die die Leute "Bots" nennen:

  • KI-Bots (TFBots): echte KI, basierend auf dem gleichen PlayerBot/Infected-Framework, das Valve für die Left 4 Dead-Reihe verwendet hat. Sie wählen eine zufällige Klasse, spielen das Ziel, funktionieren ohne sv_cheats und lösen Erfolge aus wie ein echter Spieler.
  • Puppet Bots: null KI, können sich nicht bewegen oder von selbst handeln. Sie existieren ausschließlich zur manuellen Steuerung – ein Spieler kann sie zwingen, zu folgen, zu zielen und zu feuern, hauptsächlich für Tests oder für filmreife Screenshots/Videos. Ihr Erscheinen erfordert sv_cheats 1, was auch Erfolge für die Sitzung deaktiviert.

Dieser Artikel handelt ausschließlich von der ersten Art.

Was man KI-Bots (so halb) sagen kann

TFBots sind nicht direkt steuerbar, aber es gibt eine kurze Liste von Dingen, die man ihnen nahelegen kann:

  • Richte dein Fadenkreuz auf einen beliebigen Bot (freundlich oder feindlich) und er wird dich anspotten, wenn du die richtigen Sprachbefehle verwendest.
  • Ein freundlicher Medic-Bot heilt dich, wenn du den "Medic!"-Sprachbefehl verwendest.
  • Wenn ein Medic-Bot dich heilt und eine Überladung bereit hat, bewirkt "Los los los!" oder "Ladevorgang aktivieren!", dass er die Ladung sofort einsetzt.
  • Ein Medic-Bot mit bereiter Ladung setzt sie automatisch ein, sobald er oder sein Heilziel ernsthaften Schaden nimmt, ohne Sprachbefehl.
  • Bots führen spontan Partner-Spottanimationen (High Five) oder Gruppen-Spottanimationen (Conga) mit nahen Teamkameraden durch.

Bots auf nicht unterstützten Karten zum Laufen bringen

Bots verlassen sich auf ein Navigationsnetz, um zu wissen, wo sie laufen dürfen, und die meisten Community-Karten werden ohne eines ausgeliefert. So erzwingt man es:

  1. sv_cheats 1
  2. nav_generate – erstellt das anfängliche Navmesh, Fortschritt wird in der Konsole angezeigt
  3. Warten, bis das Spiel die Pfadgenerierung abgeschlossen hat
  4. Optional fehlerhafte Nav-Daten manuell mit nav_edit 1 korrigieren
  5. Server neu laden oder neustarten (Überspringen deaktiviert Erfolge)
  6. tf_bot_add <anzahl> um tatsächlich Bots zu spawnen

Warnung: Das Ändern des Navmeshs bei aktiven Bots auf dem Server kann das Spiel zum Absturz bringen. Sobald das Mesh existiert, muss es für zukünftige Sitzungen nicht neu generiert werden – füge einfach Bots mit tf_bot_add hinzu.

Automatisch generierte Meshes funktionieren am besten auf Control-Point-, King-of-the-Hill-, Payload- und CTF-Karten. Auf Mannpower-Karten verhalten sich Bots standardmäßig wie im CTF-Stil, nutzen aber Grappling Hooks oder Powerups kaum. Wenn eine Karte kein von der Bot-KI erkanntes Ziel, aber eine Spawn-Room-Entität hat, können Bots mit tf_bot_offense_must_push_time 0 trotzdem kämpfen.

(Quelle für diesen Abschnitt: die offizielle TF2-Wiki-Seite über Bots.)

Aktueller Status, Karte für Karte

Dank des Hatless-Updates funktioniert jede Klasse jetzt korrekt, einschließlich des historisch fehlerhaften Spy. Bots verhalten sich auf den meisten offiziellen KOTH-Karten, einigen Payload-Karten, Dustbowl/Gorge Attack-Defense und CTF/Mann Manor-Karten richtig – obwohl man sie auf den letzteren nicht direkt mit tf_bot_add spawnen kann. Auf nicht unterstützten Karten (über den nav_generate-Prozess oben) funktionieren sie, sind aber merklich schlechter darin, einen echten Spieler zu imitieren.

PLR-Karten sind ein hoffnungsloser Fall: Bots können die Barrieren auf Hightower nicht überwinden und bleiben in Ecken stecken, und auf allen anderen PLR-Karten haben sie... eine Tanzparty, anstatt zu spielen. Das wird vielleicht irgendwann gefixt. Vielleicht auch nicht.

Allgemeines Bot-Verhalten

Eine Sammlung von Dingen, die jeder Bot unabhängig vom Können tut:

  • Bots verwenden nur Standard-Ausrüstung (ein Plugin kann ihnen Nicht-Standard-Waffen aufzwingen, aber Vanilla-Bots wählen nie selbst welche aus).
  • Easy-Bots benutzen ihre Sekundärwaffe kaum. Höhere Schwierigkeitsgrade wechseln zur Sekundärwaffe, sobald die Primärwaffe leer ist, oder um die Reichweite auszugleichen.
  • Bots beherrschen keine Bewegungstechniken – keine Rocket Jumps, keine Gebäudeversetzung.
  • Nach einem Kill kann ein Bot spotten, sogar unter Beschuss – außer während er die feindliche Intelligence trägt, und diese Regel gilt auch in MvM.
  • Getarnte Spy-Bots (Spieler oder KI) werden von anderen Bots korrekt ignoriert – bis sie einen Feind berühren, etwas sägen, schießen oder sich in der Nähe tarnen. Sobald ein Bot/Spieler "aufgeflogen" ist, wird er als Spy erinnert, bis er die Tarnung wechselt (während er unsichtbar bleibt), stirbt oder mit dem Dead Ringer den Tod vortäuscht.
  • Pyro-Bots nutzen die Kompressionssprengung großzügig ab Easy.
  • Medic-Bots priorisieren das Heilen aller anderen vor Snipers (und in geringerem Maße Engineers), selbst wenn man als Sniper "Medic!" spampt.
  • Medic-Bots fühlen sich zu Heavies, Soldiers, Demomen und Pyros hingezogen – insbesondere wenn ein menschlicher Spieler diese Klassen spielt. Kein Mensch in diesen Rollen, keine besondere Medic-Aufmerksamkeit.
  • Bots halten während der Aufbauzeit auf Attack/Defense- und Payload-Karten Position – außer Engineers, Snipers und Spies, die sich frei bewegen (Demoman-Bots dürfen auch vorab Stickybombs platzieren).
  • Engineer-Bots verbessern oder entsägen niemals die Gebäude eines anderen freundlichen Engineers, es sei denn, dieses Gebäude befindet sich zufällig im Weg ihres Ziels. Manchmal reparieren sie auch einfach... ihren eigenen Geschützturm nicht, selbst wenn es sicher ist.
  • Enttarnte Spy-Bots wechseln zu ihrem Revolver und gehen rückwärts, anstatt einen Stich zu erzwingen.
  • Demoman-Bots, die eine Sentry gefunden haben (normalerweise, indem sie einmal daran gestorben sind), können perfekt Stickybombs aus großer Reichweite darauf werfen, die je nach Geometrie um Wände und Decken herumfliegen.
  • Sniper-Bots, die nach dem Zielen kein Ziel finden können, verwenden eine der "Negativ"-Sprachzeilen.
  • Freundliche Medics heilen einen getarnten Spy ohne Zögern.

Bekannte Probleme / Bugs

Das Dokument listet eine ganze Reihe von langjährigen Eigenheiten auf:

  • Bots können versuchen, durch bestimmte stationäre Requisiten zu laufen oder zu schießen.
  • Jedes Mal, wenn ein Spieler/Bot sich enttarnt, tarnt oder enthüllt, "sehen" es nahe Bots und drehen sich zur Reaktion – selbst wenn das Ereignis außerhalb ihres tatsächlichen Sichtfelds stattfand. Es ist nicht geräuschbasiert; es ist eine Umgehung der Sichtprüfung.
  • Selten können Bots physisch aneinander hängenbleiben, während sie einen Engineer-Teleporter benutzen.
  • Bot-Sprachbefehle (z.B. "Spy!", "Vorwärts!") werden nicht wie bei Spielern als Chat-Text angezeigt.
  • Ein Medic-Bot, der aktiv jemanden heilt, weicht keinem eingehenden Feuer aus und nimmt keine Gesundheitspakete, selbst bei kritisch niedriger HP.
  • Bots können sich während einer Partner-Spottanimation weiterbewegen, was den beabsichtigten Effekt des Festive Critical Strike zunichtemacht.
  • Kürzlich beschädigte Medic-Bots weigern sich oft, die Syringe Gun auf Distanz zu benutzen, und bevorzugen Nahkampf (oder, in sehr seltenen Fällen, versuchen sie, dich mit dem Medi Gun-Strahl selbst zu treffen).
  • Medic-Bots kompensieren nicht den Gravitationsabfall bei Syringe-Gun-Schüssen – wahrscheinlich, weil die Waffe im KI-Code nicht korrekt als Nicht-Hitscan markiert ist.
  • Spy-Bots können einen getarnten Spy (Spieler oder KI) sehen und verfolgen, wenn dieser Spy bereits einmal enttarnt wurde, unabhängig vom Können des verfolgenden Bots.
  • Selbst wenn ein Spieler-Spy sich als Klasse des eigenen Teams tarnt, enttarnt das Rennen gegen einen Feind sie trotzdem (Bots tun dies nie bei sich selbst, da Bots sich nie als ihr eigenes Team tarnen).
  • Bots respektieren das Team-Auto-Balancing – wenn du Bots auf einem Team stapeln willst, brauchst du zuerst mp_teams_unbalance_limit 0.
  • Engineer-Bots können ihre eigenen Gebäude einfach ignorieren, bis sie zerstört sind.
  • Heavy-Bots versuchen manchmal, die Minigun abzufeuern, während sie kritisch wenig Munition haben, meist unterhalb von Hard.
  • Medic-Bots des verlierenden Teams begehen gelegentlich während der Demütigungsphase Selbstmord, wenn keine Feinde in der Nähe sind – etwas, das ein menschlicher Spieler nicht einmal durch Versuche reproduzieren kann.
  • Wenn du in der Ladebildschirm-Teamvorschau BLU auswählst, werden RED-Bots für dich visuell als BLU dargestellt.
  • Bots mit gezogenem Nahkampf weigern sich manchmal, die Waffe zu wechseln, selbst nachdem sie Munition aufgenommen haben.
  • Nach Jungle Inferno können Bots, die mit expliziten Parametern gespawnt wurden (z.B. tf_bot_add 5 pyro blu normal), sofort in ihrem eigenen Spawn-Room sterben. Lösung: tf_bot_reevaluate_class_in_spawnroom 0 (benötigt sv_cheats 1).

KI-Namen

Bot-Namen stammen aus einem großen Pool von Referenzen zu TF2, anderen Valve-Spielen und der Programmierkultur, hauptsächlich weil die Community auf den Steam-Foren immer wieder bestimmte Namen angefragt hat. Eine Auswahl der Liste: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF und Dutzende weitere in dieser Art.

Es gibt auch eine Reihe von Namen, die in einem geleakten Source-Build gefunden wurden, aber nie in der Produktion ausgeliefert wurden, aus unklaren Gründen – hauptsächlich Last Dragon- und The Fifth Element-Referenzen wie John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh? und I'm your huckleberry.

Du kannst all das selbst überschreiben: tf_bot_add heavyweapons blau "Blauer Hoovy" spawned einen benannten BLU-Heavy namens "Blauer Hoovy."


Kapitel II: Die originalen Bots / TFBots – Tiefer Tauchgang in die Fähigkeitsstufen

Sigsegvs ursprünglicher Rahmen gilt immer noch: Es ist offensichtlich, dass Expert-Bots besser spielen als Easy-Bots, aber Valve hat nie erklärt, wie viel oder warum. Der einzige Weg, es zu wissen, ist, den Code zu lesen. Hier ist jeder Mechanismus, der mit dem Können skaliert.

Schwierigkeit einstellen

Außerhalb von MvM wird die Schwierigkeit von einem Cvar gesteuert:

tf_bot_difficulty Fähigkeitsstufe
0 Easy
1 Normal (Standard)
2 Hard
3 Expert

tf_bot_add akzeptiert auch direkt ein Schwierigkeitsargument (easy/normal/hard/expert).

MvM-Popfiles

In Mann vs. Machine hat jeder TFBot-Spawner-Block im Popfile einen optionalen Skill-Schlüssel. Kein Schlüssel bedeutet Easy. In Valves eigenen Missionen: Giants sind fast immer Expert, Engineers und Spies sind fast immer Expert, und Snipers sind meistens Hard (gelegentlich Expert). Wenn du EventChangeAttributes (hinzugefügt im Two Cities-Update) verwendest, um Bots mitten in einer Welle basierend auf Kartenereignissen dynamisch zu verändern, ist die Bot-Fähigkeit eine der Eigenschaften, die du im laufenden Betrieb ändern kannst.

MvM-Endlosmodus

Der Endlosmodus wurde nie offiziell ausgeliefert, aber darin geben Bots ihr Geld für Verbesserungen aus, genau wie Spieler – einschließlich eines Bot-exklusiven Upgrades, das ihre KI-Fähigkeitsstufe mitten im Spiel erhöht.

Die bot_generator-Entität

Eine obskure, weitgehend undokumentierte Entität, von der angenommen wird, dass sie im Trainingsmodus und möglicherweise in der frühen MvM-Entwicklung verwendet wurde. Sie stellt einen SetDifficulty-Input zur Steuerung der Fähigkeitsstufe bereit. Darüber hinaus verliert sich die Spur – Valve hat es nie dokumentiert und niemand hat sein Verhalten vollständig kartiert.

Augenleuchtfarbe

MvM-Roboter haben ein Augenleucht-Partikel, das mit der Fähigkeitsstufe die Farbe ändert – ein visuelles Indiz, das außerhalb der Community noch nie jemand erklärt hat:

Fähigkeit Augenfarbe RGB
Easy/Normal Blau #24b4ff
Hard/Expert Gelb #fff000

TF2-Heavy-Bot in entspannter Haltung

Sicht: Erkennungszeit

Ein Bot reagiert nicht sofort, wenn etwas in sein Sichtfeld gelangt – es gibt eine hartcodierte Verzögerung, bevor der Rest der KI die Bedrohung überhaupt zur Kenntnis nehmen darf:

Fähigkeit Minimale Erkennungszeit
Easy 1,00 s
Normal 0,50 s
Hard 0,30 s
Expert 0,20 s

Das ist der Großteil des "Easy-Bots fühlen sich dumm an"-Effekts in einer einzigen Zahl – ein Easy-Bot zielt nicht schlechter, sobald er dich bemerkt hat, er braucht nur fünfmal länger, um deine Existenz zu bemerken.

Zielen: Nachführrate

Bots verfolgen dich nicht kontinuierlich. Sie erfassen deine Position und Geschwindigkeit in einem festen Intervall und sagen eine gerade Linie voraus:

Fähigkeit Neuberechnungsintervall Entsprechende Rate
Easy 1,00 s 1x/s
Normal 0,25 s 4x/s
Hard 0,10 s 10x/s
Expert 0,05 s 20x/s

Ausnahme: Spy-Bots sind hartcodiert auf die Normal-Verfolgungsrate, unabhängig von ihrer tatsächlichen Fähigkeitsstufe – ein Expert-Spy zielt immer noch wie ein Normal-Bot. Es gibt auch ein öffentliches Demonstrationsvideo, das die Verfolgungsraten nebeneinander vergleicht, falls du die 1x- vs. 20x-Lücke in Aktion sehen möchtest.

Zielen: waffenspezifisches Können

Bots zielen nicht nur auf deinen Masseschwerpunkt – sie haben eine Pro-Waffen-Logik, die teilweise wirklich fehlerhaft ist:

Grenade Launcher & Sticky Launcher. Alle Fähigkeitsstufen kompensieren den vertikalen Bogen, basierend auf einem festen Wert aus dem Cvar tf_bot_ballistic_elevation_rate. Da diese Kompensation nur für die Basis-Waffen-ID greift, erhalten schnellere Projektilvarianten (Loch-n-Load, alles mit einem Projektiltempo-Modifikator) keine korrekt angepassten Bögen. Und da es spezifisch an die Waffen-ID gebunden ist, erhält die Loose Cannon – eine völlig andere ID – überhaupt keine Bogenkompensation.

Huntsman. Easy-Bots kompensieren keinen Pfeilabfall und zielen nie auf den Kopf. Normal-Bots kompensieren den Bogen, zielen aber nur innerhalb von 150 HU auf den Kopf. Hard/Expert-Bots zielen immer auf den Kopf.

Raketenwerfer. Jenseits von 150 HU zielen Nicht-Easy-Bots auf deine Füße statt auf den Masseschwerpunkt, um den Flächenschaden und die Rückstoß-Wahrscheinlichkeit zu maximieren. Innerhalb von 150 HU wechseln sie zu Kopfschüssen. Easy-Bots zielen unabhängig von der Entfernung immer auf den Masseschwerpunkt. Auch dies ist waffen-ID-beschränkt: Der Direct Hit und der Cow Mangler erben das Verhalten nicht. Macht Sinn für den Direct Hit (kein AoE zum Ausnutzen); macht gar keinen Sinn für den Cow Mangler – dieser Teil der KI existierte vor der Waffe und wurde einfach nie überarbeitet.

Sniper-Gewehre. Easy zielt auf den Körper. Normal zielt etwa 33% des Weges vom Körper zum Kopf. Hard/Expert zielen direkt auf den Kopf. Weniger relevant in MvM, wo Bot-Kopfschüsse ohnehin keinen Schadensbonus erhalten.

Gehör: Empfindlichkeit gegenüber verdeckten Schüssen

Jeder Schuss alarmiert nahe Bots über die Position des Schützen, sogar durch Wände, bis zu 3000 HU mit 100% Entdeckungswahrscheinlichkeit (tf_bot_notice_gunfire_range). Aber eine Teilmenge von Waffen ist als "leise" markiert – nur innerhalb von 500 HU hörbar (tf_bot_notice_quiet_gunfire_range), und selbst dann mit einer fähigkeitsabhängigen Chance:

Fähigkeit Chance, einen leisen Schuss zu bemerken
Easy 10%
Normal 30%
Hard 60%
Expert 90%

Diese Wahrscheinlichkeit wird halbiert, wenn in den letzten 3 Sekunden ein lauter Schuss gehört wurde – laute Geräusche überdecken leise.

Die Liste der leisen Waffen-IDs wurde seit Dezember 2010 nicht aktualisiert. Alles, was nach diesem Datum mit einer brandneuen Waffen-ID hinzugefügt wurde, wird standardmäßig als laut behandelt, egal wie leise es logischerweise sein sollte, es sei denn, es hat zufällig eine ältere ID wiederverwendet. Konkret:

Waffen-ID Deckt ab
TF_WEAPON_KNIFE Alle Spy-Messer
TF_WEAPON_FISTS Heavy-spezifische Schläge (sein Multi-Class-Schlag ist tatsächlich TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Vermutlich direkt ungenutzt
TF_WEAPON_PDA_ENGINEER_BUILD Engineer's Bau-PDA
TF_WEAPON_PDA_ENGINEER_DESTROY Engineer's Zerstörungs-PDA
TF_WEAPON_PDA_SPY Spy's Tarnkasten
TF_WEAPON_BUILDER Spy's Engineer/Sapper-Werkzeugsatz
TF_WEAPON_MEDIGUN Alle Medi Guns
TF_WEAPON_DISPENSER Vermutlich ungenutzt (Dispenser sind Objekte, keine Waffen)
TF_WEAPON_INVIS Alle Spy-Tarnuhren
TF_WEAPON_FLAREGUN Alle Pyro-Flare-Guns außer dem Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (nicht Mad Milk – separate, nicht-leise ID)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Das klassische Beispiel für die verrottende Liste: Der Manmelter bekam eine eigene ID (TF_WEAPON_RAYGUN_REVENGE), die nach dem Einfrieren der Leise-Liste hinzugefügt wurde – also wird er als laut behandelt, obwohl er in jeder praktischen Hinsicht eine Flare Gun ist. Der Scorch Shot, der noch später veröffentlicht wurde, verwendet die Basis-ID TF_WEAPON_FLAREGUN wieder und gilt daher immer noch als leise. Unsinnig, aber das ist der Code.

Strategie: Bedrohungspriorisierung

Wenn mehrere Feinde gleichzeitig sichtbar sind, gewichten Bots Entfernung, ob sie selbst beschossen werden und – über Easy hinaus – ob die primäre Bedrohung geheilt wird:

Fähigkeit Zieliert stattdessen den Heiler?
Easy Nein
Normal 50% Chance
Hard Ja
Expert Ja

Feinde jenseits von 500 HU werden normalerweise als nicht unmittelbar herabgestuft. Ausnahmen: Hard/Expert-Bots behandeln entfernte Medics und Engineers immer als unmittelbare Bedrohung, und jeder feindliche Sniper, der ungefähr in deine Richtung zielt, wird immer als unmittelbare Bedrohung behandelt, unabhängig von Entfernung und Fähigkeit.

Fähigkeit Entfernte Medics/Engineers/zielende Snipers = sofortige Bedrohung?
Easy/Normal Nein
Hard/Expert Ja

Diese Sniper-Prüfung hat eine wirklich lustige Geschichte. Sigsegvs ursprüngliche Ausarbeitung nahm an, dass das Spiel verlangt, dass das Skalarprodukt zwischen dem Zielvektor des Snipers und der relativen Position des Bots exakt null ist – ein Vergleich so präzise, dass er in Gleitkomma-Mathematik fast nie ausgelöst würde, was die gesamte Funktion effektiv zu totem Code macht. Eine später veröffentlichte Korrektur (mit Dank an eine sauberere Hex-Rays-Dekompilierung) zeigte, dass die eigentliche Prüfung Skalarprodukt > 0 ist: Jeder Sniper, der irgendwo von direkt-auf-dich bis senkrecht-zu-dir blickt, gilt als sofortige Bedrohung; alles von senkrecht bis wegschauend nicht. Die Fehlinterpretation entstand durch eine schlechte Dekompilierung eines SSE-Gleitkommavergleichs – Rückentwicklung einer AAA-Binärdatei ist keine exakte Wissenschaft.

Bewegung: Ausweichen

Easy-Bots weichen nie aus, Punkt. Normal- und höhere Bots weichen nach links/rechts aus (33% links, 33% rechts, 33% nichts tun, gewichtet gegen erkannte Lücken), wenn sie eine Kampfwaffe halten, in den letzten 3 Sekunden einen Feind gesehen haben und dieser Feind Sichtlinie zu ihnen hat.

Sie weichen nicht aus, wenn eines der folgenden zutrifft: DisableDodge-Attribut gesetzt, aktuelles Verhalten sagt "beeilen", derzeit unverwundbar (jede Überladung), mitten in einer Spott-/Provokationsanimation, spielt Engineer, unsichtbar oder als Spy getarnt, als Sniper eingezielt oder als Heavy aufgedreht, oder mitten im Huntsman-Spannen.

Bewegung: Vermeidung von Feindberührung

Ab Normal versuchen Bots gezielt, nicht in Feinde zu rennen:

Fähigkeit Vermeidet Zusammenstöße mit Feinden?
Easy Nein
Normal Nein
Hard Ja
Expert Ja

In der Praxis ist das nur für Spy-Bots wirklich relevant – eine unangenehme Kollision mit einem feindlichen Spieler zu vermeiden, ist genau die Art von Ding, die eine Tarnung auffliegen lässt.

Pyro: Luftstoß-Beherrschung

Luftstoß dient zwei Zwecken: Reflektieren von Projektilen (PvP und MvM) und Schubsen naher Feinde von Kanten (nur PvP). Ob der Bot bei einer gültigen Gelegenheit tatsächlich abdrückt, ist ein fähigkeitsbasierter Münzwurf:

Fähigkeit Luftstoß-Auslösewahrscheinlichkeit
Easy 0%
Normal 50%
Hard 90%
Expert 100%

Easy-Pyro-Bots können buchstäblich keinen Luftstoß ausführen – der Wurf ist hartcodiert, um niemals zu gelingen, nicht nur "selten."

Spy: Tarnungseffektivität

Zwei separate Achsen skalieren mit dem Können. Tarnungsauswahl:

Fähigkeit Tarnungsmethode
Easy/Normal Zufällige Klasse, ignoriert, was das feindliche Team tatsächlich spielt
Hard/Expert Wählt einen echten feindlichen Spieler aus und kopiert dessen genaue Klasse

Tarnungsverhalten:

Fähigkeit Verhalten während getarnt/getarnt
Easy/Normal Starrt feindliche Spieler an, wenn es sie sieht (verdächtig)
Hard/Expert Vermeidet bewusst Blickkontakt (überzeugender)

Spy: Rückenstich-Aggression

Auf große Entfernung (bis zu 300 HU, tf_bot_spy_knife_range) führt ein Spy-Bot einen Rückenstich nur aus, wenn er das Opfer sehen kann und der Rücken des Opfers zumindest teilweise zugewandt ist. Das Können bestimmt, wie weit dieser Rückenwinkel von der Mitte abweichen darf:

Fähigkeit Winkeltoleranz
Easy Versucht es auch, wenn du ihn direkt ansiehst
Normal ±45° von deinem Rücken
Hard ±78° von deinem Rücken
Expert ±90° von deinem Rücken (voller hinterer 180°-Bogen)

Easy-Spy-Bots sind funktional selbstmörderisch – sie versuchen einen Stich an jemandem, der sie direkt anstarrt. Ausnahme: In Mann vs. Machine wird jeder Spy-Bot unabhängig von seiner tatsächlichen Fähigkeit auf die Normal-Winkelbeschränkung gezwungen.

Taktik: Waffenauswahl

Greift nur oberhalb von Easy und ist in MvM meist irrelevant, da Bots dort meist harte Waffenbeschränkungen haben:

  • Scout: wechselt zur Sekundärwaffe, wenn das Magazin der Primärwaffe leer ist.
  • Soldier: wechselt zur Sekundärwaffe bei leerem Magazin und Ziel näher als 500 HU.
  • Sniper: wechselt zur Sekundärwaffe für Ziele näher als 750 HU.
  • Pyro: wechselt zur Sekundärwaffe für Ziele weiter als 750 HU, es sei denn, dieses Ziel ist ein Soldier oder Demoman.

Taktik: Deckung nachladen

Nicht in MvM verwendet. Wenn das aktuelle Verhalten des Bots ihm nicht sagt, dass er sich zurückziehen soll, sein Hauptmagazin leer ist und er keine Überladung hat, ziehen sich höherstufige Bots vorübergehend in Deckung zurück, um nachzuladen, anstatt mit einer leeren Waffe auf dich zu klicken:

Fähigkeit Zieht sich zum Nachladen zurück?
Easy Nein
Normal Nein
Hard Ja
Expert Ja

CP-Modus: Verteidiger-Streifzug

Nicht in MvM verwendet. Bei der Verteidigung eines Control Points verlassen höherstufige Bots mit höherer Wahrscheinlichkeit den Punkt, um Kills zu jagen ("search and destroy"), aber nur mit einer anständigen Menge an verbleibender Zeit auf tf_bot_defense_must_defend_time:

Fähigkeit Wahrscheinlichkeit zu streifen
Easy 10%
Normal 50%
Hard 75%
Expert 90%

CP-Modus: Eroberungsblockade

Nicht in MvM verwendet. Verteidigende Bots, die einen feindlichen Eroberungsversuch anfechten:

Fähigkeit Wird versuchen, die Eroberung zu blockieren?
Easy Nein
Normal 50% Chance
Hard Ja
Expert Ja

Die vollständige Übersichtstabelle

Aspekt Easy Normal Hard Expert Anmerkungen
Sicht: Erkennungszeit 1,00s 0,50s 0,30s 0,20s
Zielen: Nachführrate 1x/s 4x/s 10x/s 20x/s Spies verwenden immer Normal
Granaten-/Sticky-Bogenkompensation Ja Ja Ja Ja Loose Cannon ausgenommen
Huntsman vertikale Kompensation Nein Ja Ja Ja
Huntsman-Kopfschüsse Nein <150 HU Ja Ja
Raketenwerfer-Fußschüsse Nein Ja Ja Ja Direct Hit & Cow Mangler ausgenommen
Sniper-Gewehr-Zielpunkt Körper ~33% zum Kopf Kopf Kopf
Chance, leise Schüsse zu bemerken 10% 30% 60% 90% Halbiert, wenn durch laute Schüsse überdeckt
Zieliert den Heiler Nein 50% Ja Ja
Entfernter Medic/Engineer/Sniper = Bedrohung Nein Nein Ja Ja
Ausweichen Nein Ja Ja Ja Lange Ausnahmeliste
Vermeidet Zusammenstöße mit Feinden Nein Nein Ja Ja Meist relevant für Spy
Luftstoß-Auslösewahrscheinlichkeit 0% 50% 90% 100%
Spy-Tarnung-Klassenwahl Zufällig Zufällig Passt zu echtem Feind Passt zu echtem Feind
Spy-Blickkontakt während Tarnung Starrt (offensichtlich) Starrt Vermeidet (überzeugend) Vermeidet
Spy-Rückenstich-Winkel ~0° ±45° ±78° ±90° MvM erzwingt Normal
Waffenauswahl-Logik Nein Ja Ja Ja Weniger relevant in MvM
Deckung nachladen Nein Nein Ja Ja Nicht in MvM
CP-Verteidiger-Streifzug 10% 50% 75% 90% Nicht in MvM
CP-Eroberungsblockade Nein 50% Ja Ja Nicht in MvM

Fazit

TF2-Heavy-Bot zielt mit einer Minigun

Nichts davon ist auf Valves Seite ein falsches Rätselraten – es ist ein bewusstes, vollständig deterministisches Bewertungs- und Wahrscheinlichkeitssystem, das nur nirgendwo offiziell festgehalten wurde. Ein paar Dinge, die man sich merken sollte:

  1. "Können" ist ein Bündel unabhängiger Stellschrauben, kein einzelner globaler Multiplikator. Reaktionszeit, Zielrate und jedes taktische Verhalten skalieren separat, und einige (Spy-Verfolgungsrate, MvM-Rückenstichwinkel) erhalten hartcodierte Überschreibungen unabhängig vom Können.
  2. Einiges davon ist wirklich fehlerhaft, nicht nur alt. Die seit 2010 eingefrorene Liste der leisen Waffen, der Cow Mangler, dem aus gutem Grund die Fußziel-Logik fehlt, die Sniper-Skalarprodukt-Prüfung, die Jahre brauchte, um korrekt dekompiliert zu werden – Valves KI-Code hat Narbengewebe wie jede andere 17 Jahre alte Codebasis.
  3. Du kannst all das nutzen. Wisse, dass ein Sniper-Bot dir auf Normal keinen Kopfschuss verpasst, dass ein Easy-Pyro buchstäblich deine Rakete nicht zurückwerfen kann, dass ein Easy-Spy versuchen wird, dich von Angesicht zu Angesicht zu erstechen. Es ist kein Glück. Es ist ein Datenblatt.

Großer Dank an sigsegv für das ursprüngliche Eintauchen in den Code, das den Großteil davon ermöglicht hat, an die TF2-Wiki für die Basisdokumentation zu Bot-Befehlen und Kartenunterstützung, und an alle in der Community, die immer noch an einer 17 Jahre alten Bot-KI herumstochern, um genau herauszufinden, warum sie tut, was sie tut.

Боты TF2 не случайны: я разобрал каждую настройку сложности

Зрение, отслеживание цели, углы ударов в спину у шпиона, логика хедшотов снайпера и все известные баги -- Valve никогда ничего не документировала. Поэтому мы прошерстили код и превратили его в полную спецификацию.

Введение

Солдат-бот TF2, целящийся из ракетомёта

Каждый игрок в TF2 хотя бы раз говорил: «этот бот читает» или наоборот: «почему этот лёгкий бот просто стоит и ест ракеты». Никто толком не знает, что «Лёгкий», «Средний», «Сложный» и «Эксперт» на самом деле значат под капотом -- Valve выпустила четыре ярлыка сложности и ровно ноль страниц документации.

Поэтому мы (я, awimii, Mush The Possum, а также sigsegv, проделавший огромную работу по изучению дизассемблированного кода игры) собрали полный исследовательский документ о поведении TFBot. Каждый механизм, каждый известный баг, каждая хардкодная вероятность. Эта статья -- полная версия. Возьмите Bonk, это будет долго.


Глава I: Основы

Бот против кукольного бота

В TF2 два совершенно разных типа существ, которых называют «ботами»:

  • AI-боты (TFBots): настоящий искусственный интеллект, построенный на том же фреймворке PlayerBot/Infected, который Valve использовала в серии Left 4 Dead. Они выбирают случайный класс, играют по целям, работают без sv_cheats и получают достижения, как настоящий игрок.
  • Кукольные боты: ноль ИИ, не могут двигаться или действовать самостоятельно. Существуют исключительно для ручного управления -- игрок может заставить их следовать за собой, целиться и стрелять. В основном используются для тестирования или создания постановочных скриншотов/видео. Для их появления требуется sv_cheats 1, что также отключает получение достижений на сессию.

Эта статья целиком о первом типе.

Что AI-ботам можно (отчасти) приказать делать

TFBots не поддаются прямому управлению, но есть короткий список действий, на которые их можно подтолкнуть:

  • Наведите прицел на любого бота (дружественного или врага), и он выполнит насмешку, если вы используете правильные голосовые команды.
  • Дружественный бот-медик лечит вас, если вы используете голосовую команду «Medic!».
  • Если бот-медик лечит вас и у него готова ÜberCharge, скажите «Go go go!» или «Activate charging!» -- и он активирует заряд немедленно.
  • Медик с готовым зарядом активирует его автоматически в момент, когда он или его цель получает серьёзный урон -- голосовая команда не нужна.
  • Боты могут спонтанно выполнять парные насмешки (High Five) или групповые (Conga) с ближайшими союзниками.

Как заставить ботов работать на неподдерживаемых картах

Боты полагаются на навигационную сетку (navmesh), чтобы знать, где им разрешено ходить, и большинство пользовательских карт не имеют встроенной сетки. Принудительное создание:

  1. sv_cheats 1
  2. nav_generate -- строит начальную навигационную сетку, прогресс отображается в консоли
  3. Дождитесь завершения генерации путей
  4. При необходимости исправьте некорректные данные навигации вручную с помощью nav_edit 1
  5. Перезагрузите или перезапустите сервер (пропуск этого шага отключает достижения)
  6. tf_bot_add <число> для фактического появления ботов

Предупреждение: изменение навигационной сетки при активных ботах на сервере может привести к вылету игры. После создания сетки перегенерировать её для будущих сессий не нужно -- просто добавляйте ботов заново через tf_bot_add.

Автоматически сгенерированные сетки лучше всего работают на картах Control Point, King of the Hill, Payload и CTF. На картах Mannpower боты по умолчанию ведут себя как в CTF, но почти не используют крюки-кошки и усиления. Если на карте нет цели, которую AI-бот распознаёт, но есть точка появления, установка tf_bot_offense_must_push_time 0 позволяет ботам сражаться в любом случае.

(Источник для этого раздела: официальная страница «Боты» на TF2 Wiki.)

Текущее состояние, карта за картой

Благодаря обновлению Hatless теперь все классы работают корректно, включая исторически багнутого шпиона. Боты ведут себя нормально на большинстве официальных KOTH-карт, некоторых Payload-картах, Dustbowl/Gorge Attack-Defense и CTF/Mann Manor -- хотя на последних двух их нельзя напрямую заспавнить через tf_bot_add. На неподдерживаемых картах (через описанный выше nav_generate) они работают, но заметно хуже имитируют настоящего игрока.

PLR-карты безнадёжны: боты не могут пройти через барьеры на Hightower и застревают в углах, а на всех остальных PLR-картах они просто устраивают танцы вместо игры. Возможно, это когда-нибудь исправят. А может, и нет.

Общее поведение ботов

Набор фактов, применимых к любому боту независимо от уровня сложности:

  • Боты используют только стандартное снаряжение (плагин может заставить их использовать нестандартное оружие, но обычные боты никогда не выбирают его сами).
  • Лёгкие боты почти не используют вторичное оружие. На более высоких сложностях они переключаются на вторичное, как только основное опустошено, или для компенсации дистанции.
  • Боты не умеют выполнять технику передвижения -- никаких ракетных прыжков, перемещения строений.
  • После убийства бот может выполнить насмешку, даже под огнём -- кроме случаев, когда он несёт вражескую разведданные; это правило действует и в MvM.
  • Замаскированные боты-шпионы (игроки или AI) корректно игнорируются другими ботами -- пока они не коснутся врага, не поставят сапёр, не выстрелят или не расскрывают себя маскировкой рядом с кем-то. После раскрытия конкретный бот/игрок запоминается как шпион, пока не сменит маскировку, оставаясь невидимым, не умрёт или не симулирует смерть с Dead Ringer.
  • Боты-поджигатели широко используют Compression Blast на любой сложности выше Лёгкой.
  • Боты-медики в первую очередь лечат всех, кроме снайперов (и, в меньшей степени, инженеров), даже если вы спамите «Medic!», играя за эти классы.
  • Боты-медики тяготеют к тяжеловооружённым, солдатам, подрывникам и поджигателям -- особенно если за эти классы играет человек. Если людей в этих ролях нет, медики не уделяют им особого внимания.
  • Боты занимают позиции во время подготовки на картах Attack/Defense и Payload -- кроме инженеров, снайперов и шпионов, которые двигаются свободно (подрывникам также разрешено заранее размещать липучки).
  • Боты-инженеры никогда не улучшают и не снимают сапёры с построек другого дружественного инженера, если только эта постройка не оказывается на пути их цели. Они также иногда просто не ремонтируют свою собственную турель, даже когда это безопасно.
  • Замеченные боты-шпионы переключаются на револьвер и отступают вместо того, чтобы насильно наносить удар в спину.
  • Боты-подрывники, обнаружившие турель (обычно умерев от неё один раз), могут идеально забрасывать на неё липучки из-за пределов её досягаемости, огибая стены и потолки, если позволяет геометрия.
  • Боты-снайперы, которые не могут найти цель после прицеливания, используют одну из голосовых реплик из набора «Negative».
  • Дружественные медики будут лечить замаскированного шпиона без колебаний.

Известные проблемы / баги

Документ содержит внушительный список давних странностей:

  • Боты могут пытаться ходить или стрелять сквозь некоторые статичные объекты.
  • Когда какой-либо игрок/бот снимает маскировку, маскируется или раскрывается, ближайшие боты «видят» это и поворачиваются в ответ -- даже если событие произошло вне их реального поля зрения. Это не звуковой эффект; это обход проверки зрения.
  • Редко боты могут физически застревать друг в друге, используя телепорт инженера.
  • Голосовые команды ботов (например, «Spy!», «Forward!») не отображаются в чате, как у игроков.
  • Бот-медик, активно лечащий кого-то, не уклоняется от входящего огня и не подбирает аптечки, даже при критически низком уровне здоровья.
  • Боты могут продолжать двигаться во время парной насмешки, что ломает задуманный эффект Festive Critical Strike.
  • Недавно раненые боты-медики часто отказываются использовать Syringe Gun на дистанции, предпочитая холодное оружие (или, в очень редких случаях, пытаясь ударить вас самим лучом Medi Gun).
  • Боты-медики не компенсируют гравитационное падение для выстрелов из Syringe Gun -- вероятно, потому что оружие некорректно помечено как не-хитскан в AI-коде.
  • Боты-шпионы могут видеть и отслеживать замаскированного шпиона (игрока или AI), если этот шпион уже раскрыл себя хотя бы раз, независимо от уровня навыка следящего бота.
  • Даже если игрок-шпион маскируется под класс своей команды, столкновение с врагом всё равно раскрывает его (боты никогда не делают этого с собой, так как никогда не маскируются под свою команду).
  • Боты соблюдают авто-баланс команд -- если вы пытаетесь набрать ботов на одну сторону, сначала нужно mp_teams_unbalance_limit 0.
  • Боты-инженеры могут напрочь игнорировать свои собственные постройки, пока те не будут уничтожены.
  • Боты-пулемётчики иногда пытаются стрелять из Минигана при критически малом боезапасе, в основном ниже сложности Hard.
  • Боты-медики проигрывающей команды иногда совершают самоубийство во время фазы Humiliation, когда рядом нет врагов -- то, что игрок-человек не может повторить даже намеренно.
  • Установка предпросмотра команды в окне загрузки на BLU заставляет RED ботов визуально отображаться как BLU.
  • Боты с холодным оружием иногда отказываются переключаться на другое оружие даже после подбора патронов.
  • После обновления Jungle Inferno боты, заспавненные с явными параметрами (например, tf_bot_add 5 pyro blue normal), могут мгновенно умирать в собственной точке появления. Исправление: tf_bot_reevaluate_class_in_spawnroom 0 (требуется sv_cheats 1).

AI-имена

Имена ботов берутся из большого пула отсылок к TF2, другим играм Valve и программистской культуре -- в основном потому, что сообщество постоянно запрашивало конкретные имена на форумах Steam. Примеры из списка: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF и десятки других в том же духе.

Также есть партия имён, найденных в утекшей сборке исходников, которая никогда не выходила в продакшн по неясным причинам -- в основном отсылки к Last Dragon и Пятому элементу: John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh? и I'm your huckleberry.

Вы можете переопределить это самостоятельно: tf_bot_add heavyweapons blue "Blu Hoovy" создаёт именованного BLU-пулемётчика по имени «Blu Hoovy».


Глава II: Оригинальные боты / TFBots -- глубокое погружение в уровни навыка

Исходная формулировка sigsegv всё ещё актуальна: очевидно, что боты-эксперты превосходят лёгких ботов, но Valve никогда не объясняла насколько или почему. Так что единственный способ узнать -- прочитать код. Вот все механики, которые меняются в зависимости от навыка.

Установка сложности

Вне MvM сложность контролируется одной консольной переменной:

tf_bot_difficulty Уровень навыка
0 Лёгкий
1 Средний (по умолчанию)
2 Сложный
3 Эксперт

tf_bot_add также принимает аргумент сложности напрямую (easy/normal/hard/expert).

MvM pop-файлы

В Mann vs. Machine каждый блок спавна TFBot в pop-файле имеет опциональный ключ Skill. Если ключа нет -- Лёгкий уровень. В миссиях от Valve: Гиганты почти всегда Эксперты, Инженеры и Шпионы почти всегда Эксперты, а Снайперы обычно Сложные (изредка Эксперты). Если вы используете EventChangeAttributes (добавлено в обновлении Two Cities) для динамического изменения ботов во время волны на основе событий на карте, навык бота -- одно из свойств, которые можно менять на лету.

MvM Endless Mode

Бесконечный режим никогда официально не выходил, но в нём боты тратят деньги на улучшения, как и игроки -- включая эксклюзивное для ботов улучшение, повышающее их AI-навык по ходу игры.

Сущность bot_generator

Малоизвестная, почти недокументированная сущность, предположительно использовавшаяся в тренировочном режиме и, возможно, в ранней разработке MvM. Она принимает входной сигнал SetDifficulty для управления уровнем навыка. Дальше след теряется -- Valve никогда её не документировала, и никто полностью не изучил её поведение.

Цвет свечения глаз

Роботы в MvM имеют частицы свечения глаз, меняющие цвет в зависимости от уровня навыка -- визуальная подсказка, которую никто за пределами сообщества никогда не объяснял:

Навык Цвет глаз RGB
Лёгкий/Средний Синий #24b4ff
Сложный/Эксперт Жёлтый #fff000

Тяжеловооружённый бот TF2 в стойке ожидания

Зрение: время распознавания

Бот реагирует не в тот момент, когда что-то входит в его поле зрения -- есть хардкодная задержка, прежде чем остальная часть AI вообще может признать угрозу:

Навык Минимальное время распознавания
Лёгкий 1.00 с
Средний 0.50 с
Сложный 0.30 с
Эксперт 0.20 с

В этом одном числе кроется большая часть эффекта «лёгкие боты кажутся тупыми» -- лёгкий бот целится не хуже, когда замечает вас, ему просто нужно в пять раз больше времени, чтобы заметить ваше существование.

Прицеливание: частота обновления

Боты не отслеживают вас непрерывно. Они снимают вашу позицию и скорость через фиксированные интервалы и предсказывают прямую линию оттуда:

Навык Интервал пересчёта Эквивалентная частота
Лёгкий 1.00 с 1 раз/с
Средний 0.25 с 4 раз/с
Сложный 0.10 с 10 раз/с
Эксперт 0.05 с 20 раз/с

Исключение: боты-шпионы хардкодно привязаны к скорости отслеживания Среднего уровня независимо от их фактического навыка -- Эксперт-шпион всё равно целится как Средний бот. Существует также публичное демонстрационное видео, сравнивающее скорость отслеживания бок о бок, если вы хотите увидеть разницу между 1x и 20x в движении.

Прицеливание: оружие-специфичный навык

Боты не просто наводятся на центр вашей массы -- у них есть логика для каждого оружия, местами откровенно багнутая:

Гранатомёт и липучий гранатомёт. Все уровни навыка компенсируют вертикальную дугу, используя фиксированное значение из консольной переменной tf_bot_ballistic_elevation_rate. Поскольку эта компенсация срабатывает только для базового ID оружия, варианты с более быстрыми снарядами (Loch-n-Load, всё с модификатором скорости снаряда) не получают корректно скорректированных дуг. А поскольку проверка привязана конкретно к ID оружия, Loose Cannon -- с другим ID -- не получает компенсации дуги вообще.

Huntsman. Лёгкие боты не компенсируют падение стрелы и никогда не целятся в голову. Боты Среднего навыка компенсируют дугу, но целятся в голову только в пределах 150 HU. Сложные/Эксперты всегда целятся в голову.

Ракетомёты. За пределами 150 HU боты не-Лёгкого уровня целятся в ноги вместо центра массы, максимизируя урон от взрыва и шанс отбрасывания. В пределах 150 HU они переключаются на выстрелы в голову. Лёгкие боты всегда целятся в центр массы независимо от дистанции. Это также привязано к ID оружия: Direct Hit и Cow Mangler не наследуют это поведение. Для Direct Hit это имеет смысла (нет AoE для использования); для Cow Mangler не имеет никакого смысла -- эта часть AI была написана до появления оружия и просто никогда не пересматривалась.

Снайперские винтовки. Лёгкие целятся в тело. Средние целятся примерно на 33% от тела к голове. Сложные/Эксперты целятся прямо в голову. Это менее важно в MvM, где хедшоты ботов всё равно не получают бонуса к урону.

Слух: чувствительность к скрытым выстрелам

Каждый выстрел оповещает ближайших ботов о позиции стреляющего, даже сквозь стены, на расстоянии до 3000 HU со 100% шансом обнаружения (tf_bot_notice_gunfire_range). Но часть оружия помечена как «скрытое» -- слышимое только в пределах 500 HU (tf_bot_notice_quiet_gunfire_range), и даже тогда с шансом, зависящим от навыка:

Навык Шанс заметить скрытый выстрел
Лёгкий 10%
Средний 30%
Сложный 60%
Эксперт 90%

Вероятность уменьшается вдвое, если за последние 3 секунды был слышен громкий выстрел -- громкие звуки маскируют тихие.

Список ID скрытого оружия не обновлялся с декабря 2010 года. Всё, добавленное после этой даты с новым ID оружия, по умолчанию считается громким, независимо от того, насколько тихим оно должно быть логически, если только оно не использует старый ID. Конкретно:

ID оружия Покрывает
TF_WEAPON_KNIFE Все ножи шпиона
TF_WEAPON_FISTS Удары Пулемётчика (его мультиклассовый удар -- на самом деле TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Предположительно не используется напрямую
TF_WEAPON_PDA_ENGINEER_BUILD Строительный PDA Инженера
TF_WEAPON_PDA_ENGINEER_DESTROY Разрушительный PDA Инженера
TF_WEAPON_PDA_SPY Набор маскировки Шпиона
TF_WEAPON_BUILDER Набор инструментов Шпиона/сапёра
TF_WEAPON_MEDIGUN Все Medi Gun
TF_WEAPON_DISPENSER Вероятно, не используется (раздатчики -- объекты, а не оружие)
TF_WEAPON_INVIS Все часы маскировки Шпиона
TF_WEAPON_FLAREGUN Все сигнальные пистолеты Поджигателя, кроме Manmelter
TF_WEAPON_LUNCHBOX Сэндвич, батончик Dalokohs, стейк Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (не Mad Milk -- отдельный, не-скрытый ID)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Классический пример загнивания списка: Manmelter получил свой собственный ID (TF_WEAPON_RAYGUN_REVENGE), добавленный после заморозки списка скрытого оружия -- поэтому он считается громким, хотя по сути является сигнальным пистолетом. Scorch Shot, выпущенный ещё позже, использует базовый ID TF_WEAPON_FLAREGUN и поэтому всё ещё считается скрытым. Бессмысленно, но таков код.

Стратегия: приоритизация угроз

Когда несколько врагов видны одновременно, боты взвешивают дистанцию, то, стреляют ли в них, и -- выше Лёгкого -- лечат ли основную угрозу:

Навик Целит в хиллера вместо этого?
Лёгкий Нет
Средний 50% шанс
Сложный Да
Эксперт Да

Враги за пределами 500 HU обычно понижаются в приоритете как не представляющие непосредственной угрозы. Исключения: боты Сложного/Эксперта всегда считают дальних Медиков и Инженеров непосредственной угрозой, и любой вражеский Снайпер, целящийся примерно в вашу сторону, всегда считается непосредственной угрозой независимо от дистанции и навыка.

Навык Дальние Медики/Инженеры/целящиеся Снайперы = непосредственная угроза?
Лёгкий/Средний Нет
Сложный/Эксперт Да

У проверки Снайпера есть забавная история. В исходной статье sigsegv предполагалось, что игра требует, чтобы скалярное произведение между вектором прицела снайпера и относительной позицией бота было ровно ноль -- сравнение настолько точное, что оно почти никогда не срабатывало бы в вычислениях с плавающей точкой, что делало бы всю функцию мёртвым кодом. Более поздняя поправка (благодаря более чистому дизассемблированию Hex-Rays) показала, что фактическая проверка -- скалярное произведение > 0: любой снайпер, смотрящий в диапазоне от прямо на вас до перпендикулярно вам, считается непосредственной угрозой; всё от перпендикуляра до взгляда в сторону -- нет. Изначальная ошибка возникла из-за неудачного дизассемблирования SSE-сравнения чисел с плавающей точкой -- обратная разработка AAA-бинарника это не точная наука.

Движение: уклонение

Лёгкие боты никогда не уклоняются, точка. Боты Среднего уровня и выше уклоняются влево/вправо (33% влево, 33% вправо, 33% ничего не делать, с учётом обнаруженных пропастей), когда они держат боевое оружие, видели врага за последние 3 секунды, и у этого врага есть прямая видимость до них.

Они не будут уклоняться, если применимо что-либо из этого: установлен атрибут DisableDodge, текущее поведение предписывает спешить, текущая неуязвимость (любая uber), в середине насмешки/провокации, игра за Инженера, невидимость или маскировка под Шпиона, прицеливание как Снайпер или раскрутка как Пулемётчик, или в процессе натягивания лука Huntsman.

Движение: избегание столкновений с врагами

Выше Среднего боты специально стараются не врезаться во врагов при движении:

Навык Избегает столкновения с врагами?
Лёгкий Нет
Средний Нет
Сложный Да
Эксперт Да

На практике это важно в основном для ботов-шпионов -- неловкое столкновение с вражеским игроком -- это именно то, что может раскрыть маскировку.

Поджигатель: мастерство воздушной струи

Airblast служит двум целям: отражение снарядов (PvP и MvM) и сталкивание ближайших врагов с обрывов (только PvP). Использует ли бот воздушную струю при возможности -- это подбрасывание монетки, зависящее от навыка:

Навык Шанс использования Airblast
Лёгкий 0%
Средний 50%
Сложный 90%
Эксперт 100%

Лёгкие боты-поджигатели буквально не могут использовать воздушную струю -- бросок хардкодно никогда не succeeds, не просто «редко».

Шпион: эффективность маскировки

Две независимые шкалы масштабируются в зависимости от навыка. Выбор маскировки:

Навык Метод маскировки
Лёгкий/Средний Случайный класс, игнорируя реальный состав вражеской команды
Сложный/Эксперт Выбирает реального вражеского игрока и копирует его точный класс

Актёрская игра в маскировке:

Навык Поведение в маскировке/невидимости
Лёгкий/Средний Пялится на вражеских игроков, когда видит их (подозрительно)
Сложный/Эксперт Намеренно избегает зрительного контакта (более убедительно)

Шпион: агрессия удара в спину

На большой дистанции (до 300 HU, tf_bot_spy_knife_range) бот-шпион совершает удар в спину, только если видит жертву и спина жертвы хотя бы частично отвернута. Навык определяет, насколько далеко от центра может быть отклонён угол спины:

Навык Допуск угла
Лёгкий Атакует, даже если вы смотрите прямо на него
Средний ±45° от вашей спины
Сложный ±78° от вашей спины
Эксперт ±90° от вашей спины (полная задняя дуга 180°)

Лёгкие боты-шпионы функционально самоубийственны -- они попытаются ударить в спину того, кто смотрит прямо на них. Исключение: в Mann vs. Machine каждый бот-шпион принудительно использует ограничение угла Среднего уровня независимо от фактического навыка.

Тактика: выбор оружия

Срабатывает только выше Лёгкого и в основном неактуально в MvM, так как у ботов там обычно жёсткие ограничения на оружие:

  • Разведчик: переключается на вторичное оружие, когда магазин основного пуст.
  • Солдат: переключается на вторичное при пустом магазине и цели ближе 500 HU.
  • Снайпер: переключается на вторичное для целей ближе 750 HU.
  • Поджигатель: переключается на вторичное для целей дальше 750 HU, если только эта цель не Солдат или Подрывник.

Тактика: перезарядка в укрытии

Не используется в MvM. Если текущее поведение бота не предписывает ему отступать, основной магазин пуст, и он не под uber, боты более высокого уровня временно отступают в укрытие, чтобы перезарядиться, вместо того чтобы щёлкать пустым оружием в вас:

Навык Отступает для перезарядки?
Лёгкий Нет
Средний Нет
Сложный Да
Эксперт Да

Режим CP: бродяжничество защитника

Не используется в MvM. Защищая контрольную точку, боты более высокого уровня с большей вероятностью покидают точку для охоты за убийствами («search and destroy»), но только при достаточном остатке времени tf_bot_defense_must_defend_time:

Навык Шанс отклониться
Лёгкий 10%
Средний 50%
Сложный 75%
Эксперт 90%

Режим CP: блокировка захвата

Не используется в MvM. Защищающиеся боты, препятствующие вражеской попытке захвата:

Навык Попытается заблокировать захват?
Лёгкий Нет
Средний 50% шанс
Сложный Да
Эксперт Да

Полная сводная таблица

Аспект Лёгкий Средний Сложный Эксперт Примечания
Зрение: время распознавания 1.00с 0.50с 0.30с 0.20с
Прицеливание: частота обновления 1 раз/с 4 раз/с 10 раз/с 20 раз/с Шпионы всегда Средний
Компенсация дуги гранат/липучек Да Да Да Да Loose Cannon исключён
Вертикальная компенсация Huntsman Нет Да Да Да
Хедшоты Huntsman Нет <150 HU Да Да
Выстрелы в ноги из ракетомёта Нет Да Да Да Direct Hit & Cow Mangler исключены
Точка прицела снайперской винтовки Тело ~33% к голове Голова Голова
Шанс заметить скрытые выстрелы 10% 30% 60% 90% Уменьшается вдвое если маскируется громкими
Целит в хиллера Нет 50% Да Да
Дальний Медик/Инженер/Снайпер = угроза Нет Нет Да Да
Уклонение Нет Да Да Да Длинный список исключений
Избегает столкновений с врагами Нет Нет Да Да Важно в основном для Шпиона
Шанс использования Airblast 0% 50% 90% 100%
Выбор класса маскировки Шпиона Случайный Случайный Копирует врага Копирует врага
Зрительный контакт Шпиона в маскировке Пялится Пялится Избегает Избегает
Угол удара в спину Шпиона ~0° ±45° ±78° ±90° MvM принудительно Средний
Логика выбора оружия Нет Да Да Да Менее актуально в MvM
Перезарядка в укрытии Нет Нет Да Да Не в MvM
Бродяжничество защитника CP 10% 50% 75% 90% Не в MvM
Блокировка захвата CP Нет 50% Да Да Не в MvM

Заключение

Тяжеловооружённый бот TF2, целящийся из минигана

Всё это не результат неудачных догадок со стороны Valve -- это продуманная, полностью детерминированная система подсчёта очков и вероятностей, просто никогда нигде официально не задокументированная. Несколько вещей, которые стоит запомнить:

  1. «Навык» -- это набор независимых регуляторов, а не один глобальный множитель. Время реакции, скорость прицеливания и каждое тактическое поведение масштабируются отдельно, а некоторые (скорость отслеживания шпиона, угол удара в спину в MvM) получают хардкодные переопределения независимо от навыка.
  2. Кое-что из этого действительно багнуто, а не просто устарело. Список скрытого оружия замёрз с 2010 года, у Cow Mangler по непонятной причине отсутствует логика прицеливания в ноги, проверка скалярного произведения для снайпера, которую годами не могли корректно дизассемблировать -- у AI-кода Valve есть шрамы, как у любой 17-летней кодовой базы.
  3. Вы можете использовать всё это. Знайте, что бот-снайпер не сделает вам хедшот на Среднем уровне, что лёгкий поджигатель буквально не может отбить вашу ракету обратно, что лёгкий шпион попытается ударить вас в спину лицом к лицу. Это не удача. Это спецификация.

Огромное спасибо sigsegv за первоначальное погружение в код, сделавшее большую часть этого возможным, TF2 Wiki за базовую документацию по командам ботов и поддержке карт, и всем в сообществе, кто продолжает ковырять 17-летний AI ботов, чтобы выяснить, почему именно он делает то, что делает.

Los bots de TF2 no son aleatorios: ingenié inversamente cada configuración de dificultad

Visión, puntería, ángulos de apuñalada, lógica de disparo a la cabeza, todos los bugs conocidos -- Valve nunca documentó nada de esto. Así que escarbamos en el código y lo convertimos en una ficha técnica completa.

Introducción

Soldado bot de TF2 apuntando con un lanzacohetes

Todo jugador de TF2 lo ha dicho al menos una vez: "este bot está haciendo trampa". O lo contrario: "¿por qué este bot Fácil está parado comiéndose cohetes?" Nadie sabe realmente lo que "Fácil", "Normal", "Difícil" y "Experto" significan realmente bajo el capó -- Valve lanzó cuatro etiquetas de dificultad y exactamente cero documentación.

Así que un grupo de nosotros (yo, awimii, Mush The Possum, con una gran parte del trabajo preliminar hecho por sigsegv, quien realmente escarbó en el código descompilado del juego) armamos un documento de investigación completo sobre el comportamiento de TFBot. Cada mecánica, cada bug conocido, cada probabilidad hardcodeada. Este artículo es el informe completo, no la versión resumida. Agarra un Bonk, que esto es largo.


Capítulo I: Lo Básico

Bot vs Bot Marioneta

TF2 tiene dos cosas completamente diferentes que la gente llama "bots":

  • Bots de IA (TFBots): IA real, construida sobre el mismo framework PlayerBot/Infected que Valve usó para la serie Left 4 Dead. Eligen una clase aleatoria, juegan al objetivo, funcionan sin sv_cheats, y activan logros como lo haría un jugador real.
  • Bots marioneta: cero IA, no pueden moverse ni actuar por sí solos. Existen puramente para ser controlados manualmente -- un jugador puede forzarlos a seguir, apuntar y disparar, usados principalmente para pruebas o para hacer capturas de pantalla/vídeos cinemáticos. Para generarlos se necesita sv_cheats 1, lo que también desactiva los logros durante la sesión.

Este artículo trata únicamente sobre el primer tipo.

Lo que se les puede (más o menos) decir a los bots de IA

Los TFBot no son directamente controlables, pero hay una pequeña lista de cosas que puedes hacer para incitarlos:

  • Apunta tu mira a cualquier bot (amigo o enemigo) y se burlará de ti si usas los comandos de voz correctos.
  • Un bot Médico amigo te cura si usas el comando de voz "¡Médico!".
  • Si un bot Médico te está curando y tiene un ÜberCharge listo, di "¡Vamos vamos!" o "¡Activa la carga!" para que active la carga inmediatamente.
  • Un bot Médico con carga lista la activará automáticamente en cuanto él o su objetivo de cura reciba daño grave, sin necesidad de comando de voz.
  • Los bots realizarán espontáneamente burlas en pareja (Choca esos cinco) o burlas grupales (Conga) con compañeros cercanos.

Cómo hacer que los bots funcionen en mapas no soportados

Los bots dependen de un mallado de navegación para saber dónde pueden caminar, y la mayoría de los mapas de la comunidad no incluyen uno. Para forzarlo:

  1. sv_cheats 1
  2. nav_generate -- construye el mallado inicial, el progreso se muestra en la consola
  3. Espera a que el juego termine de generar las rutas
  4. Opcionalmente, arregla datos de navegación defectuosos manualmente con nav_edit 1
  5. Recarga o reinicia el servidor (saltarse esto desactiva los logros)
  6. tf_bot_add <número> para generar los bots

Advertencia: cambiar el mallado de navegación mientras hay bots activos en el servidor puede crashar el juego. Una vez que el mallado existe, no necesitas regenerarlo para sesiones futuras -- solo vuelve a añadir bots con tf_bot_add.

Los mallados generados automáticamente funcionan mejor en mapas de Punto de Control, Rey de la Colina, Payload y CTF. En mapas Mannpower, los bots por defecto juegan al estilo CTF pero apenas usan ganchos o mejoras. Si un mapa no tiene un objetivo que la IA reconozca pero tiene una entidad de sala de aparición, establecer tf_bot_offense_must_push_time 0 permite que los bots luchen de todas formas.

(Fuente de esta sección: la página de Bots de la Wiki oficial de TF2).

Estado actual, mapa por mapa

Gracias a la actualización Hatless, todas las clases funcionan correctamente ahora, incluyendo el históricamente problemático Spy. Los bots se comportan adecuadamente en la mayoría de los mapas KOTH oficiales, algunos mapas Payload, Dustbowl/Gorge Ataque-Defensa, y mapas CTF/Mann Manor -- aunque en estos dos últimos no puedes generarlos directamente con tf_bot_add. En mapas no soportados (mediante el proceso nav_generate anterior) funcionan, pero notablemente peor imitando a un jugador real.

Los mapas PLR son una causa perdida: los bots no pueden cruzar las barreras en Hightower y se quedan atascados en las esquinas, y en todos los demás mapas PLR simplemente... tienen una fiesta de baile en lugar de jugar. Esto podría arreglarse algún día. O no.

Comportamiento general de los bots

Una mezcla de cosas que todo bot hace independientemente de su habilidad:

  • Los bots solo usan equipamiento estándar (un plugin puede forzar armas no estándar, pero los bots normales nunca eligen las suyas).
  • Los bots Fáciles apenas usan su arma secundaria. Las dificultades más altas cambian a la secundaria en cuanto se queda sin munición principal, o para compensar la distancia.
  • Los bots no pueden hacer técnicas de movimiento -- ni saltos cohete, ni reubicación de construcciones.
  • Tras una muerte, un bot puede burlarse, incluso bajo fuego -- excepto mientras lleva la inteligencia enemiga, y esta regla también aplica en MvM.
  • Los bots (jugador o IA) ignoran correctamente a un Spy disfrazado -- hasta que toca a un enemigo, sabotea algo, dispara, o se vuelve invisible cerca de uno. Una vez "descubierto", ese bot/jugador específico es recordado como Spy hasta que cambie de disfraz mientras permanece invisible, muera, o finja su muerte con el Dead Ringer.
  • Los bots Pyro usan el Compresión Blast abundantemente en cualquier dificultad superior a Fácil.
  • Los bots Médico priorizan curar a todos antes que a los Snipers (y, en menor medida, a los Engineers), incluso si spameas "¡Médico!" siendo uno.
  • Los bots Médico gravitan hacia Heavies, Soldiers, Demomen y Pyros -- específicamente si un humano está jugando con esas clases. Sin humanos en esos roles, no hay atención particular del Médico.
  • Los bots mantienen la posición durante el tiempo de preparación en mapas de Ataque/Defensa y Payload -- excepto Engineers, Snipers y Spies, que se mueven libremente (los bots Demoman también pueden precolocar stickybombs).
  • Los bots Engineer nunca mejoran o des-sabotean las construcciones de otro Engineer amigo, a menos que esa construcción esté en el camino de su objetivo. También a veces simplemente... no reparan su propia torreta, incluso cuando es seguro hacerlo.
  • Los bots Spy descubiertos cambian a su revólver y retroceden en lugar de forzar una apuñalada.
  • Los bots Demoman que han localizado una torreta (generalmente muriendo por ella una vez) pueden lanzar stickybombs perfectamente sobre ella desde fuera de su alcance, rodeando paredes y techos cuando la geometría lo permite.
  • Los bots Sniper que no encuentran un objetivo tras apuntar usan una de las líneas de voz "Negativas".
  • Los Médicos amigos curarán a un Spy disfrazado sin dudarlo.

Problemas / bugs conocidos

El documento enumera una buena cantidad de rarezas de larga data:

  • Los bots pueden intentar caminar o disparar a través de ciertos accesorios estáticos.
  • Cada vez que un jugador/bot se desenmascara, se disfraza o se revela, los bots cercanos "lo ven" y giran para reaccionar -- incluso si el evento ocurrió fuera de su campo de visión real. No está basado en sonido; es una evasión de la verificación visual.
  • Raramente, los bots pueden quedarse físicamente pegados mientras usan un teletransportador de Engineer.
  • Los comandos de voz de los bots (ej. "¡Spy!", "¡Adelante!") no se muestran como texto de chat como los de los jugadores.
  • Un bot Médico que está curando activamente a alguien no esquivará el fuego entrante ni recogerá botiquines, incluso con HP críticamente bajo.
  • Los bots pueden seguir moviéndose mientras realizan una burla en pareja, lo que rompe el efecto deseado del Festive Critical Strike.
  • Los bots Médico recientemente dañados a menudo se niegan a usar la Syringe Gun a distancia, prefiriendo el cuerpo a cuerpo (o, en casos muy raros, intentando golpearte con el haz de la Medi Gun).
  • Los bots Médico no compensan la caída por gravedad en los disparos de la Syringe Gun -- probablemente porque el arma no está correctamente marcada como no-hitscan en el código de IA.
  • Los bots Spy pueden ver y seguir a un Spy invisible (jugador o IA) si ese Spy ya ha sido descubierto una vez, independientemente del nivel de habilidad del bot rastreador.
  • Incluso si un jugador-Spy se disfraza como la clase de su propio equipo, chocar con un enemigo los delata (los bots nunca hacen esto porque nunca se disfrazan como su propio equipo).
  • Los bots respetan el auto-balanceo de equipos -- si estás intentando acumular bots en un equipo, necesitas mp_teams_unbalance_limit 0 primero.
  • Los bots Engineer pueden ignorar por completo sus propias construcciones hasta que sean destruidas.
  • Los bots Heavy a veces intentan disparar la Minigun con muy poca munición, principalmente por debajo de la dificultad Difícil.
  • Los bots Médico del equipo perdedor ocasionalmente se suicidan durante la fase de Humillación cuando no hay enemigos cerca -- algo que un jugador humano no puede replicar ni intentándolo.
  • Si pones la vista previa de equipo en la pantalla de carga a BLU, los bots RED se renderizan visualmente como BLU para ti.
  • Los bots con cuerpo a cuerpo equipado a veces se niegan a cambiar de arma incluso después de recoger munición.
  • Post-Jungle Inferno, los bots generados con parámetros explícitos (ej. tf_bot_add 5 pyro blue normal) pueden morir instantáneamente en su propia sala de aparición. Solución: tf_bot_reevaluate_class_in_spawnroom 0 (necesita sv_cheats 1).

Nombres de IA

Los nombres de los bots se extraen de un gran grupo de referencias a TF2, otros juegos de Valve y la cultura de programación, en gran parte porque la comunidad seguía solicitando nombres específicos en los foros de Steam. Una muestra de la lista: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, y docenas más en esa línea.

También hay un lote de nombres encontrados en una compilación filtrada de la fuente que nunca llegó a la versión de producción, por razones poco claras -- principalmente referencias a Last Dragon y The Fifth Element como John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh?, y I'm your huckleberry.

Puedes sobrescribir todo esto tú mismo: tf_bot_add heavyweapons blue "Blu Hoovy" genera un Heavy BLU llamado "Blu Hoovy".


Capítulo II: Los Bots Originales / TFBots -- Inmersión Profunda en los Niveles de Habilidad

El marco original de Sigsegv sigue siendo válido: es obvio que los bots Expertos superan a los bots Fáciles, pero Valve nunca explicó cuánto ni por qué. Así que la única forma de saberlo es leer el código. Aquí está cada mecánica que escala con la habilidad.

Configurar la dificultad

Fuera de MvM, la dificultad se controla con un cvar:

tf_bot_difficulty Nivel de habilidad
0 Fácil
1 Normal (por defecto)
2 Difícil
3 Experto

tf_bot_add también acepta un argumento de dificultad directamente (easy/normal/hard/expert).

Popfiles de MvM

En Mann vs. Machine, cada bloque generador de TFBot en el popfile tiene una clave Skill opcional. Sin clave significa Fácil. En las misiones oficiales de Valve: los Giants son casi siempre Expertos, los Engineers y Spies son casi siempre Expertos, y los Snipers suelen ser Difíciles (ocasionalmente Expertos). Si estás usando EventChangeAttributes (añadido en la actualización Two Cities) para alterar dinámicamente a los bots entre oleadas según eventos del mapa, la habilidad del bot es una de las propiedades que puedes cambiar sobre la marcha.

MvM Modo Infinito

El modo infinito nunca se lanzó oficialmente, pero en él, los bots gastan su dinero en mejoras como los jugadores -- incluyendo una mejora exclusiva para bots que aumenta su nivel de habilidad de IA a mitad de partida.

La entidad bot_generator

Una entidad oscura, en gran parte indocumentada, que se cree fue usada en el modo de entrenamiento y posiblemente en el desarrollo temprano de MvM. Expone una entrada SetDifficulty para controlar el nivel de habilidad. Más allá de eso, el rastro se enfría -- Valve nunca la documentó y nadie ha mapeado completamente su comportamiento.

Color del brillo ocular

Los robots de MvM tienen una partícula de brillo ocular que cambia de color según el nivel de habilidad -- un indicador visual que nadie fuera de la comunidad ha explicado nunca:

Habilidad Color del ojo RGB
Fácil/Normal Azul #24b4ff
Difícil/Experto Amarillo #fff000

Bot Heavy de TF2 en posición de reposo

Visión: tiempo de reconocimiento

Un bot no reacciona en el instante en que algo entra en su campo de visión -- hay un retardo hardcodeado antes de que el resto de la IA pueda siquiera reconocer la amenaza:

Habilidad Tiempo mínimo de reconocimiento
Fácil 1.00 s
Normal 0.50 s
Difícil 0.30 s
Experto 0.20 s

Eso es la mayor parte del efecto "los bots Fáciles se sienten tontos" en un solo número -- un bot Fácil no apunta peor una vez que te nota, solo tarda cinco veces más en notar que existes.

Puntería: tasa de seguimiento

Los bots no te siguen continuamente. Muestrean tu posición y velocidad a intervalos fijos y predicen una línea recta a partir de ahí:

Habilidad Intervalo de recálculo Tasa equivalente
Fácil 1.00 s 1x/s
Normal 0.25 s 4x/s
Difícil 0.10 s 10x/s
Experto 0.05 s 20x/s

Excepción: los bots Spy están hardcodeados a la tasa de seguimiento Normal independientemente de su nivel de habilidad real -- un Spy Experto sigue apuntando como un bot Normal. También hay un video de demostración público que compara las tasas de seguimiento lado a lado si quieres ver la diferencia de 1x vs 20x en movimiento.

Puntería: habilidad específica por arma

Los bots no solo apuntan a tu centro de masa -- tienen lógica por arma, parte de ella genuinamente buggy:

Lanzagranadas & Lanzasticky. Todos los niveles de habilidad compensan el arco vertical, usando un valor fijo del cvar tf_bot_ballistic_elevation_rate. Debido a que esa compensación solo se activa para el ID de arma base, las variantes de proyectil más rápido (Loch-n-Load, cualquier cosa con un modificador de velocidad de proyectil) no reciben arcos correctamente ajustados. Y como está keyado por ID de arma específicamente, el Loose Cannon -- un ID diferente -- no recibe compensación de arco en absoluto.

Huntsman. Los bots Fáciles no compensan la caída de la flecha y nunca apuntan a la cabeza. Los bots de habilidad Normal compensan el arco, pero solo apuntan a la cabeza dentro de 150 HU. Los bots Difícil/Experto siempre apuntan a la cabeza.

Lanzacohetes. Más allá de 150 HU, los bots no Fáciles apuntan a tus pies en lugar del centro de masa, maximizando el daño de área y las probabilidades de empujón. Dentro de 150 HU cambian a disparos a la cabeza. Los bots Fáciles siempre apuntan al centro de masa independientemente de la distancia. Esto también está bloqueado por ID de arma: el Direct Hit y el Cow Mangler no heredan este comportamiento. Tiene sentido para el Direct Hit (sin área de efecto que explotar); no tiene ningún sentido para el Cow Mangler -- esta parte de la IA es anterior a la existencia del arma y simplemente nunca fue revisada.

Rifles de Francotirador. Fácil apunta al cuerpo. Normal apunta aproximadamente al 33% del camino del cuerpo a la cabeza. Difícil/Experto apuntan directamente a la cabeza. Importa menos en MvM, donde los disparos a la cabeza de los bots no reciben bonificación de daño de todas formas.

Oído: sensibilidad a disparos sigilosos

Cada disparo alerta a los bots cercanos de la posición del tirador, incluso a través de paredes, hasta 3000 HU con un 100% de probabilidad de detección (tf_bot_notice_gunfire_range). Pero un subconjunto de armas están marcadas como "sigilosas" -- audibles solo dentro de 500 HU (tf_bot_notice_quiet_gunfire_range), e incluso entonces con una probabilidad que depende de la habilidad:

Habilidad Probabilidad de notar un disparo sigiloso
Fácil 10%
Normal 30%
Difícil 60%
Experto 90%

Esa probabilidad se reduce a la mitad si se escuchó un disparo fuerte en los últimos 3 segundos -- los sonidos fuertes enmascaran a los silenciosos.

La lista de IDs de armas sigilosas no se ha actualizado desde diciembre de 2010. Cualquier cosa añadida después de esa fecha usando un ID de arma nuevo se trata como fuerte por defecto, sin importar lo silencioso que lógicamente debería ser, a menos que haya reutilizado un ID antiguo. Concretamente:

ID de arma Cubre
TF_WEAPON_KNIFE Todos los cuchillos de Spy
TF_WEAPON_FISTS Golpes específicos de Heavy (su golpe multiclase es en realidad TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Se cree que no se usa directamente
TF_WEAPON_PDA_ENGINEER_BUILD PDA de Construcción del Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA de Destrucción del Engineer
TF_WEAPON_PDA_SPY Kit de disfraces del Spy
TF_WEAPON_BUILDER Kit de Engineer/Sapper del Spy
TF_WEAPON_MEDIGUN Todas las Medi Guns
TF_WEAPON_DISPENSER Probablemente no usado (los Dispensadores son objetos, no armas)
TF_WEAPON_INVIS Todos los relojes de invisibilidad del Spy
TF_WEAPON_FLAREGUN Todas las pistolas de bengala de Pyro excepto el Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (no Mad Milk -- ID separado, no sigiloso)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

El ejemplo clásico de la lista podrida: el Manmelter recibió su propio ID (TF_WEAPON_RAYGUN_REVENGE), añadido después de que la lista sigilosa se congelara -- así que se trata como fuerte, a pesar de ser una pistola de bengala en todos los sentidos prácticos. El Scorch Shot, lanzado incluso más tarde, reutiliza el ID base TF_WEAPON_FLAREGUN y por lo tanto sigue considerándose sigiloso. Sin sentido, pero así es el código.

Estrategia: priorización de amenazas

Cuando múltiples enemigos son visibles a la vez, los bots ponderan la distancia, si les están disparando, y -- por encima de Fácil -- si la amenaza principal está siendo curada:

Habilidad ¿Apunta al médico en su lugar?
Fácil No
Normal 50% de probabilidad
Difícil Sí
Experto Sí

Los enemigos a más de 500 HU normalmente se despriorizan como no inmediatos. Excepciones: los bots Difícil/Experto siempre tratan a los Médicos e Engineers lejanos como amenazas inmediatas, y cualquier Sniper enemigo apuntando aproximadamente hacia ti siempre se trata como inmediato independientemente de la distancia y la habilidad.

Habilidad ¿Médicos/Engineers/Snipers apuntando lejanos = amenaza inmediata?
Fácil/Normal No
Difícil/Experto Sí

Esa verificación del Sniper tiene una historia genuinamente divertida. El informe original de Sigsegv asumió que el juego requería que el producto escalar entre el vector de puntería del sniper y la posición relativa del bot fuera exactamente cero -- una comparación tan precisa que casi nunca se activaría en aritmética de punto flotante, haciendo que toda la característica fuera efectivamente código muerto. Una corrección emitida más tarde (gracias a una descompilación Hex-Rays más limpia) mostró que la verificación real es producto escalar > 0: cualquier Sniper mirando desde directamente hacia ti hasta perpendicular a ti cuenta como amenaza inmediata; cualquier cosa desde perpendicular hasta mirando en dirección contraria no. La mala lectura original vino de una mala descompilación de una comparación SSE de flotantes -- la ingeniería inversa de un binario AAA no es una ciencia exacta.

Movimiento: esquiva

Los bots Fáciles nunca esquiván, punto. Los bots Normal y superiores esquiván a izquierda/derecha (33% izquierda, 33% derecha, 33% no hacer nada, ponderado contra huecos detectados) cuando tienen un arma de combate, han visto a un enemigo en los últimos 3 segundos, y ese enemigo tiene línea de visión sobre ellos.

No esquivarán si aplica alguna de estas: atributo DisableDodge activado, el comportamiento actual indica prisa, actualmente invulnerable (cualquier über), en medio de una burla/provocación, jugando como Engineer, invisible o disfrazado como Spy, apuntando como Sniper o con la revolución activa como Heavy, o en medio de la preparación del Huntsman.

Movimiento: evitar empujar enemigos

Por encima de Normal, los bots intentan específicamente no chocar con enemigos mientras se mueven:

Habilidad ¿Evita chocar con enemigos?
Fácil No
Normal No
Difícil Sí
Experto Sí

En la práctica, esto solo importa realmente para los bots Spy -- evitar una colisión incómoda con un jugador enemigo es exactamente el tipo de cosa que delata un disfraz.

Pyro: dominio del airblast

El airblast sirve para dos propósitos: reflejar proyectiles (PvP y MvM) y empujar enemigos cercanos desde precipicios (solo PvP). Si el bot realmente aprieta el gatillo en una oportunidad válida es una moneda al aire basada en la habilidad:

Habilidad Probabilidad de activar airblast
Fácil 0%
Normal 50%
Difícil 90%
Experto 100%

Los bots Pyro Fáciles literalmente no pueden usar airblast -- la tirada está hardcodeada para nunca tener éxito, no solo "raramente".

Spy: efectividad del disfraz

Dos ejes separados escalan con la habilidad. Elección del disfraz:

Habilidad Método de disfraz
Fácil/Normal Clase aleatoria, ignorando lo que el equipo enemigo está jugando realmente
Difícil/Experto Elige un jugador enemigo real y copia su clase exacta

Actuación del disfraz:

Habilidad Comportamiento mientras está disfrazado/invisible
Fácil/Normal Mira fijamente a los jugadores enemigos cuando los ve (sospechoso)
Difícil/Experto Evita deliberadamente el contacto visual (más convincente)

Spy: agresividad de apuñalada

A larga distancia (hasta 300 HU, tf_bot_spy_knife_range), un bot Spy solo se compromete a una apuñalada si puede ver a la víctima y la espalda de la víctima está al menos parcialmente girada. La habilidad determina cuán descentrado puede estar ese ángulo de espalda:

Habilidad Tolerancia de ángulo
Fácil Lo intenta incluso si te mira directamente
Normal ±45° desde tu espalda
Difícil ±78° desde tu espalda
Experto ±90° desde tu espalda (arco completo trasero de 180°)

Los bots Spy Fáciles son funcionalmente suicidas -- intentarán una apuñalada a alguien que les mira directamente. Excepción: en Mann vs. Machine, todo bot Spy está forzado a la restricción de ángulo Normal independientemente de su habilidad real.

Tácticas: selección de armas

Solo se activa por encima de Fácil, y es mayormente irrelevante en MvM ya que los bots allí suelen tener restricciones de armas duras:

  • Scout: cambia a secundaria cuando el cargador del arma principal está vacío.
  • Soldier: cambia a secundaria con cargador vacío y objetivo a menos de 500 HU.
  • Sniper: cambia a secundaria para objetivos a menos de 750 HU.
  • Pyro: cambia a secundaria para objetivos a más de 750 HU, a menos que ese objetivo sea un Soldier o Demoman.

Tácticas: recarga a cubierto

No se usa en MvM. Si el comportamiento actual del bot no le indica retirarse, su cargador principal está vacío, y no está übereado, los bots de mayor habilidad se retirarán temporalmente a cubierto para recargar en lugar de hacer clic con un arma vacía hacia ti:

Habilidad ¿Se retira a recargar?
Fácil No
Normal No
Difícil Sí
Experto Sí

Modo PC: deambulación del defensor

No se usa en MvM. Defendiendo un punto de control, los bots de mayor habilidad son más propensos a dejar el punto para cazar muertes ("buscar y destruir"), pero solo con un tiempo decente restante en tf_bot_defense_must_defend_time:

Habilidad Probabilidad de deambular
Fácil 10%
Normal 50%
Difícil 75%
Experto 90%

Modo PC: bloqueo de captura

No se usa en MvM. Bots defensores disputando un intento de captura enemigo:

Habilidad ¿Intentará bloquear la captura?
Fácil No
Normal 50% de probabilidad
Difícil Sí
Experto Sí

La tabla resumen completa

Aspecto Fácil Normal Difícil Experto Notas
Visión: tiempo de reconocimiento 1.00s 0.50s 0.30s 0.20s
Puntería: tasa de seguimiento 1x/s 4x/s 10x/s 20x/s Spies siempre usan Normal
Compensación de arco granada/sticky Sí Sí Sí Sí Loose Cannon exento
Compensación vertical Huntsman No Sí Sí Sí
Disparos a la cabeza Huntsman No <150 HU Sí Sí
Disparos a los pies Lanzacohetes No Sí Sí Sí Direct Hit y Cow Mangler exentos
Punto de mira Rifle de Francotirador Cuerpo ~33% a cabeza Cabeza Cabeza
Probabilidad de notar disparos sigilosos 10% 30% 60% 90% Mitad si está enmascarado por disparos fuertes
Apunta al médico No 50% Sí Sí
Médico/Engineer/Sniper lejano = amenaza No No Sí Sí
Esquiva No Sí Sí Sí Larga lista de excepciones
Evita chocar con enemigos No No Sí Sí Principalmente importa para Spy
Probabilidad de activar airblast 0% 50% 90% 100%
Elección de clase de disfraz Spy Aleatoria Aleatoria Coincide con enemigo real Coincide con enemigo real
Contacto visual Spy disfrazado Mira fijamente (obvio) Mira fijamente Evita (convincente) Evita
Ángulo de apuñalada Spy ~0° ±45° ±78° ±90° MvM fuerza Normal
Lógica de selección de armas No Sí Sí Sí Menos relevante en MvM
Recarga a cubierto No No Sí Sí No en MvM
Deambulación defensor PC 10% 50% 75% 90% No en MvM
Bloqueo de captura PC No 50% Sí Sí No en MvM

Conclusión

Bot Heavy de TF2 apuntando con una minigun

Nada de esto es especulación fallida por parte de Valve -- es un sistema deliberado, completamente determinista de puntuación y probabilidad, simplemente nunca escrito en ningún sitio oficial. Algunas cosas que vale la pena recordar:

  1. La "habilidad" es un conjunto de diales independientes, no un multiplicador global. El tiempo de reacción, la tasa de puntería y cada comportamiento táctico escalan por separado, y algunos (tasa de seguimiento del Spy, ángulo de apuñalada en MvM) tienen anulaciones hardcodeadas independientemente de la habilidad.
  2. Parte de esto es genuinamente buggy, no solo antiguo. La lista de armas sigilosas congelada desde 2010, el Cow Mangler sin lógica de disparo a los pies sin una buena razón, la verificación de producto escalar del Sniper que tardó años en descompilarse correctamente -- el código de IA de Valve tiene cicatrices como cualquier otro código base de 17 años.
  3. Puedes usar todo esto. Saber que un bot Sniper no te disparará a la cabeza en Normal, que un Pyro Fácil literalmente no puede reflejar tu cohete, que un Spy Fácil intentará apuñalarte cara a cara. No es suerte. Es una ficha técnica.

Muchas gracias a sigsegv por la inmersión original en el código que hizo posible la mayor parte de esto, a la Wiki de TF2 por la documentación base sobre los comandos de bots y soporte de mapas, y a todos en la comunidad que siguen hurgando en una IA de bots de 17 años para descubrir exactamente por qué hace lo que hace.

Os Bots do TF2 Não São Aleatórios: Eu Engenharia Reversa em Cada Configuração de Dificuldade

Visão, rastreamento de mira, ângulos de facada do Spy, lógica de headshot do Sniper, todos os bugs conhecidos -- a Valve nunca documentou nada disso. Então nós vasculhamos o código e transformamos tudo numa especificação completa.

Introdução

Bot Soldier do TF2 mirando com um lança-foguetes

Todo jogador de TF2 já disse pelo menos uma vez: "esse bot está trapaceando." Ou o oposto: "por que esse bot Fácil está parado tomando foguetes." Ninguém realmente sabe o que "Fácil," "Normal," "Difícil" e "Expert" realmente significam internamente -- a Valve lançou quatro rótulos de dificuldade e exatamente zero documentação.

Então um grupo de nós (eu, awimii, Mush The Possum, com uma enorme parte do trabalho de base feita por sigsegv, que realmente mergulhou no código decompilado do jogo) montou um documento de pesquisa completo sobre o comportamento dos TFBots. Cada mecânica, cada bug conhecido, cada probabilidade fixada no código. Este artigo é o relatório completo, não a versão resumida. Pegue um Bonk, esse é longo.


Capítulo I: O Básico

Bot vs Puppet Bot

O TF2 tem duas coisas completamente diferentes que as pessoas chamam de "bots":

  • Bots de IA (TFBots): IA real, construída sobre a mesma estrutura PlayerBot/Infected que a Valve usou para a série Left 4 Dead. Eles escolhem uma classe aleatória, jogam pelo objetivo, funcionam sem sv_cheats, e ativam conquistas como um jogador real faria.
  • Puppet bots: IA zero, não podem se mover ou agir sozinhos. Existem puramente para serem controlados manualmente -- um jogador pode forçá-los a seguir, mirar e atirar, usados principalmente para testes ou para fazer capturas de tela/vídeos cinematográficos. Gerá-los requer sv_cheats 1, o que também desabilita conquistas para a sessão.

Este artigo é inteiramente sobre o primeiro tipo.

O que os bots de IA podem (mais ou menos) ser instruídos a fazer

TFBots não são diretamente controláveis, mas há uma pequena lista de coisas que você pode incentivá-los a fazer:

  • Aponte sua mira para qualquer bot (amigo ou inimigo) e ele irá provocar você se você usar os comandos de voz certos.
  • Um bot Médico amigo cura você se você usar o comando de voz "Médico!"
  • Se um bot Médico está te curando e tem uma ÜberCharge pronta, dizer "Vai vai vai!" ou "Ative a carga!" faz com que ele ative a carga imediatamente.
  • Um bot Médico com carga pronta vai ativá-la automaticamente no momento em que ele ou seu alvo de cura sofrer dano sério, sem necessidade de comando de voz.
  • Bots realizam provocações em par (High Five) ou provocações em grupo (Conga) espontaneamente com companheiros de equipe próximos.

Fazendo bots funcionarem em mapas não suportados

Bots dependem de uma malha de navegação para saber onde podem andar, e a maioria dos mapas da comunidade não vem com uma. Para forçar:

  1. sv_cheats 1
  2. nav_generate -- constrói a navmesh inicial, progresso mostrado no console
  3. Aguarde o jogo terminar de gerar os caminhos
  4. Opcionalmente, corrija dados de navegação ruins manualmente com nav_edit 1
  5. Recarregue ou reinicie o servidor (pular isso desabilita conquistas)
  6. tf_bot_add <número> para realmente gerar bots

Aviso: alterar a navmesh enquanto bots estão ativos no servidor pode travar o jogo. Uma vez que a malha existe, você não precisa regenerá-la para sessões futuras -- apenas adicione bots novamente com tf_bot_add.

Malhas geradas automaticamente funcionam melhor em mapas de Control Point, King of the Hill, Payload e CTF. Em mapas Mannpower, os bots usam o estilo de jogo CTF por padrão, mas mal usam ganchos ou powerups. Se um mapa não tem objetivo que a IA do bot reconheça, mas tem uma entidade de sala de spawn, definir tf_bot_offense_must_push_time 0 permite que os bots lutem de qualquer forma.

(Fonte para esta seção: a página oficial de Bots da Wiki do TF2.)

Status atual, mapa por mapa

Graças à atualização Hatless, todas as classes funcionam corretamente agora, incluindo o historicamente problemático Spy. Os bots se comportam adequadamente na maioria dos mapas KOTH oficiais, alguns mapas Payload, Dustbowl/Gorge Attack-Defense e mapas CTF/Mann Manor -- embora nestes últimos dois você não possa gerá-los diretamente com tf_bot_add. Em mapas não suportados (através do processo nav_generate acima) eles funcionam, apenas visivelmente piores em imitar um jogador real.

Mapas PLR são uma causa perdida: bots não conseguem ultrapassar as barreiras em Hightower e ficam presos em cantos, e em todos os outros mapas PLR eles simplesmente... fazem uma festa de dança em vez de jogar. Isso pode ser corrigido eventualmente. Ou não.

Comportamento geral dos bots

Uma miscelânea de coisas que todo bot faz independentemente da habilidade:

  • Bots usam apenas equipamentos padrão (um plugin pode forçar armas não-padrão neles, mas bots vanilla nunca escolhem as suas próprias).
  • Bots Fáceis mal usam sua arma secundária. Dificuldades mais altas trocam para a secundária no momento em que a principal fica sem munição, ou para compensar o alcance.
  • Bots não conseguem fazer técnicas de movimento -- sem rocket jumps, sem realocação de construções.
  • Após uma morte, um bot pode provocar, mesmo sob fogo -- exceto enquanto carrega a inteligência inimiga, e esta regra também se aplica no MvM.
  • Bots Spies disfarçados (jogador ou IA) são ignorados corretamente por outros bots -- até tocarem um inimigo, sabotarem algo, atirarem ou ficarem invisíveis perto de um. Uma vez "descoberto", aquele bot/jogador específico é lembrado como Spy até que mude de disfarce enquanto permanece invisível, morra ou finja morte com o Dead Ringer.
  • Bots Pyro usam Compression Blast liberalmente em qualquer coisa acima de Fácil.
  • Bots Médicos priorizam curar todos acima de Snipers (e, em menor grau, Engineers), mesmo se você gritar "Médico!" como um deles.
  • Bots Médicos gravitam em direção a Heavies, Soldiers, Demomen e Pyros -- especificamente se um humano está jogando essas classes. Sem humanos nesses papéis, sem atenção particular do Médico.
  • Bots mantêm posição durante o tempo de preparação em mapas Attack/Defense e Payload -- exceto Engineers, Snipers e Spies, que se movem livremente (bots Demoman também podem pré-posicionar stickybombs).
  • Bots Engineer nunca melhoram ou removem sabotagem de construções de outro Engineer amigo, a menos que essa construção esteja no caminho do seu alvo. Eles também às vezes simplesmente... não reparam sua própria torreta, mesmo quando é seguro fazer isso.
  • Bots Spies que foram descobertos trocam para seu revólver e recuam em vez de forçar uma facada.
  • Bots Demoman que localizaram uma sentry (geralmente morrendo para ela uma vez) podem perfeitamente arremessar stickybombs sobre ela de fora do alcance, fazendo curvas ao redor de paredes e tetos quando a geometria permite.
  • Bots Sniper que não conseguem encontrar um alvo após mirar usam uma das falas de voz "Negativas".
  • Médicos amigos curam um Spy disfarçado sem hesitação.

Problemas/bugs conhecidos

O documento lista uma boa quantidade de peculiaridades antigas:

  • Bots podem tentar andar ou atirar através de certos objetos estáticos.
  • Qualquer vez que um jogador/bot se desmascara, se disfarça ou se revela, bots próximos "veem" e viram para reagir -- mesmo que o evento tenha ocorrido fora do campo de visão real deles. Não é baseado em som; é uma bypass na verificação de visão.
  • Raramente, bots podem ficar fisicamente presos juntos ao usar um teleporter do Engineer.
  • Comandos de voz de bots (ex. "Spy!", "Forward!") não aparecem como texto no chat como os dos jogadores.
  • Um bot Médico curando ativamente alguém não desvia de fogo recebido nem pega kits de saúde, mesmo com HP criticamente baixo.
  • Bots podem continuar se movendo enquanto realizam uma provocação em par, o que quebra o efeito pretendido do Festive Critical Strike.
  • Bots Médicos recentemente danificados frequentemente se recusam a usar a Syringe Gun à distância, preferindo combate corpo a corpo (ou, em casos muito raros, tentando acertar você com o feixe da Medi Gun).
  • Bots Médicos não compensam a queda da gravidade nos tiros da Syringe Gun -- provavelmente porque a arma não está marcada corretamente como não-hitscan no código da IA.
  • Bots Spy podem ver e rastrear um Spy invisível (jogador ou IA) se esse Spy já tiver sido descoberto uma vez, independentemente do nível de habilidade do bot rastreador.
  • Mesmo se um jogador-Spy se disfarçar como a classe do próprio time, esbarrar em um inimigo ainda o denuncia (bots nunca fazem isso consigo mesmos, já que bots nunca se disfarçam como seu próprio time).
  • Bots respeitam o balanceamento automático de times -- se você está tentando acumular bots em um time, precisa de mp_teams_unbalance_limit 0 primeiro.
  • Bots Engineer podem simplesmente ignorar suas próprias construções até que sejam destruídas.
  • Bots Heavy às vezes tentam atirar com a Minigun com munição criticamente baixa, principalmente abaixo da dificuldade Difícil.
  • Bots Médicos do time perdedor ocasionalmente cometem suicídio durante a fase de Humilhação quando nenhum inimigo está por perto -- algo que um jogador humano não consegue replicar nem tentando.
  • Definir sua pré-visualização de time na tela de carregamento para BLU faz com que os bots RED sejam renderizados visualmente como BLU para você.
  • Bots com corpo a corpo equipado às vezes se recusam a trocar de arma mesmo depois de pegar munição.
  • Pós-Jungle Inferno, bots gerados com parâmetros explícitos (ex. tf_bot_add 5 pyro blue normal) podem morrer instantaneamente na própria sala de spawn. Correção: tf_bot_reevaluate_class_in_spawnroom 0 (precisa de sv_cheats 1).

Nomes da IA

Os nomes dos bots são retirados de um grande conjunto de referências ao TF2, outros jogos da Valve e cultura de programação, em grande parte porque a comunidade continuava pedindo nomes específicos nos fóruns da Steam. Uma amostra da lista: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, e dezenas de outros nessa linha.

Há também um lote de nomes encontrados em uma versão vazada do código-fonte que nunca foi lançada em produção, por razões não claras -- principalmente referências a Last Dragon e The Fifth Element como John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh?, e I'm your huckleberry.

Você pode substituir tudo isso você mesmo: tf_bot_add heavyweapons blue "Blu Hoovy" gera um Heavy BLU nomeado chamado "Blu Hoovy."


Capítulo II: Os Bots Originais / TFBots -- Mergulho Profundo nos Níveis de Habilidade

A estrutura original de sigsegv ainda se mantém: é óbvio que bots Expert superam bots Fáceis, mas a Valve nunca explicou o quanto ou por quê. Então a única maneira de saber é ler o código. Aqui está toda mecânica que escala com a habilidade.

Definindo a dificuldade

Fora do MvM, a dificuldade é controlada por um cvar:

tf_bot_difficulty Nível de habilidade
0 Fácil
1 Normal (padrão)
2 Difícil
3 Expert

tf_bot_add também aceita um argumento de dificuldade diretamente (easy/normal/hard/expert).

Popfiles do MvM

Em Mann vs. Machine, cada bloco de spawn de TFBot no popfile tem uma chave Skill opcional. Sem chave significa Fácil. Nas próprias missões da Valve: Giants são quase sempre Expert, Engineers e Spies são quase sempre Expert, e Snipers são geralmente Difícil (ocasionalmente Expert). Se você estiver usando EventChangeAttributes (adicionado na atualização Two Cities) para alterar dinamicamente bots durante uma onda com base em eventos do mapa, a habilidade do bot é uma das propriedades que você pode alterar em tempo real.

Modo Endless do MvM

O modo Endless nunca foi lançado oficialmente, mas nele, os bots gastam seu dinheiro em melhorias como os jogadores fazem -- incluindo uma melhoria exclusiva de bot que aumenta seu nível de habilidade de IA durante a partida.

A entidade bot_generator

Uma entidade obscura, em grande parte não documentada, que se acredita ter sido usada no modo de treinamento e possivelmente no desenvolvimento inicial do MvM. Ela expõe uma entrada SetDifficulty para controlar o nível de habilidade. Além disso, a trilha se perde -- a Valve nunca a documentou e ninguém mapeou completamente seu comportamento.

Cor do brilho dos olhos

Robôs do MvM têm uma partícula de brilho nos olhos que muda de cor com o nível de habilidade -- uma dica visual que ninguém fora da comunidade jamais explicou:

Habilidade Cor dos olhos RGB
Fácil/Normal Azul #24b4ff
Difícil/Expert Amarelo #fff000

Bot Heavy do TF2 em pose parada

Visão: tempo de reconhecimento

Um bot não reage no instante em que algo entra em seu campo de visão -- há um atraso fixado no código antes que o resto da IA possa sequer reconhecer a ameaça:

Habilidade Tempo mínimo de reconhecimento
Fácil 1,00 s
Normal 0,50 s
Difícil 0,30 s
Expert 0,20 s

Isso é a maior parte do efeito "bots Fáceis parecem burros" em um único número -- um bot Fácil não mira pior depois que te nota, ele simplesmente leva cinco vezes mais tempo para notar que você existe.

Mira: taxa de atualização

Bots não rastreiam você continuamente. Eles amostram sua posição e velocidade em um intervalo fixo e preveem uma linha reta a partir disso:

Habilidade Intervalo de recálculo Taxa equivalente
Fácil 1,00 s 1x/s
Normal 0,25 s 4x/s
Difícil 0,10 s 10x/s
Expert 0,05 s 20x/s

Exceção: bots Spy são programados para a taxa de rastreamento Normal independentemente do seu nível de habilidade real -- um Spy Expert ainda mira como um bot Normal. Há também um vídeo de demonstração público comparando as taxas de rastreamento lado a lado se você quiser ver a diferença de 1x vs 20x em movimento.

Mira: habilidade específica por arma

Bots não apontam apenas para o centro de massa -- eles têm lógica por arma, parte dela genuinamente bugada:

Grenade Launcher & Sticky Launcher. Todos os níveis de habilidade compensam o arco vertical, usando um valor fixo do cvar tf_bot_ballistic_elevation_rate. Como essa compensação só é acionada para o ID de arma base, variantes de projétil mais rápido (Loch-n-Load, qualquer coisa com modificador de velocidade de projétil) não recebem arcos corretamente ajustados. E como é indexado pelo ID de arma especificamente, o Loose Cannon -- um ID completamente diferente -- não recebe compensação de arco alguma.

Huntsman. Bots Fáceis não compensam a queda da flecha e nunca miram na cabeça. Bots de habilidade Normal compensam o arco, mas só miram na cabeça dentro de 150 HU. Bots Difícil/Expert sempre miram na cabeça.

Lança-foguetes. Acima de 150 HU, bots não-Fáceis miram em seus pés em vez do centro de massa, maximizando o dano de splash e as chances de knockback. Dentro de 150 HU eles mudam para headshots. Bots Fáceis sempre miram no centro de massa independentemente da distância. Isso também está travado por ID de arma: o Direct Hit e o Cow Mangler não herdam o comportamento. Faz sentido para o Direct Hit (sem Área de Efeito para explorar); não faz sentido nenhum para o Cow Mangler -- esta parte da IA antecede a existência da arma e simplesmente nunca foi revisitada.

Fuzis de Sniper. Fácil mira no corpo. Normal mira aproximadamente 33% do caminho do corpo para a cabeça. Difícil/Expert miram direto na cabeça. Importa menos no MvM, onde headshots de bots não recebem bônus de dano de qualquer forma.

Audição: sensibilidade a disparos furtivos

Cada tiro alerta bots próximos sobre a posição do atirador, mesmo através de paredes, até 3000 HU com 100% de chance de notar (tf_bot_notice_gunfire_range). Mas um subconjunto de armas é marcado como "furtivo" -- audível apenas dentro de 500 HU (tf_bot_notice_quiet_gunfire_range), e mesmo assim com uma chance dependente da habilidade:

Habilidade Chance de notar um tiro furtivo
Fácil 10%
Normal 30%
Difícil 60%
Expert 90%

Essa probabilidade é reduzida pela metade se um tiro alto foi ouvido nos últimos 3 segundos -- sons altos mascaram sons baixos.

A lista de IDs de armas furtivas não é atualizada desde dezembro de 2010. Qualquer coisa adicionada após essa data usando um ID de arma novo é tratada como alta por padrão, não importa o quão silenciosa logicamente deveria ser, a menos que por acaso tenha reutilizado um ID mais antigo. Concretamente:

ID da Arma Abrange
TF_WEAPON_KNIFE Todas as facas do Spy
TF_WEAPON_FISTS Socos específicos do Heavy (soco multiclasses dele é na verdade TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Acredita-se não usado diretamente
TF_WEAPON_PDA_ENGINEER_BUILD PDA de Construção do Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA de Destruição do Engineer
TF_WEAPON_PDA_SPY Kit de disfarce do Spy
TF_WEAPON_BUILDER Kit de Engineer/Sapper do Spy
TF_WEAPON_MEDIGUN Todas as Medi Guns
TF_WEAPON_DISPENSER Provavelmente não usado (Dispensers são objetos, não armas)
TF_WEAPON_INVIS Todos os relógios de invisibilidade do Spy
TF_WEAPON_FLAREGUN Todas as flare guns do Pyro exceto o Manmelter
TF_WEAPON_LUNCHBOX Sanduíche, Barra Dalokohs, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (não Mad Milk -- ID separado, não furtivo)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

O exemplo clássico da lista apodrecendo: o Manmelter ganhou seu próprio ID (TF_WEAPON_RAYGUN_REVENGE), adicionado depois que a lista furtiva foi congelada -- então é tratado como alto, apesar de ser uma flare gun em todo sentido prático. O Scorch Shot, lançado ainda depois, reutiliza o ID base TF_WEAPON_FLAREGUN e portanto ainda é considerado furtivo. Sem sentido, mas é o código.

Estratégia: priorização de ameaças

Quando múltiplos inimigos estão visíveis ao mesmo tempo, os bots ponderam distância, se estão sendo alvejados e -- acima de Fácil -- se a ameaça principal está sendo curada:

Habilidade Mira no curador?
Fácil Não
Normal 50% de chance
Difícil Sim
Expert Sim

Inimigos além de 500 HU são normalmente despriorizados como não imediatos. Exceções: bots Difícil/Expert sempre tratam Médicos e Engineers distantes como ameaças imediatas, e qualquer Sniper inimigo mirando aproximadamente na sua direção é sempre tratado como imediato independentemente da distância e habilidade.

Habilidade Médicos/Engineers/Snipers mirando distantes = ameaça imediata?
Fácil/Normal Não
Difícil/Expert Sim

Essa verificação do Sniper tem uma história genuinamente engraçada. O artigo original de sigsegv assumiu que o jogo exigia que o produto escalar entre o vetor de mira do sniper e a posição relativa do bot fosse exatamente zero -- uma comparação tão precisa que quase nunca seria acionada em matemática de ponto flutuante, tornando todo o recurso efetivamente código morto. Uma correção emitida mais tarde (crédito a uma decompilação Hex-Rays mais limpa) mostrou que a verificação real é produto escalar > 0: qualquer Sniper virado de diretamente para você até perpendicular a você conta como ameaça imediata; qualquer coisa de perpendicular até virado de costas não conta. A leitura original errada veio de uma má decompilação de uma comparação SSE de floats -- fazer engenharia reversa de um binário AAA não é uma ciência exata.

Movimento: desvio

Bots Fáceis nunca desviam, ponto final. Bots Normal e acima desviam para esquerda/direita (33% esquerda, 33% direita, 33% não faz nada, ponderado contra lacunas detectadas) quando estão segurando uma arma de combate, viram um inimigo nos últimos 3 segundos, e esse inimigo tem linha de visão para eles.

Eles não desviam se alguma destas se aplicar: atributo DisableDodge definido, comportamento atual diz para se apressar, atualmente invulnerável (qualquer über), no meio de provocação/provocação, jogando de Engineer, invisível ou disfarçado de Spy, mirando como Sniper ou com a minigun girada como Heavy, ou no meio de puxar o Huntsman.

Movimento: evitar empurrar inimigos

Acima de Normal, bots especificamente tentam não esbarrar em inimigos enquanto se movem:

Habilidade Evita esbarrar em inimigos?
Fácil Não
Normal Não
Difícil Sim
Expert Sim

Na prática, isso só importa realmente para bots Spy -- evitar uma colisão estranha com um jogador inimigo é exatamente o tipo de coisa que estraga um disfarce.

Pyro: maestria do airblast

O airblast serve a dois propósitos: refletir projéteis (PvP e MvM) e empurrar inimigos próximos de bordas (apenas PvP). Se o bot realmente aperta o gatilho em uma oportunidade válida é um cara ou coroa baseado em habilidade:

Habilidade Chance de acionar airblast
Fácil 0%
Normal 50%
Difícil 90%
Expert 100%

Bots Pyro Fáceis literalmente não podem usar airblast -- a rolagem é programada para nunca ter sucesso, não apenas "raramente."

Spy: eficácia do disfarce

Dois eixos separados escalam com a habilidade. Escolha do disfarce:

Habilidade Método de disfarce
Fácil/Normal Classe aleatória, ignorando o que o time inimigo está realmente jogando
Difícil/Expert Escolhe um jogador inimigo real e copia a classe exata dele

Atuação do disfarce:

Habilidade Comportamento enquanto disfarçado/invisível
Fácil/Normal Encara jogadores inimigos quando os vê (suspeito)
Difícil/Expert Deliberadamente evita contato visual (mais convincente)

Spy: agressividade de facada

À longa distância (até 300 HU, tf_bot_spy_knife_range), um bot Spy só comete uma facada se puder ver a vítima e as costas da vítima estiverem pelo menos parcialmente viradas. A habilidade determina o quão fora do centro esse ângulo das costas pode estar:

Habilidade Tolerância de ângulo
Fácil Tenta mesmo com você virado diretamente para ele
Normal ±45° das suas costas
Difícil ±78° das suas costas
Expert ±90° das suas costas (arco traseiro completo de 180°)

Bots Spy Fáceis são funcionalmente suicidas -- eles tentam uma facada em alguém olhando diretamente para eles. Exceção: em Mann vs. Machine, todo bot Spy é forçado à restrição de ângulo Normal independentemente da habilidade real.

Táticas: seleção de armas

Só entra em ação acima de Fácil, e é praticamente irrelevante no MvM já que bots lá geralmente têm restrições de armas severas:

  • Scout: troca para a secundária quando o pente da principal está vazio.
  • Soldier: troca para a secundária com pente vazio e alvo mais próximo que 500 HU.
  • Sniper: troca para a secundária para alvos mais próximos que 750 HU.
  • Pyro: troca para a secundária para alvos mais distantes que 750 HU, a menos que o alvo seja um Soldier ou Demoman.

Táticas: recarga coberta

Não usado no MvM. Se o comportamento atual do bot não está mandando ele recuar, seu pente principal está vazio e ele não está uberado, bots de habilidade mais alta recuam temporariamente para se proteger para recarregar em vez de clicar com uma arma vazia em você:

Habilidade Recua para recarregar?
Fácil Não
Normal Não
Difícil Sim
Expert Sim

Modo CP: vagueação do defensor

Não usado no MvM. Defendendo um ponto de controle, bots de habilidade mais alta são mais propensos a sair do ponto para caçar mortes ("search and destroy"), mas apenas com uma quantidade decente de tempo restante em tf_bot_defense_must_defend_time:

Habilidade Chance de vaguear
Fácil 10%
Normal 50%
Difícil 75%
Expert 90%

Modo CP: bloqueio de captura

Não usado no MvM. Bots defendendo contestando uma tentativa de captura inimiga:

Habilidade Tentará bloquear a captura?
Fácil Não
Normal 50% de chance
Difícil Sim
Expert Sim

A tabela resumo completa

Aspecto Fácil Normal Difícil Expert Notas
Visão: tempo de reconhecimento 1,00s 0,50s 0,30s 0,20s
Mira: taxa de atualização 1x/s 4x/s 10x/s 20x/s Spies sempre usam Normal
Compensação de arco granada/sticky Sim Sim Sim Sim Loose Cannon isento
Compensação vertical Huntsman Não Sim Sim Sim
Headshots Huntsman Não <150 HU Sim Sim
Tiros nos pés Lança-foguetes Não Sim Sim Sim Direct Hit & Cow Mangler isentos
Ponto de mira Fuzil de Sniper Corpo ~33% para cabeça Cabeça Cabeça
Chance de notar tiros furtivos 10% 30% 60% 90% Reduzida à metade se mascarado por tiros altos
Mira no curador Não 50% Sim Sim
Médico/Engineer/Sniper distante = ameaça Não Não Sim Sim
Desvio Não Sim Sim Sim Longa lista de exceções
Evita esbarrar em inimigos Não Não Sim Sim Importa principalmente para Spy
Chance de acionar airblast 0% 50% 90% 100%
Escolha de classe do disfarce Spy Aleatório Aleatório Combina inimigo real Combina inimigo real
Contato visual Spy enquanto disfarçado Encara (óbvio) Encara Evita (convincente) Evita
Ângulo de facada Spy ~0° ±45° ±78° ±90° MvM força Normal
Lógica de seleção de armas Não Sim Sim Sim Menos relevante no MvM
Recarga coberta Não Não Sim Sim Não no MvM
Vagueação do defensor CP 10% 50% 75% 90% Não no MvM
Bloqueio de captura CP Não 50% Sim Sim Não no MvM

Conclusão

Bot Heavy do TF2 mirando com uma minigun

Nada disso é um palpite errado da Valve -- é um sistema de pontuação e probabilidade deliberado e totalmente determinístico, apenas nunca escrito em lugar oficial nenhum. Algumas coisas que valem lembrar:

  1. "Habilidade" é um conjunto de controles independentes, não um multiplicador global único. Tempo de reação, taxa de mira e cada comportamento tático escalam separadamente, e alguns (taxa de rastreamento do Spy, ângulo de facada no MvM) têm substituições fixadas no código independentemente da habilidade.
  2. Parte disso é genuinamente bugado, não apenas antigo. A lista de armas furtivas congelada desde 2010, o Cow Mangler sem a lógica de tiro nos pés sem motivo algum, a verificação de produto escalar do Sniper que levou anos para ser decompilada corretamente -- o código de IA da Valve tem cicatrizes como qualquer outra base de código de 17 anos.
  3. Você pode usar tudo isso. Saber que um bot Sniper não vai acertar um headshot em você no Normal, que um Pyro Fácil literalmente não pode refletir seu foguete de volta, que um Spy Fácil vai tentar te esfaquear cara a cara. Não é sorte. É uma ficha técnica.

Muito obrigado a sigsegv pelo mergulho no código original que tornou a maior parte disso possível, à Wiki do TF2 pela documentação básica sobre comandos de bot e suporte a mapas, e a todos na comunidade que ainda estão cutucando uma IA de bot de 17 anos para descobrir exatamente por que ela faz o que faz.

Bot TF2 Tidak Acak: Saya Merekayasa Balik Setiap Pengaturan Kesulitan

Visi, pelacakan bidikan, sudut backstab Spy, logika headshot Sniper, setiap bug yang diketahui -- Valve tidak pernah mendokumentasikannya. Jadi kami menggali kode dan mengubahnya menjadi lembar spesifikasi lengkap.

Pendahuluan

Bot Soldier TF2 membidik peluncur roket

Setiap pemain TF2 pernah mengatakannya setidaknya sekali: "bot ini curang." Atau sebaliknya: "kenapa bot Easy ini cuma berdiri di sana makan roket." Tidak ada yang benar-benar tahu apa arti "Easy," "Normal," "Hard," dan "Expert" di balik layar -- Valve mengirimkan empat label kesulitan dan tepat nol dokumentasi.

Jadi sekelompok kami (saya, awimii, Mush The Possum, dengan sebagian besar pekerjaan dasar oleh sigsegv, yang benar-benar menggali kode game yang didekompilasi) menyusun dokumen riset lengkap tentang perilaku TFBot. Setiap mekanik, setiap bug yang diketahui, setiap probabilitas yang dikodekan keras. Artikel ini adalah laporan lengkapnya, bukan yang diringkas. Ambil Bonk, ini bacaan panjang.


Bab I: Dasar-Dasar

Bot vs Puppet Bot

TF2 memiliki dua hal yang sangat berbeda yang disebut "bot":

  • Bot AI (TFBots): AI sungguhan, dibangun di atas kerangka PlayerBot/Infected yang sama yang digunakan Valve untuk seri Left 4 Dead. Mereka memilih kelas secara acak, bermain untuk tujuan, bekerja tanpa sv_cheats, dan memicu pencapaian seperti pemain sungguhan.
  • Puppet bot: tanpa AI, tidak bisa bergerak atau bertindak sendiri. Mereka ada semata-mata untuk dikendalikan secara manual -- pemain bisa memaksa mereka untuk mengikuti, membidik, dan menembak, biasanya digunakan untuk pengujian atau membuat tangkapan layar/video sinematik. Memunculkannya membutuhkan sv_cheats 1, yang juga menonaktifkan pencapaian untuk sesi tersebut.

Artikel ini sepenuhnya tentang jenis yang pertama.

Apa yang bisa (kurang lebih) diperintahkan ke bot AI

TFBot tidak bisa dikendalikan langsung, tetapi ada daftar pendek hal yang bisa Anda dorong untuk mereka lakukan:

  • Arahkan crosshair ke bot mana pun (teman atau musuh) dan bot akan mengejek Anda jika Anda menggunakan voice binds yang benar.
  • Bot Medic teman menyembuhkan Anda jika Anda menggunakan perintah suara "Medic!".
  • Jika bot Medic sedang menyembuhkan Anda dan memiliki ÜberCharge siap, mengatakan "Go go go!" atau "Activate charging!" membuatnya mengaktifkan charge segera.
  • Bot Medic dengan charge siap akan mengaktifkannya secara otomatis saat target penyembuhan atau dirinya sendiri terkena damage serius, tanpa perlu perintah suara.
  • Bot secara spontan akan melakukan partner taunt (High Five) atau group taunt (Conga) dengan rekan setim terdekat.

Membuat bot bekerja di map yang tidak didukung

Bot bergantung pada navigation mesh untuk tahu di mana mereka boleh berjalan, dan kebanyakan map komunitas tidak menyertakannya. Untuk memaksakannya:

  1. sv_cheats 1
  2. nav_generate -- membuat navmesh awal, progres ditampilkan di konsol
  3. Tunggu game selesai menghasilkan jalur
  4. Opsional: perbaiki data nav yang buruk secara manual dengan nav_edit 1
  5. Muat ulang atau restart server (melewatkan ini menonaktifkan pencapaian)
  6. tf_bot_add <number> untuk benar-benar memunculkan bot

Peringatan: mengubah navmesh saat bot aktif di server bisa membuat game crash. Setelah mesh ada, Anda tidak perlu membuatnya ulang untuk sesi berikutnya -- cukup tambahkan bot lagi dengan tf_bot_add.

Mesh yang dibuat otomatis bekerja paling baik di map Control Point, King of the Hill, Payload, dan CTF. Di map Mannpower, bot secara default bermain seperti gaya CTF tetapi jarang menggunakan grapple hook atau powerup. Jika map tidak memiliki tujuan yang dikenali AI bot tetapi memiliki entity spawn room, mengatur tf_bot_offense_must_push_time 0 memungkinkan bot bertarung.

(Sumber untuk bagian ini: halaman Bots di Wiki Resmi TF2.)

Status terkini, map per map

Berkat pembaruan Hatless, setiap kelas berfungsi dengan benar sekarang, termasuk Spy yang secara historis bermasalah. Bot berperilaku baik di sebagian besar map KOTH resmi, beberapa map Payload, Dustbowl/Gorge Attack-Defense, dan map CTF/Mann Manor -- meskipun di dua yang terakhir Anda tidak bisa memunculkannya langsung dengan tf_bot_add. Di map yang tidak didukung (melalui proses nav_generate di atas) mereka tetap bekerja, hanya saja terasa lebih buruk dalam meniru pemain sungguhan.

Map PLR adalah kasus yang sia-sia: bot tidak bisa melewati pembatas di Hightower dan macet di sudut, dan di semua map PLR lainnya mereka... mengadakan pesta dansa alih-alih bermain. Ini mungkin diperbaiki suatu hari nanti. Mungkin tidak.

Perilaku umum bot

Kumpulan hal-hal yang dilakukan setiap bot terlepas dari kemampuan:

  • Bot hanya menggunakan perlengkapan stok (plugin bisa memaksa senjata non-stok pada mereka, tetapi bot vanilla tidak pernah memilih sendiri).
  • Bot Easy jarang menyentuh senjata sekunder mereka. Kesulitan lebih tinggi beralih ke sekunder begitu amunisi utama habis, atau untuk mengimbangi jarak.
  • Bot tidak bisa melakukan movement tech -- tidak ada rocket jump, tidak ada relokasi bangunan.
  • Setelah membunuh, bot mungkin mengejek, bahkan saat ditembaki -- kecuali saat membawa intelijen musuh, dan aturan ini juga berlaku di MvM.
  • Bot Spy yang menyamar (pemain atau AI) diabaikan dengan benar oleh bot lain -- sampai mereka menyentuh musuh, menyabot sesuatu, menembak, atau menyelinap di dekat mereka. Setelah "terbongkar," bot/pemain tertentu itu diingat sebagai Spy sampai ia mengganti penyamaran sambil tetap tidak terlihat, mati, atau pura-pura mati dengan Dead Ringer.
  • Bot Pyro menggunakan Compression Blast secara bebas pada apa pun di atas Easy.
  • Bot Medic memprioritaskan menyembuhkan semua orang daripada Sniper (dan, pada tingkat lebih rendah, Engineer), bahkan jika Anda memencet "Medic!" sebagai salah satunya.
  • Bot Medic tertarik pada Heavy, Soldier, Demoman, dan Pyro -- terutama jika manusia yang memainkan kelas-kelas tersebut. Jika tidak ada manusia di peran tersebut, tidak ada perhatian khusus dari Medic.
  • Bot bertahan selama waktu setup di map Attack/Defense dan Payload -- kecuali Engineer, Sniper, dan Spy, yang bergerak bebas (bot Demoman juga diizinkan untuk menempatkan sticky bomb sebelumnya).
  • Bot Engineer tidak pernah meningkatkan atau menghilangkan sabotase dari bangunan Engineer teman, kecuali jika bangunan itu kebetulan berada di jalur target mereka. Mereka juga kadang... tidak memperbaiki turret mereka sendiri, bahkan saat aman untuk melakukannya.
  • Bot Spy yang terlihat beralih ke revolver dan mundur alih-alih memaksakan backstab.
  • Bot Demoman yang telah menemukan sentry (biasanya dengan mati karenanya sekali) bisa dengan sempurna melemparkan sticky bomb ke atasnya dari luar jangkauan, melengkung melewati dinding dan langit-langit jika geometri memungkinkan.
  • Bot Sniper yang tidak bisa menemukan target setelah membidik menggunakan salah satu baris suara "Negative".
  • Medic teman akan menyembuhkan Spy yang menyamar tanpa keraguan.

Masalah/bug yang diketahui

Dokumen tersebut mencantumkan tumpukan keanehan yang sudah berlangsung lama:

  • Bot bisa mencoba berjalan atau menembak melalui prop statis tertentu.
  • Setiap kali pemain/bot membuka topeng, menyamar, atau terungkap, bot di dekatnya "melihat" itu dan berbalik untuk bereaksi -- bahkan jika kejadian itu terjadi di luar bidang pandang aktual mereka. Ini bukan berbasis suara; ini adalah bypass pemeriksaan penglihatan.
  • Jarang, bot bisa saling menempel secara fisik saat menggunakan teleporter Engineer.
  • Perintah suara bot (mis. "Spy!", "Forward!") tidak ditampilkan sebagai teks chat seperti milik pemain.
  • Bot Medic yang sedang menyembuhkan seseorang tidak akan menghindari tembakan masuk atau mengambil health kit, bahkan saat HP sangat kritis.
  • Bot bisa terus bergerak saat melakukan partner taunt, yang merusak efek yang dimaksudkan dari Festive Critical Strike.
  • Bot Medic yang baru saja terluka sering menolak menggunakan Syringe Gun dari jarak jauh, lebih memilih pertarungan jarak dekat (atau, dalam kasus yang sangat jarang, mencoba memukul Anda dengan sinar Medi Gun itu sendiri).
  • Bot Medic tidak mengompensasi gravitasi pada tembakan Syringe Gun -- kemungkinan karena senjata tersebut tidak ditandai dengan benar sebagai non-hitscan dalam kode AI.
  • Bot Spy bisa melihat dan melacak Spy yang terselinap (pemain atau AI) jika Spy itu sudah pernah terbongkar sebelumnya, terlepas dari tingkat kemampuan bot pelacak.
  • Bahkan jika pemain-Spy menyamar sebagai kelas timnya sendiri, menabrak musuh masih membongkarnya (bot tidak pernah melakukan ini pada diri mereka sendiri, karena bot tidak pernah menyamar sebagai tim mereka sendiri).
  • Bot menghormati auto-balance tim -- jika Anda mencoba menumpuk bot di satu tim, Anda perlu mp_teams_unbalance_limit 0 terlebih dahulu.
  • Bot Engineer bisa mengabaikan bangunan mereka sendiri sampai hancur.
  • Bot Heavy kadang mencoba menembak Minigun saat amunisi sangat rendah, sebagian besar di bawah kesulitan Hard.
  • Bot Medic tim yang kalah kadang bunuh diri selama fase Humiliasi saat tidak ada musuh di dekatnya -- sesuatu yang tidak bisa ditiru pemain manusia bahkan dengan mencoba.
  • Mengatur pratinjau tim layar pemuatan ke BLU membuat bot RED terlihat sebagai BLU bagi Anda.
  • Bot dengan senjata jarak dekat kadang menolak mengganti senjata bahkan setelah mengambil amunisi.
  • Pasca-Jungle Inferno, bot yang dipanggil dengan parameter eksplisit (mis. tf_bot_add 5 pyro blue normal) bisa mati seketika di spawn room mereka sendiri. Perbaikan: tf_bot_reevaluate_class_in_spawnroom 0 (membutuhkan sv_cheats 1).

Nama AI

Nama bot diambil dari kumpulan besar referensi ke TF2, game Valve lainnya, dan budaya pemrograman, sebagian besar karena komunitas terus meminta nama tertentu di forum Steam. Contoh dari daftar: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, dan puluhan lainnya dengan nada yang sama.

Ada juga sekumpulan nama yang ditemukan dalam source build yang bocor tetapi tidak pernah dirilis dalam produksi, karena alasan yang tidak jelas -- sebagian besar referensi Last Dragon dan The Fifth Element seperti John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh?, dan I'm your huckleberry.

Anda bisa menimpa semua ini sendiri: tf_bot_add heavyweapons blue "Blu Hoovy" memunculkan Heavy BLU bernama "Blu Hoovy."


Bab II: Bot Asli / TFBot -- Penyelaman Mendalam Tingkat Kemampuan

Penjelasan asli Sigsegv masih berlaku: jelas bahwa bot Expert mengalahkan bot Easy, tetapi Valve tidak pernah menjelaskan seberapa banyak atau mengapa. Jadi satu-satunya cara untuk tahu adalah membaca kodenya. Berikut setiap mekanik yang berubah seiring kemampuan.

Mengatur kesulitan

Di luar MvM, kesulitan dikendalikan oleh satu cvar:

tf_bot_difficulty Tingkat kemampuan
0 Easy
1 Normal (default)
2 Hard
3 Expert

tf_bot_add juga menerima argumen kesulitan secara langsung (easy/normal/hard/expert).

Popfile MvM

Dalam Mann vs. Machine, setiap blok spawner TFBot di popfile memiliki kunci Skill opsional. Tanpa kunci berarti Easy. Di misi Valve sendiri: Giant hampir selalu Expert, Engineer dan Spy hampir selalu Expert, dan Sniper biasanya Hard (kadang Expert). Jika Anda menggunakan EventChangeAttributes (ditambahkan dalam pembaruan Two Cities) untuk mengubah bot secara dinamis di tengah gelombang berdasarkan peristiwa map, kemampuan bot adalah salah satu properti yang boleh diubah dengan cepat.

Mode Endless MvM

Mode Endless tidak pernah dirilis secara resmi, tetapi di dalamnya, bot membelanjakan uang mereka untuk upgrade seperti pemain -- termasuk upgrade eksklusif bot yang meningkatkan tingkat kemampuan AI mereka di tengah game.

Entity bot_generator

Entity yang tidak jelas dan sebagian besar tidak terdokumentasi, diyakini telah digunakan dalam mode pelatihan dan mungkin dalam pengembangan awal MvM. Ia mengekspos input SetDifficulty untuk mengontrol tingkat kemampuan. Di luar itu, jejaknya menghilang -- Valve tidak pernah mendokumentasikannya dan tidak ada yang memetakan perilakunya secara penuh.

Warna pancaran mata

Robot MvM memiliki partikel pancaran mata yang berubah warna sesuai tingkat kemampuan -- indikator visual yang tidak pernah dijelaskan oleh siapa pun di luar komunitas:

Kemampuan Warna mata RGB
Easy/Normal Biru #24b4ff
Hard/Expert Kuning #fff000

Bot Heavy TF2 dalam posisi diam

Visi: waktu pengenalan

Bot tidak bereaksi begitu sesuatu memasuki bidang pandangnya -- ada jeda yang dikodekan keras sebelum seluruh AI diizinkan untuk mengakui ancaman:

Kemampuan Waktu pengenalan minimum
Easy 1,00 dtk
Normal 0,50 dtk
Hard 0,30 dtk
Expert 0,20 dtk

Itulah sebagian besar efek "bot Easy terlihat bodoh" dalam satu angka -- bot Easy tidak membidik lebih buruk setelah melihat Anda, hanya butuh waktu lima kali lebih lama untuk menyadari keberadaan Anda.

Bidikan: tingkat pelacakan

Bot tidak melacak Anda secara terus-menerus. Mereka mengambil sampel posisi dan kecepatan Anda pada interval tetap dan memprediksi garis lurus dari sana:

Kemampuan Interval perhitungan ulang Tingkat ekuivalen
Easy 1,00 dtk 1x/dtk
Normal 0,25 dtk 4x/dtk
Hard 0,10 dtk 10x/dtk
Expert 0,05 dtk 20x/dtk

Pengecualian: Bot Spy dikodekan keras ke tingkat pelacakan Normal terlepas dari tingkat kemampuan sebenarnya -- Spy Expert masih membidik seperti bot Normal. Ada juga video demonstrasi publik yang membandingkan tingkat pelacakan secara berdampingan jika Anda ingin melihat kesenjangan 1x vs 20x dalam gerakan.

Membidik: kemampuan spesifik senjata

Bot tidak hanya mengarahkan ke pusat massa Anda -- mereka memiliki logika per-senjata, beberapa di antaranya benar-benar bermasalah:

Grenade Launcher & Sticky Launcher. Semua tingkat kemampuan mengompensasi lintasan vertikal, menggunakan nilai tetap dari cvar tf_bot_ballistic_elevation_rate. Karena kompensasi itu hanya berlaku untuk ID senjata dasar, varian proyektil yang lebih cepat (Loch-n-Load, apa pun dengan pengubah kecepatan proyektil) tidak mendapatkan lintasan yang disesuaikan dengan benar. Dan karena dikunci berdasarkan ID senjata, Loose Cannon -- ID yang berbeda sama sekali -- tidak mendapat kompensasi lintasan sama sekali.

Huntsman. Bot Easy tidak mengompensasi jatuhnya anak panah dan tidak pernah membidik kepala. Bot Normal mengompensasi lintasan, tetapi hanya membidik kepala dalam jarak 150 HU. Bot Hard/Expert selalu membidik kepala.

Peluncur Roket. Di atas 150 HU, bot non-Easy membidik kaki Anda alih-alih pusat massa, memaksimalkan damage percikan dan peluang knockback. Dalam 150 HU mereka beralih ke headshot. Bot Easy selalu membidik pusat massa terlepas dari jarak. Ini juga terkunci ID senjata: Direct Hit dan Cow Mangler tidak mewarisi perilaku ini. Masuk akal untuk Direct Hit (tanpa AoE untuk dieksploitasi); tidak masuk akal sama sekali untuk Cow Mangler -- bagian AI ini mendahului keberadaan senjata tersebut dan tidak pernah ditinjau ulang.

Sniper Rifle. Easy membidik tubuh. Normal membidik sekitar 33% dari tubuh ke kepala. Hard/Expert membidik langsung ke kepala. Kurang berpengaruh di MvM, di mana headshot bot tidak mendapatkan bonus damage.

Pendengaran: sensitivitas terhadap tembakan sembunyi

Setiap tembakan senjata memberi tahu bot di dekatnya tentang posisi penembak, bahkan melalui dinding, hingga 3000 HU dengan peluang 100% (tf_bot_notice_gunfire_range). Tetapi sebagian senjata ditandai "sembunyi" -- hanya terdengar dalam 500 HU (tf_bot_notice_quiet_gunfire_range), dan bahkan dengan peluang tergantung kemampuan:

Kemampuan Peluang mendengar tembakan sembunyi
Easy 10%
Normal 30%
Hard 60%
Expert 90%

Probabilitas itu dibagi dua jika tembakan keras terdengar dalam 3 detik terakhir -- suara keras menutupi suara pelan.

Daftar ID senjata sembunyi belum diperbarui sejak Desember 2010. Apa pun yang ditambahkan setelah tanggal itu menggunakan ID senjata baru diperlakukan sebagai keras secara default, tidak peduli seberapa pelan seharusnya, kecuali jika kebetulan menggunakan ID yang lebih lama. Secara konkret:

ID Senjata Mencakup
TF_WEAPON_KNIFE Semua pisau Spy
TF_WEAPON_FISTS Pukulan spesifik Heavy (pukulan multi-kelasnya sebenarnya TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Diyakini tidak digunakan langsung
TF_WEAPON_PDA_ENGINEER_BUILD PDA Pembangunan Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA Penghancuran Engineer
TF_WEAPON_PDA_SPY Perlengkapan penyamaran Spy
TF_WEAPON_BUILDER Perlengkapan Engineer/Sapper Spy
TF_WEAPON_MEDIGUN Semua Medi Gun
TF_WEAPON_DISPENSER Kemungkinan tidak digunakan (Dispenser adalah objek, bukan senjata)
TF_WEAPON_INVIS Semua jam tangan selubung Spy
TF_WEAPON_FLAREGUN Semua flare gun Pyro kecuali Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (bukan Mad Milk -- ID terpisah, non-sembunyi)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Contoh klasik dari daftar yang membusuk: Manmelter mendapat ID sendiri (TF_WEAPON_RAYGUN_REVENGE), ditambahkan setelah daftar sembunyi dibekukan -- jadi diperlakukan sebagai keras, meskipun secara praktis adalah flare gun. Scorch Shot, dirilis bahkan lebih lambat, menggunakan kembali ID dasar TF_WEAPON_FLAREGUN dan oleh karena itu masih dianggap sembunyi. Tidak masuk akal, tetapi itulah kodenya.

Strategi: prioritisasi ancaman

Ketika beberapa musuh terlihat sekaligus, bot mempertimbangkan jarak, apakah mereka sedang ditembaki, dan -- di atas Easy -- apakah ancaman utama sedang disembuhkan:

Kemampuan Menargetkan penyembuh sebagai gantinya?
Easy Tidak
Normal Peluang 50%
Hard Ya
Expert Ya

Musuh di atas 500 HU biasanya diprioritaskan lebih rendah sebagai tidak langsung. Pengecualian: bot Hard/Expert selalu menganggap Medic dan Engineer jarak jauh sebagai ancaman langsung, dan setiap Sniper musuh yang membidik ke arah Anda selalu dianggap langsung terlepas dari jarak dan kemampuan.

Kemampuan Medic/Engineer jarak jauh / Sniper membidik = ancaman langsung?
Easy/Normal Tidak
Hard/Expert Ya

Pemeriksaan Sniper itu memiliki sejarah yang sungguh menarik. Tulisan asli sigsegv mengasumsikan game membutuhkan perkalian titik antara vektor bidik sniper dan posisi relatif bot menjadi tepat nol -- perbandingan yang sangat presisi sehingga hampir tidak pernah terpicu dalam aritmatika floating point, membuat seluruh fitur efektif menjadi kode mati. Koreksi yang dirilis kemudian (berkat pembersihan dekompilasi Hex-Rays) menunjukkan pemeriksaan sebenarnya adalah perkalian titik > 0: setiap Sniper yang menghadap ke mana pun dari langsung-ke-Anda hingga tegak-lurus-ke-Anda dianggap ancaman langsung; apa pun dari tegak-lurus hingga membelakangi tidak. Kesalahan pembacaan asli berasal dari dekompilasi buruk dari perbandingan float SSE -- merekayasa balik biner AAA bukanlah ilmu pasti.

Gerakan: menghindar

Bot Easy tidak pernah menghindar, titik. Bot Normal ke atas menghindar kiri/kanan (33% kiri, 33% kanan, 33% tidak melakukan apa-apa, dibobot terhadap celah yang terdeteksi) ketika mereka memegang senjata tempur, telah melihat musuh dalam 3 detik terakhir, dan musuh itu memiliki garis pandang ke mereka.

Mereka tidak akan menghindar jika salah satu dari ini berlaku: atribut DisableDodge diatur, perilaku saat ini menyuruh untuk buru-buru, sedang kebal (uber apa pun), sedang mengejek/provokasi, bermain Engineer, tidak terlihat atau menyamar sebagai Spy, membidik sebagai Sniper atau memutar sebagai Heavy, atau sedang menarik Huntsman.

Gerakan: menghindari mendorong musuh

Di atas Normal, bot secara khusus berusaha untuk tidak menabrak musuh saat bergerak:

Kemampuan Menghindari menabrak musuh?
Easy Tidak
Normal Tidak
Hard Ya
Expert Ya

Dalam praktiknya ini hanya benar-benar penting untuk bot Spy -- menghindari tabrakan canggung dengan pemain musuh adalah hal yang bisa membongkar penyamaran.

Pyro: penguasaan airblast

Airblast melayani dua tujuan: memantulkan proyektil (PvP dan MvM) dan mendorong musuh di dekatnya dari tepi (hanya PvP). Apakah bot benar-benar menarik pelatuk pada kesempatan yang valid adalah lemparan koin berbasis kemampuan:

Kemampuan Peluang memicu airblast
Easy 0%
Normal 50%
Hard 90%
Expert 100%

Bot Pyro Easy secara harfiah tidak bisa melakukan airblast -- lemparannya dikodekan keras untuk tidak pernah berhasil, bukan hanya "jarang."

Spy: efektivitas penyamaran

Dua sumbu terpisah berubah seiring kemampuan. Pemilihan penyamaran:

Kemampuan Metode penyamaran
Easy/Normal Kelas acak, mengabaikan apa yang sebenarnya dimainkan tim musuh
Hard/Expert Memilih pemain musuh sungguhan dan menyalin kelas persis mereka

Akting penyamaran:

Kemampuan Perilaku saat menyamar/terselinap
Easy/Normal Menatap pemain musuh saat melihat mereka (mencurigakan)
Hard/Expert Sengaja menghindari kontak mata (lebih meyakinkan)

Spy: agresivitas backstab

Pada jarak jauh (hingga 300 HU, tf_bot_spy_knife_range), bot Spy hanya melakukan backstab jika bisa melihat korban dan punggung korban setidaknya sebagian berbalik. Kemampuan menentukan seberapa jauh dari pusat sudut belakang itu diizinkan:

Kemampuan Toleransi sudut
Easy Mencoba bahkan jika menghadap Anda langsung
Normal ±45° dari punggung Anda
Hard ±78° dari punggung Anda
Expert ±90° dari punggung Anda (busur 180° belakang penuh)

Bot Spy Easy secara fungsional adalah bunuh diri -- mereka akan mencoba backstab pada seseorang yang menatap langsung ke mereka. Pengecualian: dalam Mann vs. Machine, setiap bot Spy dipaksa ke batasan sudut Normal terlepas dari kemampuan sebenarnya.

Taktik: pemilihan senjata

Hanya berlaku di atas Easy, dan sebagian besar tidak relevan di MvM karena bot di sana biasanya memiliki batasan senjata yang ketat:

  • Scout: beralih ke sekunder ketika magazen senjata utama kosong.
  • Soldier: beralih ke sekunder ketika magazen kosong dan target lebih dekat dari 500 HU.
  • Sniper: beralih ke sekunder untuk target lebih dekat dari 750 HU.
  • Pyro: beralih ke sekunder untuk target lebih jauh dari 750 HU, kecuali jika target itu adalah Soldier atau Demoman.

Taktik: isi ulang di balik perlindungan

Tidak digunakan di MvM. Jika perilaku bot saat ini tidak menyuruhnya mundur, magazen utamanya kosong, dan tidak sedang uber, bot dengan kemampuan lebih tinggi akan mundur sementara ke perlindungan untuk mengisi ulang alih-alih mengklik senjata kosong ke arah Anda:

Kemampuan Mundur untuk mengisi ulang?
Easy Tidak
Normal Tidak
Hard Ya
Expert Ya

Mode CP: pengembaraan defender

Tidak digunakan di MvM. Saat mempertahankan control point, bot dengan kemampuan lebih tinggi lebih mungkin meninggalkan point untuk berburu kill ("search and destroy"), tetapi hanya dengan sisa waktu yang cukup pada tf_bot_defense_must_defend_time:

Kemampuan Peluang mengembara
Easy 10%
Normal 50%
Hard 75%
Expert 90%

Mode CP: pemblokiran capture

Tidak digunakan di MvM. Bot bertahan yang melawan upaya capture musuh:

Kemampuan Akan mencoba memblokir capture?
Easy Tidak
Normal Peluang 50%
Hard Ya
Expert Ya

Tabel ringkasan lengkap

Aspek Easy Normal Hard Expert Catatan
Visi: waktu pengenalan 1,00dtk 0,50dtk 0,30dtk 0,20dtk
Bidikan: tingkat pelacakan 1x/dtk 4x/dtk 10x/dtk 20x/dtk Spy selalu pakai Normal
Kompensasi lintasan granat/sticky Ya Ya Ya Ya Loose Cannon dikecualikan
Kompensasi vertikal Huntsman Tidak Ya Ya Ya
Headshot Huntsman Tidak <150 HU Ya Ya
Tembakan kaki Peluncur Roket Tidak Ya Ya Ya Direct Hit & Cow Mangler dikecualikan
Titik bidik Sniper Rifle Tubuh ~33% ke kepala Kepala Kepala
Peluang mendengar tembakan sembunyi 10% 30% 60% 90% Dibagi dua jika tertutup suara keras
Menargetkan penyembuh Tidak 50% Ya Ya
Medic/Engineer/Sniper jarak jauh = ancaman Tidak Tidak Ya Ya
Menghindar Tidak Ya Ya Ya Daftar pengecualian panjang
Menghindari menabrak musuh Tidak Tidak Ya Ya Sebagian besar penting untuk Spy
Peluang memicu airblast 0% 50% 90% 100%
Pemilihan kelas samaran Spy Acak Acak Cocok dengan musuh asli Cocok dengan musuh asli
Kontak mata Spy saat menyamar Menatap (jelas) Menatap Menghindari (meyakinkan) Menghindari
Sudut backstab Spy ~0° ±45° ±78° ±90° MvM memaksa Normal
Logika pemilihan senjata Tidak Ya Ya Ya Kurang relevan di MvM
Isi ulang di perlindungan Tidak Tidak Ya Ya Tidak di MvM
Pengembaraan defender CP 10% 50% 75% 90% Tidak di MvM
Pemblokiran capture CP Tidak 50% Ya Ya Tidak di MvM

Kesimpulan

Bot Heavy TF2 membidik minigun

Tidak satu pun dari ini adalah tebakan yang salah dari pihak Valve -- ini adalah sistem penilaian dan probabilitas yang disengaja, sepenuhnya deterministik, hanya tidak pernah ditulis di mana pun secara resmi. Beberapa hal yang perlu diingat:

  1. "Kemampuan" adalah kumpulan dial independen, bukan satu pengali global. Waktu reaksi, tingkat bidikan, dan setiap perilaku taktis berskala secara terpisah, dan beberapa (tingkat pelacakan Spy, sudut backstab MvM) mendapatkan timpaan kode keras terlepas dari kemampuan.
  2. Beberapa dari ini benar-benar bermasalah, bukan hanya tua. Daftar senjata sembunyi yang dibekukan sejak 2010, Cow Mangler yang kehilangan logika tembakan kaki tanpa alasan yang jelas, pemeriksaan perkalian titik Sniper yang butuh waktu bertahun-tahun untuk didekompilasi dengan benar -- kode AI Valve memiliki jaringan parut seperti basis kode berusia 17 tahun lainnya.
  3. Anda bisa menggunakan semua ini. Ketahuilah bahwa bot Sniper tidak akan melakukan headshot pada Anda di Normal, bahwa Pyro Easy secara harfiah tidak bisa menghembuskan roket Anda kembali, bahwa Spy Easy akan mencoba menusuk Anda secara tatap muka. Ini bukan keberuntungan. Ini adalah lembar spesifikasi.

Terima kasih besar kepada sigsegv untuk penyelaman kode asli yang memungkinkan sebagian besar ini, kepada Wiki TF2 untuk dokumentasi dasar tentang perintah bot dan dukungan map, dan kepada semua orang di komunitas yang masih mengutak-atik AI bot berusia 17 tahun untuk mencari tahu persis mengapa ia melakukan apa yang ia lakukan.

TF2 बॉट्स रैंडम नहीं हैं: मैंने हर डिफ़िकल्टी सेटिंग को रिवर्स-इंजीनियर किया

विज़न, एइम ट्रैकिंग, स्पाई बैकस्टैब एंगल, स्नाइपर हेडशॉट लॉजिक, हर ज्ञात बग -- वॉल्व ने इनमें से कुछ भी डॉक्यूमेंट नहीं किया। तो हमने कोड में खुदाई की और इसे एक पूर्ण स्पेक शीट में बदल दिया।

परिचय

TF2 सोल्जर बॉट रॉकेट लॉन्चर को निशाना बनाते हुए

हर TF2 खिलाड़ी ने कम से कम एक बार यह कहा है: "यह बॉट चीट कर रहा है।" या इसका उल्टा: "यह ईज़ी बॉट बस खड़ा होकर रॉकेट क्यों खा रहा है।" कोई नहीं जानता कि "ईज़ी," "नॉर्मल," "हार्ड," और "एक्सपर्ट" का असल में अंडर द हूड क्या मतलब है -- वॉल्व ने चार डिफ़िकल्टी लेबल और बिल्कुल शून्य डॉक्यूमेंटेशन भेजा।

तो हममें से कुछ (मैं, awimii, Mush The Possum, जिसमें sigsegv द्वारा किए गए भारी मात्रा में बुनियादी काम शामिल है, जो वास्तव में डिकंपाइल्ड गेम कोड में खुदाई करने गया था) ने TFBot व्यवहार पर एक पूर्ण शोध दस्तावेज़ तैयार किया। हर मैकेनिक, हर ज्ञात बग, हर हार्डकोडेड प्रॉबबिलिटी। यह लेख पूर्ण राइटअप है, संक्षिप्त वाला नहीं। एक Bonk पकड़ो, यह लंबा वाला है।


अध्याय I: मूल बातें

बॉट बनाम पपेट बॉट

TF2 में दो पूरी तरह से अलग चीज़ें हैं जिन्हें लोग "बॉट" कहते हैं:

  • AI बॉट्स (TFBots): असली AI, उसी PlayerBot/Infected फ्रेमवर्क पर बने जिसका उपयोग वॉल्व ने Left 4 Dead सीरीज़ के लिए किया था। वे एक रैंडम क्लास चुनते हैं, वे ऑब्जेक्टिव खेलते हैं, वे sv_cheats के बिना काम करते हैं, और वे एक वास्तविक खिलाड़ी की तरह अचीवमेंट ट्रिगर करते हैं।
  • पपेट बॉट्स: शून्य AI, अपने आप चल या काम नहीं कर सकते। वे पूरी तरह से मैन्युअल रूप से नियंत्रित किए जाने के लिए मौजूद हैं -- एक खिलाड़ी उन्हें फॉलो करने, निशाना लगाने और फायर करने के लिए मजबूर कर सकता है, ज्यादातर परीक्षण या सिनेमैटिक स्क्रीनशॉट/वीडियो बनाने के लिए उपयोग किया जाता है। उन्हें स्पॉन करने के लिए sv_cheats 1 की आवश्यकता होती है, जो सत्र के लिए अचीवमेंट को भी अक्षम करता है।

यह लेख पूरी तरह से पहले प्रकार के बारे में है।

AI बॉट्स को (कुछ हद तक) क्या करने के लिए कहा जा सकता है

TFBots सीधे नियंत्रणीय नहीं हैं, लेकिन चीज़ों की एक छोटी सूची है जो आप उन्हें करने के लिए प्रेरित कर सकते हैं:

  • अपने क्रॉसहेयर को किसी भी बॉट (दोस्ताना या दुश्मन) पर लक्षित करें और यदि आप सही वॉइस बाइंड्स का उपयोग करते हैं तो यह आप पर ताना मारेगा।
  • एक दोस्ताना मेडिक बॉट आपको ठीक करता है यदि आप "Medic!" वॉइस कमांड का उपयोग करते हैं।
  • यदि कोई मेडिक बॉट आपको ठीक कर रहा है और उसके पास ÜberCharge तैयार है, तो "Go go go!" या "Activate charging!" कहने से यह तुरंत चार्ज पॉप कर देता है।
  • चार्ज तैयार होने पर मेडिक बॉट अपने आप चार्ज पॉप कर देगा जैसे ही उसे या उसके हील टार्गेट को गंभीर नुकसान होता है, बिना किसी वॉइस कमांड की आवश्यकता के।
  • बॉट अपने आप पास के टीममेट्स के साथ पार्टनर ताना (हाई फाइव) या ग्रुप ताना (कोंगा) करेंगे।

असमर्थित मैप्स पर बॉट्स को काम करवाना

बॉट यह जानने के लिए नेविगेशन मेश पर निर्भर करते हैं कि उन्हें कहाँ चलने की अनुमति है, और अधिकांश कम्युनिटी मैप्स इसके साथ नहीं आते। इसे मजबूर करने के लिए:

  1. sv_cheats 1
  2. nav_generate -- प्रारंभिक नेवमेश बनाता है, प्रगति कंसोल में दिखाई गई
  3. गेम द्वारा पथ उत्पन्न करना समाप्त करने की प्रतीक्षा करें
  4. वैकल्पिक रूप से nav_edit 1 के साथ मैन्युअल रूप से खराब नेव डेटा ठीक करें
  5. सर्वर को रीलोड या रीस्टार्ट करें (इसे छोड़ने से अचीवमेंट अक्षम हो जाते हैं)
  6. वास्तव में बॉट्स स्पॉन करने के लिए tf_bot_add <number>

चेतावनी: जब सर्वर पर बॉट सक्रिय हों तो नेवमेश बदलने से गेम क्रैश हो सकता है। एक बार मेश मौजूद हो जाने पर आपको भविष्य के सत्रों के लिए इसे पुनर्जीवित करने की आवश्यकता नहीं है -- बस tf_bot_add के साथ बॉट्स को फिर से जोड़ें।

ऑटो-जनरेटेड मेश कंट्रोल पॉइंट, किंग ऑफ द हिल, पेलोड और CTF मैप्स पर सबसे अच्छा काम करते हैं। मैनपावर मैप्स पर बॉट डिफ़ॉल्ट रूप से CTF-शैली खेलते हैं लेकिन शायद ही कभी ग्रैपल हुक या पावरअप का उपयोग करते हैं। यदि किसी मैप में कोई ऑब्जेक्टिव नहीं है जिसे बॉट AI पहचानता है लेकिन उसमें स्पॉन रूम एंटिटी है, तो tf_bot_offense_must_push_time 0 सेट करने से बॉट वैसे भी लड़ सकते हैं।

(इस सेक्शन का स्रोत: आधिकारिक TF2 विकी का बॉट्स पेज।)

वर्तमान स्थिति, मैप दर मैप

Hatless अपडेट की बदौलत, हर क्लास अब सही ढंग से काम करता है, जिसमें ऐतिहासिक रूप से बग्गी स्पाई भी शामिल है। बॉट अधिकांश आधिकारिक KOTH मैप्स, कुछ पेलोड मैप्स, डस्टबाउल/गॉर्ज अटैक-डिफेंस और CTF/मान्न मैनर मैप्स पर सही ढंग से व्यवहार करते हैं -- हालांकि बाद वाले दो पर आप उन्हें सीधे tf_bot_add से स्पॉन नहीं कर सकते। असमर्थित मैप्स पर (ऊपर nav_generate प्रक्रिया के माध्यम से) वे काम करते हैं, बस एक वास्तविक खिलाड़ी की नकल करने में काफी बुरे होते हैं।

PLR मैप्स एक खोया हुआ कारण हैं: बॉट हाइटावर पर बैरियर साफ़ नहीं कर सकते और कोनों में फंस जाते हैं, और हर दूसरे PLR मैप पर वे बस... खेलने के बजाय डांस पार्टी करते हैं। यह अंततः ठीक हो सकता है। नहीं भी हो सकता है।

सामान्य बॉट व्यवहार

कौशल की परवाह किए बिना हर बॉट द्वारा की जाने वाली चीज़ों का एक मिश्रण:

  • बॉट केवल स्टॉक लोडआउट का उपयोग करते हैं (एक प्लगइन उन पर नॉन-स्टॉक हथियार थोप सकता है, लेकिन वैनिला बॉट कभी अपना खुद का नहीं चुनते)।
  • ईज़ी बॉट शायद ही अपने सेकेंडरी हथियार को छूते हैं। उच्च डिफ़िकल्टी पर प्राइमरी खत्म होते ही सेकेंडरी पर स्विच करते हैं, या रेंज की भरपाई के लिए।
  • बॉट मूवमेंट टेक नहीं कर सकते -- कोई रॉकेट जंप नहीं, कोई बिल्डिंग रीलोकेशन नहीं।
  • एक किल के बाद, बॉट ताना मार सकता है, भले ही फायर के तहत हो -- सिवाय दुश्मन की इंटेलिजेंस ले जाते समय, और यह नियम MvM पर भी लागू होता है।
  • डिस्गाइज़्ड स्पाई बॉट्स (खिलाड़ी या AI) को अन्य बॉट्स द्वारा सही ढंग से अनदेखा किया जाता है -- जब तक वे किसी दुश्मन को छूते, सैप करते, गोली चलाते या किसी के पास क्लोक नहीं करते। एक बार "पकड़े" जाने पर, उस विशिष्ट बॉट/खिलाड़ी को स्पाई के रूप में याद रखा जाता है जब तक वह अदृश्य रहते हुए डिस्गाइज़ बदलता है, मर जाता है, या डेड रिंगर से मौत का नाटक करता है।
  • पायरो बॉट ईज़ी से ऊपर कुछ भी होने पर कम्प्रेशन ब्लास्ट का उदारतापूर्वक उपयोग करते हैं।
  • मेडिक बॉट स्नाइपर्स (और, कुछ हद तक, इंजीनियर्स) पर सभी को ठीक करने को प्राथमिकता देते हैं, भले ही आप उनमें से एक के रूप में "Medic!" स्पैम करें।
  • मेडिक बॉट हेवीज़, सोल्जर्स, डेमोमैन और पायरोज़ की ओर आकर्षित होते हैं -- खासकर यदि कोई मानव उन क्लासेस को खेल रहा है। उन भूमिकाओं में कोई मानव नहीं, तो कोई विशेष मेडिक ध्यान नहीं।
  • बॉट अटैक/डिफेंस और पेलोड मैप्स पर सेटअप समय के दौरान स्थिति बनाए रखते हैं -- इंजीनियर्स, स्नाइपर्स और स्पाइज़ को छोड़कर, जो स्वतंत्र रूप से चलते हैं (डेमोमैन बॉट्स को भी प्री-प्लेस स्टिकीज़ की अनुमति है)।
  • इंजीनियर बॉट कभी भी किसी अन्य दोस्ताना इंजीनियर की बिल्डिंग को अपग्रेड या डी-सैप नहीं करते, जब तक कि वह बिल्डिंग उनके टार्गेट के रास्ते में न हो। वे कभी-कभी बस... अपनी खुद की टर्रेट की मरम्मत नहीं करते, भले ही ऐसा करना सुरक्षित हो।
  • देखे गए स्पाई बॉट अपने रिवॉल्वर पर स्विच करते हैं और जबरदस्ती स्टैब करने के बजाय पीछे हट जाते हैं।
  • डेमोमैन बॉट जिन्होंने एक सेंट्री का पता लगा लिया है (आमतौर पर एक बार इसके द्वारा मरकर) उस पर अपनी रेंज के बाहर से पूरी तरह से स्टिकीज़ लॉब कर सकते हैं, जब ज्यामिति अनुमति देती है तो दीवारों और छतों के चारों ओर घुमाते हुए।
  • स्नाइपर बॉट जो स्कोप करने के बाद कोई टार्गेट नहीं ढूंढ पाते, "Negative" वॉइस लाइनों में से एक का उपयोग करते हैं।
  • दोस्ताना मेडिक्स बिना किसी हिचकिचाहट के एक डिस्गाइज़्ड स्पाई को ठीक करेंगे।

ज्ञात समस्याएं / बग

दस्तावेज़ लंबे समय से चली आ रही विचित्रताओं का एक ठोस ढेर सूचीबद्ध करता है:

  • बॉट कुछ स्थिर प्रॉप्स के माध्यम से चलने या गोली चलाने का प्रयास कर सकते हैं।
  • जब भी कोई खिलाड़ी/बॉट अनमास्क, डिस्गाइज़ या रिवील करता है, पास के बॉट इसे "देखते" हैं और प्रतिक्रिया करने के लिए मुड़ते हैं -- भले ही घटना उनके वास्तविक दृष्टि क्षेत्र के बाहर हुई हो। यह ध्वनि-आधारित नहीं है; यह एक विज़न-चेक बाइपास है।
  • शायद ही कभी, बॉट इंजीनियर टेलीपोर्टर का उपयोग करते समय शारीरिक रूप से एक साथ फंस सकते हैं।
  • बॉट वॉइस कमांड (जैसे "Spy!", "Forward!") खिलाड़ियों की तरह चैट टेक्स्ट के रूप में प्रदर्शित नहीं होते।
  • एक मेडिक बॉट जो सक्रिय रूप से किसी को ठीक कर रहा है, वह आने वाली आग से नहीं बचेगा या हेल्थ किट नहीं उठाएगा, भले ही बेहद कम HP पर हो।
  • पार्टनर ताना करते समय बॉट चलते रह सकते हैं, जो फेस्टिव क्रिटिकल स्ट्राइक के इच्छित प्रभाव को तोड़ता है।
  • हाल ही में क्षतिग्रस्त मेडिक बॉट अक्सर रेंज पर सिरिंज गन का उपयोग करने से इनकार करते हैं, मेली पसंद करते हैं (या, बहुत ही दुर्लभ मामलों में, आपको मेडी गन बीम से ही मारने की कोशिश करते हैं)।
  • मेडिक बॉट सिरिंज गन शॉट्स पर ग्रैविटी ड्रॉप की भरपाई नहीं करते -- संभवतः क्योंकि हथियार AI कोड में सही ढंग से नॉन-हिटस्कैन के रूप में फ्लैग नहीं किया गया है।
  • स्पाई बॉट एक क्लोक्ड स्पाई (खिलाड़ी या AI) को देख और ट्रैक कर सकते हैं यदि उस स्पाई ने पहले ही एक बार अपना कवर उड़ा दिया है, ट्रैकिंग बॉट के कौशल स्तर की परवाह किए बिना।
  • भले ही कोई खिलाड़ी-स्पाई अपनी ही टीम के क्लास के रूप में डिस्गाइज़ करता है, दुश्मन से टकराना फिर भी उन्हें बेनकाब करता है (बॉट अपने साथ ऐसा कभी नहीं करते, क्योंकि बॉट कभी अपनी ही टीम के रूप में डिस्गाइज़ नहीं करते)।
  • बॉट टीम ऑटो-बैलेंस का सम्मान करते हैं -- यदि आप एक टीम पर बॉट्स को स्टैक करने की कोशिश कर रहे हैं, तो आपको पहले mp_teams_unbalance_limit 0 चाहिए।
  • इंजीनियर बॉट अपनी खुद की बिल्डिंग को पूरी तरह से अनदेखा कर सकते हैं जब तक वे नष्ट न हो जाएं।
  • हेवी बॉट कभी-कभी गंभीर रूप से कम गोला-बारूद होने पर मिनीगन चलाने की कोशिश करते हैं, ज्यादातर हार्ड डिफ़िकल्टी से नीचे।
  • हारने वाली टीम के मेडिक बॉट कभी-कभी ह्युमिलिएशन चरण के दौरान आत्महत्या कर लेते हैं जब कोई दुश्मन पास नहीं होता -- ऐसा कुछ जो एक मानव खिलाड़ी कोशिश करके भी दोहरा नहीं सकता।
  • अपने लोडिंग-स्क्रीन टीम पूर्वावलोकन को BLU पर सेट करने से RED बॉट आपके लिए दृश्य रूप से BLU के रूप में रेंडर होते हैं।
  • हाथ में मेली लिए बॉट कभी-कभी गोला-बारूद उठाने के बाद भी हथियार बदलने से इनकार करते हैं।
  • जंगल इन्फ़र्नो के बाद, स्पष्ट पैराम्स (जैसे tf_bot_add 5 pyro blue normal) के साथ स्पॉन किए गए बॉट अपने ही स्पॉन रूम में तुरंत मर सकते हैं। फिक्स: tf_bot_reevaluate_class_in_spawnroom 0 (इसके लिए sv_cheats 1 चाहिए)।

AI नाम

बॉट के नाम TF2, अन्य वॉल्व गेम्स और प्रोग्रामिंग कल्चर के संदर्भों के एक बड़े पूल से लिए गए हैं, मुख्यतः क्योंकि कम्युनिटी ने स्टीम फ़ोरम पर विशिष्ट नामों का अनुरोध किया था। सूची का एक नमूना: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, और इसी तरह के दर्जनों और।

लीक हुई सोर्स बिल्ड में पाए गए नामों का एक बैच भी है जो कभी प्रोडक्शन में नहीं आया, अस्पष्ट कारणों से -- ज्यादातर लास्ट ड्रैगन और द फिफ्थ एलिमेंट संदर्भ जैसे जॉन स्पार्टन, लीलू डलास मल्टीपास, शो'नफ, ब्रूस लेरॉय, बिग गल्प हह?, और आई एम योर हकलबेरी।

आप यह सब खुद ओवरराइड कर सकते हैं: tf_bot_add heavyweapons blue "Blu Hoovy" "Blu Hoovy" नाम का एक BLU हेवी स्पॉन करता है।


अध्याय II: मूल बॉट्स / TFBots -- कौशल स्तर गहन विश्लेषण

Sigsegv का मूल फ्रेमिंग अभी भी सही है: यह स्पष्ट है कि एक्सपर्ट बॉट ईज़ी बॉट्स को पीछे छोड़ देते हैं, लेकिन वॉल्व ने कभी यह नहीं बताया कि कितना या क्यों। तो जानने का एकमात्र तरीका कोड को पढ़ना है। यहां हर वह मैकेनिक है जो कौशल के साथ बदलता है।

डिफ़िकल्टी सेट करना

MvM के बाहर, डिफ़िकल्टी एक cvar द्वारा नियंत्रित होती है:

tf_bot_difficulty कौशल स्तर
0 ईज़ी
1 नॉर्मल (डिफ़ॉल्ट)
2 हार्ड
3 एक्सपर्ट

tf_bot_add सीधे डिफ़िकल्टी आर्गुमेंट भी स्वीकार करता है (easy/normal/hard/expert)।

MvM पॉपफ़ाइल्स

मैन बनाम मशीन में, पॉपफ़ाइल में प्रत्येक TFBot स्पॉनर ब्लॉक में एक वैकल्पिक Skill कुंजी होती है। कोई कुंजी नहीं means ईज़ी। वॉल्व के अपने मिशनों में: जायंट्स लगभग हमेशा एक्सपर्ट होते हैं, इंजीनियर्स और स्पाइज़ लगभग हमेशा एक्सपर्ट होते हैं, और स्नाइपर्स आमतौर पर हार्ड (कभी-कभी एक्सपर्ट) होते हैं। यदि आप मैप इवेंट्स के आधार पर मिड-वेव बॉट्स को गतिशील रूप से बदलने के लिए EventChangeAttributes (टू सिटीज़ अपडेट में जोड़ा गया) का उपयोग कर रहे हैं, तो बॉट कौशल उन गुणों में से एक है जिसे आप मौके पर बदल सकते हैं।

MvM एंडलेस मोड

एंडलेस मोड कभी आधिकारिक रूप से शिप नहीं हुआ, लेकिन इसमें, बॉट खिलाड़ियों की तरह ही अपग्रेड पर पैसा खर्च करते हैं -- जिसमें एक बॉट-एक्सक्लूसिव अपग्रेड शामिल है जो मिड-गेम उनके AI कौशल स्तर को बढ़ाता है।

bot_generator एंटिटी

एक अस्पष्ट, बड़े पैमाने पर अनडॉक्यूमेंटेड एंटिटी जिसे ट्रेनिंग मोड और संभवतः प्रारंभिक MvM विकास में उपयोग किए जाने का विश्वास है। यह कौशल स्तर को नियंत्रित करने के लिए एक SetDifficulty इनपुट प्रदर्शित करता है। इससे आगे, पता ठंडा पड़ जाता है -- वॉल्व ने इसे कभी डॉक्यूमेंट नहीं किया और किसी ने भी इसके व्यवहार को पूरी तरह से मैप नहीं किया है।

आंखों की चमक का रंग

MvM रोबोट में एक आंख-चमक कण होता है जो कौशल स्तर के साथ रंग बदलता है -- एक दृश्य संकेत जिसे कम्युनिटी के बाहर किसी ने कभी नहीं समझाया:

कौशल आंख का रंग RGB
ईज़ी/नॉर्मल नीला #24b4ff
हार्ड/एक्सपर्ट पीला #fff000

TF2 हेवी बॉट आइडल स्टैंस में

विज़न: पहचान समय

एक बॉट उसी पल प्रतिक्रिया नहीं करता जब कोई चीज़ उसके दृष्टि क्षेत्र में प्रवेश करती है -- बाकी AI को भी खतरे को स्वीकार करने की अनुमति देने से पहले एक हार्डकोडेड विलंब होता है:

कौशल न्यूनतम पहचान समय
ईज़ी 1.00 s
नॉर्मल 0.50 s
हार्ड 0.30 s
एक्सपर्ट 0.20 s

यह एक ही नंबर में अधिकांश "ईज़ी बॉट बेवकूफ लगते हैं" प्रभाव है -- एक ईज़ी बॉट एक बार नोटिस कर लेने पर बुरा निशाना नहीं लगाता, उसे आपके अस्तित्व को नोटिस करने में बस पांच गुना अधिक समय लगता है।

निशाना: फ़ॉलो रेट

बॉट आपको लगातार ट्रैक नहीं करते। वे आपकी स्थिति और वेग को एक निश्चित अंतराल पर सैंपल करते हैं और वहां से एक सीधी रेखा का अनुमान लगाते हैं:

कौशल पुनर्गणना अंतराल समतुल्य दर
ईज़ी 1.00 s 1x/sec
नॉर्मल 0.25 s 4x/sec
हार्ड 0.10 s 10x/sec
एक्सपर्ट 0.05 s 20x/sec

अपवाद: स्पाई बॉट्स उनके वास्तविक कौशल स्तर की परवाह किए बिना नॉर्मल ट्रैकिंग दर पर हार्डकोडेड होते हैं -- एक एक्सपर्ट स्पाई अभी भी नॉर्मल बॉट की तरह निशाना लगाता है। यदि आप 1x बनाम 20x के अंतर को गति में देखना चाहते हैं तो एक सार्वजनिक प्रदर्शन वीडियो भी है जो ट्रैकिंग दरों की तुलना साथ-साथ दिखाता है।

निशाना: हथियार-विशिष्ट कौशल

बॉट केवल आपके द्रव्यमान केंद्र पर निशाना नहीं लगाते -- उनके पास प्रति-हथियार लॉजिक है, जिनमें से कुछ वास्तव में बग्गी हैं:

ग्रेनेड लॉन्चर और स्टिकी लॉन्चर। सभी कौशल स्तर tf_bot_ballistic_elevation_rate cvar से एक निश्चित मान का उपयोग करके ऊर्ध्वाधर आर्क की भरपाई करते हैं। क्योंकि वह भरपाई केवल बेस हथियार ID के लिए फायर करती है, तेज़ प्रोजेक्टाइल वेरिएंट (लॉक-एन-लोड, प्रोजेक्टाइल-स्पीड मॉडिफ़ायर वाला कुछ भी) को सही ढंग से एडजस्टेड आर्क नहीं मिलते। और चूंकि यह विशेष रूप से हथियार ID से कुंजीबद्ध है, लूज़ कैनन -- एक पूरी तरह से अलग ID -- को बिल्कुल भी आर्क भरपाई नहीं मिलती।

हंट्समैन। ईज़ी बॉट तीर ड्रॉप की भरपाई नहीं करते और कभी हेडशॉट के लिए नहीं जाते। नॉर्मल-कौशल बॉट आर्क की भरपाई करते हैं, लेकिन केवल 150 HU के भीतर सिर पर निशाना लगाते हैं। हार्ड/एक्सपर्ट बॉट हमेशा सिर पर निशाना लगाते हैं।

रॉकेट लॉन्चर। 150 HU से परे, नॉन-ईज़ी बॉट आपके पैरों पर निशाना लगाते हैं, सेंटर-मास के बजाय, स्प्लैश डैमेज और नॉकबैक संभावनाओं को अधिकतम करते हुए। 150 HU के अंदर वे हेडशॉट पर स्विच करते हैं। ईज़ी बॉट हमेशा रेंज की परवाह किए बिना सेंटर-मास पर निशाना लगाते हैं। यह भी हथियार-ID-लॉक्ड है: डायरेक्ट हिट और काउ मैंगलर इस व्यवहार को इनहेरिट नहीं करते। डायरेक्ट हिट के लिए समझ में आता है (शोषण करने के लिए कोई AoE नहीं); काउ मैंगलर के लिए बिल्कुल कोई मतलब नहीं -- AI का यह हिस्सा हथियार के अस्तित्व से पहले का है और बस कभी दोबारा नहीं देखा गया।

स्नाइपर राइफल्स। ईज़ी शरीर पर निशाना लगाता है। नॉर्मल शरीर से सिर तक लगभग 33% रास्ते पर निशाना लगाता है। हार्ड/एक्सपर्ट सीधे सिर पर निशाना लगाते हैं। MvM में कम मायने रखता है, जहां बॉट हेडशॉट्स को वैसे भी डैमेज बोनस नहीं मिलता।

सुनना: गुप्त शॉट्स के प्रति संवेदनशीलता

हर गोली की आवाज़ पास के बॉट्स को शूटर की स्थिति के प्रति सचेत करती है, दीवारों के माध्यम से भी, 3000 HU तक 100% नोटिस संभावना के साथ (tf_bot_notice_gunfire_range लेकिन हथियारों का एक उपसमूह "स्टील्थ" के रूप में फ्लैग किया गया है -- केवल 500 HU (tf_bot_notice_quiet_gunfire_range) के भीतर श्रव्य, और तब भी कौशल-निर्भर संभावना के साथ:

कौशल स्टील्थ शॉट नोटिस करने की संभावना
ईज़ी 10%
नॉर्मल 30%
हार्ड 60%
एक्सपर्ट 90%

वह प्रॉबबिलिटी आधी हो जाती है यदि पिछले 3 सेकंड में एक तेज़ शॉट सुना गया हो -- तेज़ आवाज़ें शांत आवाज़ों को मास्क करती हैं।

स्टील्थ हथियार-ID सूची दिसंबर 2010 से अपडेट नहीं की गई है। उस तारीख के बाद एक ब्रांड-न्यू हथियार ID का उपयोग करके जोड़ी गई कोई भी चीज़ डिफ़ॉल्ट रूप से तेज़ मानी जाती है, चाहे वह तार्किक रूप से कितनी भी शांत क्यों न हो, जब तक कि वह किसी पुराने ID का पुन: उपयोग न करे। ठोस रूप से:

हथियार ID कवर करता है
TF_WEAPON_KNIFE सभी स्पाई चाकू
TF_WEAPON_FISTS हेवी-विशिष्ट पंच (उसका मल्टी-क्लास पंच वास्तव में TF_WEAPON_FIREAXE है)
TF_WEAPON_PDA माना जाता है कि सीधे उपयोग नहीं किया जाता
TF_WEAPON_PDA_ENGINEER_BUILD इंजीनियर का कंस्ट्रक्शन PDA
TF_WEAPON_PDA_ENGINEER_DESTROY इंजीनियर का डिस्ट्रक्शन PDA
TF_WEAPON_PDA_SPY स्पाई का डिस्गाइज़ किट
TF_WEAPON_BUILDER स्पाई का इंजीनियर/सैपर टूलकिट
TF_WEAPON_MEDIGUN सभी मेडी गन
TF_WEAPON_DISPENSER संभवतः अनुपयोगी (डिस्पेंसर ऑब्जेक्ट हैं, हथियार नहीं)
TF_WEAPON_INVIS सभी स्पाई क्लोक घड़ियाँ
TF_WEAPON_FLAREGUN सभी पायरो फ्लेयर गन मैनमेल्टर को छोड़कर
TF_WEAPON_LUNCHBOX सैंडविच, दलोकोह्स बार, बफ़ेलो स्टीक सैंडविच, बोंक!, क्रिट-ए-कोला
TF_WEAPON_JAR जराटे (मैड मिल्क नहीं -- अलग, नॉन-स्टील्थ ID)
TF_WEAPON_COMPOUND_BOW हंट्समैन
TF_WEAPON_SWORD आइलैंडर, स्कलकटर, क्लैडहेम मोर, पर्शियन पर्स्वेडर, हाफ-ज़ाटोइची
TF_WEAPON_CROSSBOW क्रूसेडर्स क्रॉसबो

सूची के खराब होने का क्लासिक उदाहरण: मैनमेल्टर को अपनी खुद की ID (TF_WEAPON_RAYGUN_REVENGE) मिली, जो स्टील्थ सूची के फ्रीज होने के बाद जोड़ी गई -- तो इसे तेज़ माना जाता है, इस तथ्य के बावजूद कि यह हर व्यावहारिक अर्थ में एक फ्लेयर गन है। स्कॉर्च शॉट, जो और भी बाद में जारी हुआ, बेस TF_WEAPON_FLAREGUN ID का पुन: उपयोग करता है और इसलिए अभी भी स्टील्थ माना जाता है। बेतुका, लेकिन यही कोड है।

रणनीति: खतरे की प्राथमिकता

जब एक साथ कई दुश्मन दिखाई देते हैं, बॉट दूरी, क्या उन पर गोली चलाई जा रही है, और -- ईज़ी के ऊपर -- क्या प्राथमिक खतरे को ठीक किया जा रहा है, का वजन करते हैं:

कौशल इसके बजाय हीलर को लक्षित करता है?
ईज़ी नहीं
नॉर्मल 50% संभावना
हार्ड हाँ
एक्सपर्ट हाँ

500 HU से परे के दुश्मनों को सामान्यतः गैर-तत्काल के रूप में डीप्रायोरिटाइज़ किया जाता है। अपवाद: हार्ड/एक्सपर्ट बॉट हमेशा दूर के मेडिक्स और इंजीनियर्स को तत्काल खतरे के रूप में मानते हैं, और कोई भी दुश्मन स्नाइपर जो लगभग आपकी ओर निशाना लगा रहा है, उसे हमेशा दूरी और कौशल की परवाह किए बिना तत्काल खतरे के रूप में माना जाता है।

कौशल दूर के मेडिक्स/इंजीनियर्स/निशाना लगाते स्नाइपर्स = तत्काल खतरा?
ईज़ी/नॉर्मल नहीं
हार्ड/एक्सपर्ट हाँ

उस स्नाइपर जांच का वास्तव में मजेदार इतिहास है। Sigsegv के मूल राइटअप ने माना कि गेम में स्नाइपर के एइम वेक्टर और बॉट की सापेक्ष स्थिति के बीच डॉट प्रोडक्ट बिल्कुल शून्य होना आवश्यक है -- एक तुलना इतनी सटीक कि यह फ्लोटिंग पॉइंट गणित में लगभग कभी भी ट्रिगर नहीं होगी, जिससे पूरी सुविधा प्रभावी रूप से डेड कोड बन जाती है। बाद में जारी एक सुधार (एक क्लीनर Hex-Rays डीकंपाइल का श्रेय) ने दिखाया कि वास्तविक जांच dot product > 0 है: कोई भी स्नाइपर सीधे-आपकी-ओर से लेकर आपके-लंबवत तक कहीं भी सामना कर रहा हो, तत्काल खतरे के रूप में गिना जाता है; लंबवत से दूर-मुंह करने वाला कुछ भी नहीं गिना जाता। मूल गलत पढ़ना एक SSE फ्लोट तुलना के खराब डीकंपाइलेशन से आया -- एक AAA बाइनरी को रिवर्स-इंजीनियर करना एक सटीक विज्ञान नहीं है।

मूवमेंट: डॉज

ईज़ी बॉट कभी डॉज नहीं करते, पूरी तरह से। नॉर्मल-और-ऊपर के बॉट बाएँ/दाएँ डॉज करते हैं (33% बाएँ, 33% दाएँ, 33% कुछ न करें, पता लगाए गए अंतरालों के खिलाफ भारित) जब वे एक कॉम्बैट हथियार पकड़े हुए हों, पिछले 3 सेकंड में एक दुश्मन देखा हो, और उस दुश्मन की उन पर लाइन ऑफ साइट हो।

वे डॉज नहीं करेंगे यदि इनमें से कोई भी लागू हो: DisableDodge एट्रीब्यूट सेट हो, वर्तमान व्यवहार जल्दी करने के लिए कहे, वर्तमान में अजेय (कोई भी उबेर), मिड-ताना/उकसावा, इंजीनियर खेल रहे हों, स्पाई के रूप में अदृश्य या डिस्गाइज़्ड हों, स्नाइपर के रूप में स्कोप्ड या हेवी के रूप में रेव्ड हों, या मिड-हंट्समैन-ड्रा हों।

मूवमेंट: दुश्मनों को धक्का देने से बचना

नॉर्मल से ऊपर, बॉट विशेष रूप से चलते समय दुश्मनों से टकराने से बचने की कोशिश करते हैं:

कौशल दुश्मनों से टकराने से बचता है?
ईज़ी नहीं
नॉर्मल नहीं
हार्ड हाँ
एक्सपर्ट हाँ

व्यवहार में यह वास्तव में केवल स्पाई बॉट्स के लिए मायने रखता है -- एक दुश्मन खिलाड़ी के साथ एक अजीब टक्कर से बचना ठीक उसी तरह की चीज़ है जो एक डिस्गाइज़ को बर्बाद कर देती है।

पायरो: एयरब्लास्ट निपुणता

एयरब्लास्ट दो उद्देश्यों को पूरा करता है: प्रोजेक्टाइल को रिफ्लेक्ट करना (PvP और MvM) और पास के दुश्मनों को कगारों से धक्का देना (केवल PvP)। क्या बॉट वास्तव में एक वैध अवसर पर ट्रिगर खींचता है, यह एक कौशल-आधारित सिक्का उछाल है:

कौशल एयरब्लास्ट ट्रिगर संभावना
ईज़ी 0%
नॉर्मल 50%
हार्ड 90%
एक्सपर्ट 100%

ईज़ी पायरो बॉट सचमुच एयरब्लास्ट नहीं कर सकते -- रोल हार्डकोडेड है कभी सफल न होने के लिए, सिर्फ "शायद ही कभी" नहीं।

स्पाई: डिस्गाइज़ प्रभावशीलता

दो अलग-अलग अक्ष कौशल के साथ बदलते हैं। डिस्गाइज़ चुनाव:

कौशल डिस्गाइज़ विधि
ईज़ी/नॉर्मल रैंडम क्लास, अनदेखा करते हुए कि दुश्मन टीम वास्तव में क्या खेल रही है
हार्ड/एक्सपर्ट एक वास्तविक दुश्मन खिलाड़ी चुनता है और उनकी सटीक क्लास कॉपी करता है

डिस्गाइज़ अभिनय:

कौशल डिस्गाइज़्ड/क्लोक्ड होने पर व्यवहार
ईज़ी/नॉर्मल दुश्मन खिलाड़ियों को घूरता है जब वह उन्हें देखता है (संदिग्ध)
हार्ड/एक्सपर्ट जानबूझकर आँख से संपर्क से बचता है (अधिक विश्वसनीय)

स्पाई: बैकस्टैब आक्रामकता

लंबी रेंज पर (300 HU तक, tf_bot_spy_knife_range), एक स्पाई बॉट केवल बैकस्टैब के लिए प्रतिबद्ध होता है यदि वह पीड़ित को देख सकता है और पीड़ित की पीठ कम से कम आंशिक रूप से मुड़ी हुई हो। कौशल यह निर्धारित करता है कि वह पीठ का कोण कितना केंद्र से दूर हो सकता है:

कौशल कोण सहनशीलता
ईज़ी सीधे आपके सामने होने पर भी प्रयास करता है
नॉर्मल आपकी पीठ से ±45°
हार्ड आपकी पीठ से ±78°
एक्सपर्ट आपकी पीठ से ±90° (पूरा पिछला 180° चाप)

ईज़ी स्पाई बॉट कार्यात्मक रूप से आत्मघाती हैं -- वे किसी ऐसे व्यक्ति पर स्टैब का प्रयास करेंगे जो सीधे उन्हें घूर रहा हो। अपवाद: मैन बनाम मशीन में, प्रत्येक स्पाई बॉट वास्तविक कौशल की परवाह किए बिना नॉर्मल कोण बाधा के लिए मजबूर किया जाता है।

रणनीति: हथियार चयन

केवल ईज़ी से ऊपर प्रभावी होता है, और MvM में ज्यादातर अप्रासंगिक है क्योंकि वहां बॉट्स पर आमतौर पर सख्त हथियार प्रतिबंध होते हैं:

  • स्काउट: प्राइमरी की मैगज़ीन खाली होने पर सेकेंडरी पर स्विच करता है।
  • सोल्जर: खाली मैग पर और 500 HU से अधिक करीब टार्गेट होने पर सेकेंडरी पर स्विच करता है।
  • स्नाइपर: 750 HU से अधिक करीब टार्गेट के लिए सेकेंडरी पर स्विच करता है।
  • पायरो: 750 HU से अधिक दूर टार्गेट के लिए सेकेंडरी पर स्विच करता है, जब तक कि वह टार्गेट सोल्जर या डेमोमैन न हो।

रणनीति: कवर रीलोड

MvM में उपयोग नहीं किया गया। यदि बॉट का वर्तमान व्यवहार इसे पीछे हटने के लिए नहीं कह रहा है, इसकी मुख्य मैगज़ीन खाली है, और यह उबेरेड नहीं है, तो उच्च-कौशल बॉट आप पर खाली बंदूक क्लिक करने के बजाय रीलोड करने के लिए अस्थायी रूप से कवर में पीछे हट जाएंगे:

कौशल रीलोड करने के लिए पीछे हटता है?
ईज़ी नहीं
नॉर्मल नहीं
हार्ड हाँ
एक्सपर्ट हाँ

CP मोड: डिफ़ेंडर भटकना

MvM में उपयोग नहीं किया गया। कंट्रोल पॉइंट की रक्षा करते हुए, उच्च-कौशल बॉट किल का शिकार करने ("सर्च एंड डिस्ट्रॉय") के लिए पॉइंट छोड़ने की अधिक संभावना रखते हैं, लेकिन केवल tf_bot_defense_must_defend_time पर एक सभ्य समय शेष होने पर:

कौशल भटकने की संभावना
ईज़ी 10%
नॉर्मल 50%
हार्ड 75%
एक्सपर्ट 90%

CP मोड: कैप्चर ब्लॉक करना

MvM में उपयोग नहीं किया गया। डिफ़ेंड करने वाले बॉट दुश्मन के कैप्चर प्रयास का विरोध कर रहे हैं:

कौशल कैप्चर को ब्लॉक करने का प्रयास करेगा?
ईज़ी नहीं
नॉर्मल 50% संभावना
हार्ड हाँ
एक्सपर्ट हाँ

पूर्ण सारांश तालिका

पहलू ईज़ी नॉर्मल हार्ड एक्सपर्ट नोट्स
विज़न: पहचान समय 1.00s 0.50s 0.30s 0.20s
निशाना: फ़ॉलो-अप दर 1x/s 4x/s 10x/s 20x/s स्पाई हमेशा नॉर्मल का उपयोग करते हैं
ग्रेनेड/स्टिकी आर्क भरपाई हाँ हाँ हाँ हाँ लूज़ कैनन अपवाद
हंट्समैन वर्टिकल भरपाई नहीं हाँ हाँ हाँ
हंट्समैन हेडशॉट नहीं <150 HU हाँ हाँ
रॉकेट लॉन्चर फुट-शॉट नहीं हाँ हाँ हाँ डायरेक्ट हिट और काउ मैंगलर अपवाद
स्नाइपर राइफल निशाना बिंदु शरीर ~33% सिर तक सिर सिर
स्टील्थ शॉट नोटिस संभावना 10% 30% 60% 90% तेज़ शॉट्स द्वारा मास्क होने पर आधा
हीलर को लक्षित करता है नहीं 50% हाँ हाँ
दूर का मेडिक/इंजीनियर/स्नाइपर = खतरा नहीं नहीं हाँ हाँ
डॉज नहीं हाँ हाँ हाँ लंबी अपवाद सूची
दुश्मनों से टकराने से बचना नहीं नहीं हाँ हाँ ज्यादातर स्पाई के लिए मायने रखता है
एयरब्लास्ट ट्रिगर संभावना 0% 50% 90% 100%
स्पाई डिस्गाइज़ क्लास चुनाव रैंडम रैंडम वास्तविक दुश्मन से मेल वास्तविक दुश्मन से मेल
डिस्गाइज़्ड होने पर स्पाई आँख से संपर्क घूरता है (स्पष्ट) घूरता है बचता है (विश्वसनीय) बचता है
स्पाई बैकस्टैब कोण ~0° ±45° ±78° ±90° MvM नॉर्मल लागू करता है
हथियार चयन लॉजिक नहीं हाँ हाँ हाँ MvM में कम प्रासंगिक
कवर रीलोड नहीं नहीं हाँ हाँ MvM में नहीं
CP डिफ़ेंडर भटकना 10% 50% 75% 90% MvM में नहीं
CP कैप्चर ब्लॉक करना नहीं 50% हाँ हाँ MvM में नहीं

निष्कर्ष

TF2 हेवी बॉट मिनीगन को निशाना बनाते हुए

इनमें से कोई भी वॉल्व की ओर से गलत अनुमान नहीं है -- यह एक जानबूझकर, पूरी तरह से नियतिवादी स्कोरिंग और प्रॉबबिलिटी सिस्टम है, बस कहीं आधिकारिक रूप से लिखा नहीं गया है। याद रखने लायक कुछ बातें:

  1. "कौशल" स्वतंत्र डायल का एक बंडल है, एक वैश्विक गुणक नहीं। प्रतिक्रिया समय, निशाना दर और हर सामरिक व्यवहार अलग-अलग बदलते हैं, और कुछ (स्पाई ट्रैकिंग दर, MvM बैकस्टैब कोण) को कौशल की परवाह किए बिना हार्डकोडेड ओवरराइड मिलते हैं।
  2. इनमें से कुछ वास्तव में बग्गी है, सिर्फ पुराना नहीं। 2010 से जमी स्टील्थ हथियार सूची, काउ मैंगलर में बिना किसी अच्छे कारण के फुट-एइम लॉजिक का अभाव, स्नाइपर डॉट-प्रोडक्ट जांच जिसे सही ढंग से डीकंपाइल होने में वर्षों लग गए -- वॉल्व का AI कोड किसी भी अन्य 17-वर्षीय कोडबेस की तरह निशान ऊतक है।
  3. आप यह सब उपयोग कर सकते हैं। जानें कि एक स्नाइपर बॉट आपको नॉर्मल पर हेडशॉट नहीं करेगा, एक ईज़ी पायरो सचमुच आपके रॉकेट को एयरब्लास्ट नहीं कर सकता, एक ईज़ी स्पाई आपको आमने-सामने स्टैब करने की कोशिश करेगा। यह भाग्य नहीं है। यह एक स्पेक शीट है।

Sigsegv को बहुत-बहुत धन्यवाद जिसने मूल कोड-डाइविंग की जिसने यह सब संभव बनाया, TF2 विकी को बॉट कमांड और मैप सपोर्ट पर बुनियादी डॉक्यूमेंटेशन के लिए, और कम्युनिटी के सभी लोगों को जो अभी भी 17-साल पुराने बॉट AI में यह पता लगाने के लिए छेड़छाड़ कर रहे हैं कि यह वास्तव में जो करता है वह क्यों करता है।

بوتات TF2 ليست عشوائية: لقد هندستُ عكسياً كل إعدادات الصعوبة

الرؤية، تتبع التصويب، زوايا الطعن الخلفي للجاسوس، منطق القنص في الرأس، كل خطأ معروف -- لم يوثق Valve أيًا من هذا قط. لذا بحثنا في الكود وحوّلناه إلى ورقة مواصفات كاملة.

مقدمة

جندي بوت TF2 يصوب قاذفة صواريخ

كل لاعب TF2 قالها مرة على الأقل: "هذا البوت يغش." أو العكس: "لماذا هذا البوت السهل واقف يأكل الصواريخ." لا أحد يعرف حقًا ماذا تعني "سهل" و"عادي" و"صعب" و"خبير" تحت الغطاء -- Valve شحنت أربعة تصنيفات صعوبة ولا وثيقة واحدة.

لذا مجموعة منا (أنا، awimii، Mush The Possum، مع جزء كبير من العمل الأساسي الذي قام به sigsegv، الذي بحث فعليًا في كود اللعبة المفكك) جمعنا وثيقة بحث كاملة عن سلوك TFBot. كل آلية، كل خطأ معروف، كل احتمال مبرمج بشكل ثابت. هذه المقالة هي الشرح الكامل، وليس المختصر. احضر مشروب بونك، فهذه مقالة طويلة.


الفصل الأول: الأساسيات

بوت مقابل بوت دمية

TF2 يحتوي على شيئين مختلفين تمامًا يسميهما الناس "بوتات":

  • بوتات الذكاء الاصطناعي (TFBots): ذكاء اصطناعي حقيقي، مبني على نفس إطار PlayerBot/Infected الذي استخدمه Valve لسلسلة Left 4 Dead. يختارون فئة عشوائية، يلعبون الهدف، يعملون بدون sv_cheats، ويحققون الإنجازات مثل اللاعب الحقيقي.
  • بوتات الدمى: ذكاء اصطناعي صفري، لا تستطيع التحرك أو التصرف بنفسها. إنها موجودة فقط لتتم السيطرة عليها يدويًا -- يمكن للاعب إجبارها على التتبع والتصويب والإطلاق، وتستخدم غالبًا للاختبار أو لصنع لقطات/فيديوهات سينمائية. استدعاؤها يتطلب sv_cheats 1، مما يعطل الإنجازات أيضًا للجلسة.

هذه المقالة بأكملها عن النوع الأول.

ما يمكن (نوعًا ما) أن يُطلب من بوتات الذكاء الاصطناعي فعله

TFBots ليست قابلة للتحكم المباشر، لكن هناك قائمة قصيرة من الأشياء التي يمكنك دفعها لفعلها:

  • صوّب مؤشر التصويب على أي بوت (صديق أو عدو) وسيستهزئ بك إذا استخدمت أوامر الصوت الصحيحة.
  • بوت طبيب صديق يعالجك إذا استخدمت أمر "طبيب!" الصوتي.
  • إذا كان بوت طبيب يعالجك ولديه شحنة خارقة جاهزة، قل "هيا بنا!" أو "فعّل الشحن!" ليجعله يستخدم الشحنة فورًا.
  • بوت طبيب بشحنة جاهزة سيستخدمها تلقائيًا لحظة تعرضه هو أو هدف علاجه لضرر كبير، دون حاجة لأمر صوتي.
  • البوتات ستقوم تلقائيًا بحركات استهزاء شريكة (High Five) أو استهزاءات جماعية (Conga) مع زملاء الفريق القريبين.

جعل البوتات تعمل على خرائط غير مدعومة

البوتات تعتمد على شبكة ملاحة لمعرفة أين يُسمح لها بالمشي، ومعظم خرائط المجتمع لا تأتي بواحدة. لإجبار ذلك:

  1. sv_cheats 1
  2. nav_generate -- بناء شبكة الملاحة الأولية، يظهر التقدم في الكونسول
  3. انتظر حتى تنتهي اللعبة من توليد المسارات
  4. اختياريًا أصلح بيانات الملاحة السيئة يدويًا باستخدام nav_edit 1
  5. أعد التحميل أو أعد تشغيل السيرفر (تخطي هذا يعطل الإنجازات)
  6. tf_bot_add <number> لاستدعاء البوتات فعليًا

تحذير: تغيير شبكة الملاحة بينما البوتات نشطة على السيرفر يمكن أن ينهار اللعبة. بمجرد وجود الشبكة لا تحتاج لإعادة توليدها للجلسات المستقبلية -- فقط أضف البوتات مجددًا باستخدام tf_bot_add.

الشبكات المولدة تلقائيًا تعمل بشكل أفضل على خرائط Control Point وKing of the Hill وPayload وCTF. على خرائط Mannpower، البوتات تفترض أسلوب لعب CTF لكنها بالكاد تستخدم خطافات التسلق أو تحسينات الطاقة. إذا كانت الخريطة لا تحتوي على هدف يتعرف عليه ذكاء البوت لكنها تحتوي على كيان غرفة ولادة، فإن تعيين tf_bot_offense_must_push_time 0 يجعل البوتات تقاتل على أي حال.

(المصدر لهذا القسم: صفحة البوتات في ويكي TF2 الرسمي.)

الوضع الحالي، خريطة بخريطة

بفضل تحديث Hatless، كل الفئات تعمل بشكل صحيح الآن، بما في ذلك الجاسوس الذي كان مليئًا بالأخطاء تاريخيًا. البوتات تتصرف بشكل صحيح على معظم خرائط KOTH الرسمية، وبعض خرائط Payload، وDustbowl/Gorge Attack-Defense، وخرائط CTF/Mann Manor -- رغم أنه في الأخيرتين لا يمكنك استدعاؤها باستخدام tf_bot_add مباشرة. على الخرائط غير المدعومة (عبر عملية nav_generate أعلاه) تعمل، لكنها أسوأ بشكل ملحوظ في تقليد اللاعب الحقيقي.

خرائط PLR هي قضية خاسرة: البوتات لا تستطيع تخطي الحواجز على Hightower وتعلق في الزوايا، وعلى كل خريطة PLR أخرى هم فقط... يقيمون حفلة رقص بدلاً من اللعب. ربما سيتم إصلاح هذا يومًا ما. أو ربما لا.

سلوك البوت العام

مجموعة من الأشياء التي يفعلها كل بوت بغض النظر عن المهارة:

  • البوتات تستخدم فقط التجهيزات الأساسية (الإضافة يمكنها إجبار أسلحة غير أساسية عليها، لكن البوتات العادية لا تختار أسلحتها بنفسها).
  • البوتات السهلة بالكاد تلمس سلاحها الثانوي. الصعوبات الأعلى تتحول للثانوي حالما يجف مخزون الأساسي، أو للتعويض عن المدى.
  • البوتات لا تستطيع عمل حيل حركية -- لا قفزات صاروخية، لا نقل للمباني.
  • بعد القتل، قد يستهزئ البوت، حتى تحت النار -- إلا أثناء حمل مخابرات العدو، وهذه القاعدة تنطبق أيضًا في MvM.
  • بوتات الجاسوس المتنكرة (لاعب أو ذكاء اصطناعي) يتم تجاهلها بشكل صحيح من قبل البوتات الأخرى -- حتى تلمس عدوًا، أو تخرب شيئًا، أو تطلق النار، أو تتخفي بالقرب من أحد. بمجرد "انكشافها"، يتم تذكر ذلك البوت/اللاعب كجاسوس حتى يغير تنكره مع البقاء غير مرئي، أو يموت، أو يزور الموت باستخدام Dead Ringer.
  • بوتات بايرو تستخدم الاندفاع المضغوط بحرية على أي شيء فوق السهل.
  • بوتات الأطباء تعطي الأولوية لعلاج الجميع على حساب القناصين (وبدرجة أقل، المهندسين)، حتى لو أرسلت "طبيب!" كواحد منهم.
  • بوتات الأطباء تنجذب نحو ذوي الأوزان الثقيلة والجنود والمفجرين والبايروات -- خاصة إذا كان بشري يلعب تلك الفئات. لا بشر في تلك الأدوار، لا اهتمام خاص من الطبيب.
  • البوتات تبقى في مواقعها خلال وقت الإعداد على خرائط Attack/Defense وPayload -- باستثناء المهندسين والقناصين والجواسيس، الذين يتحركون بحرية (بوتات المفجر مسموح لها أيضًا وضع المتفجرات اللاصقة مسبقًا).
  • بوتات المهندسين لا تطور أو تزيل التخريب من مباني مهندس صديق آخر، إلا إذا كان ذلك المبنى يقع في مسار هدفها. كما أنها أحيانًا... لا تصلح برجها الخاص، حتى عندما يكون آمنًا.
  • بوتات الجواسيس المكشوفة تتحول إلى مسدسها وترتجع بدلاً من إجبار الطعن.
  • بوتات المفجر التي حددت موقع برج (عادة بالموت منه مرة) يمكنها بشكل مثالي رمي المتفجرات اللاصقة عليه من خارج مداه، مقوسة حول الجدران والسقوف عندما تسمح الهندسة بذلك.
  • بوتات القناصة التي لا تجد هدفًا بعد التكبير تستخدم أحد أصوات "الرفض".
  • الأطباء الأصدقاء سيعالجون جاسوسًا متنكرًا دون تردد.

المشكلات/الأخطاء المعروفة

الوثيقة تسرد كومة صلبة من الخصائص القديمة:

  • البوتات يمكنها محاولة المشي أو إطلاق النار عبر بعض الدعائم الثابتة.
  • في أي وقت يكشف لاعب/بوت قناعه أو يتنكر أو ينكشف، البوتات القريبة "تراه" وتستدير للرد -- حتى لو حدث الحدث خارج مجال رؤيتها الفعلي. إنه ليس قائمًا على الصوت؛ إنه تجاوز لفحص الرؤية.
  • نادرًا، يمكن للبوتات أن تلتصق ببعضها جسديًا أثناء استخدام تيليبورتر المهندس.
  • أوامر البوتات الصوتية (مثل "جاسوس!"، "تقدّم!") لا تظهر كنص محادثة مثل أوامر اللاعبين.
  • بوت طبيب يعالج شخصًا بنشاط لن يتفادى النيران الواردة أو يلتقط مجموعات الصحة، حتى عند نقاط صحة منخفضة خطيرة.
  • البوتات يمكنها الاستمرار في الحركة أثناء أداء استهزاء شريك، مما يكسر التأثير المقصود للضربة الحرجة الاحتفالية.
  • بوتات الأطباء المتضررة مؤخرًا غالبًا ترفض استخدام مسدس المحقنة عن بعد، مفضلة الاشتباك اليدوي (أو، في حالات نادرة جدًا، محاولة ضربك بشعاع المسدس الطبي نفسه).
  • بوتات الأطباء لا تعوض سقوط الجاذبية على طلقات مسدس المحقنة --likely لأن السلاح لم يتم وضع علامة عليه بشكل صحيح كغير hitscan في كود الذكاء الاصطناعي.
  • بوتات الجواسيس يمكنها رؤية وتتبع جاسوس متخفي (لاعب أو ذكاء اصطناعي) إذا كان ذلك الجاسوس قد كشف نفسه مرة واحدة، بغض النظر عن مستوى مهارة البوت المتتبع.
  • حتى إذا تنكر لاعب-جاسوس كفئة فريقه الخاص، الاصطدام بعدو لا يزال يفضحه (البوتات لا تفعل هذا لنفسها أبدًا، لأن البوتات لا تتنكر أبدًا كفريقها الخاص).
  • البوتات تحترم التوازن التلقائي للفرق -- إذا كنت تحاول تكديس البوتات في فريق واحد، تحتاج mp_teams_unbalance_limit 0 أولاً.
  • بوتات المهندسين يمكنها تجاهل مبانيها تمامًا حتى يتم تدميرها.
  • بوتات الثقيل أحيانًا تحاول إطلاق النار من المدفع الرشاش بينما ذخيرتها منخفضة بشكل خطير، غالبًا تحت مستوى الصعب.
  • بوتات الأطباء من الفريق الخاسر تنتحر أحيانًا خلال مرحلة الإذلال عندما لا يكون أعداء قريبون -- شيء لا يستطيع اللاعب البشري تكراره حتى بالمحاولة.
  • تعيين معاينة فريقك في شاشة التحميل إلى BLU يجعل بوتات RED تظهر بصريًا كـ BLU لك.
  • البوتات التي أخرجت السلاح اليدوي أحيانًا ترفض تغيير السلاح حتى بعد التقاط الذخيرة.
  • بعد تحديث Jungle Inferno، البوتات المستدعاة بمعاملات صريحة (مثل tf_bot_add 5 pyro blue normal) يمكن أن تموت فورًا في غرفة ولادتها الخاصة. الحل: tf_bot_reevaluate_class_in_spawnroom 0 (يحتاج sv_cheats 1).

أسماء الذكاء الاصطناعي

أسماء البوتات مسحوبة من مجموعة كبيرة من الإشارات إلى TF2 وألعاب Valve الأخرى وثقافة البرمجة، بشكل كبير لأن المجتمع استمر في طلب أسماء محددة على منتديات Steam. عينة من القائمة: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF، وعشرات غيرها بهذا الأسلوب.

هناك أيضًا مجموعة من الأسماء الموجودة في بناء مصدر مسرب لم يُشحن في الإنتاج أبدًا، لأسباب غير واضحة -- معظمها إشارات من Last Dragon وThe Fifth Element مثل John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh? وI'm your huckleberry.

يمكنك تجاوز أي من هذا بنفسك: tf_bot_add heavyweapons blue "Blu Hoovy" يستدعي بوت BLU ثقيل مسمى "Blu Hoovy."


الفصل الثاني: البوتات الأصلية / TFBots -- غوص عميق في مستوى المهارة

إطار sigsegv الأصلي لا يزال صحيحًا: من الواضح أن بوتات الخبير تتفوق على بوتات السهل، لكن Valve لم تشرح أبدًا كم أو لماذا. لذا الطريقة الوحيدة لمعرفة ذلك هي قراءة الكود. إليك كل آلية تتدرج مع المهارة.

ضبط الصعوبة

خارج MvM، الصعوبة تُتحكم بواسطة متغير واحد:

tf_bot_difficulty مستوى المهارة
0 سهل
1 عادي (افتراضي)
2 صعب
3 خبير

tf_bot_add يقبل أيضًا معامل صعوبة مباشرة (easy/normal/hard/expert).

ملفات popfiles في MvM

في Mann vs. Machine، كل كتلة ظهور TFBot في ملف popfile لها مفتاح Skill اختياري. لا مفتاح يعني سهل. في مهمات Valve الرسمية: العمالقة دائمًا تقريبًا خبراء، المهندسون والجواسيس دائمًا تقريبًا خبراء، والقناصة عادة صعب (أحيانًا خبير). إذا كنت تستخدم EventChangeAttributes (المضاف في تحديث Two Cities) لتعديل البوتات ديناميكيًا أثناء الموجة بناءً على أحداث الخريطة، فإن مهارة البوت هي إحدى الخصائص التي يُسمح لك بتغييرها أثناء التنقل.

وضع MvM اللانهائي

الوضع اللانهائي لم يُطرح رسميًا أبدًا، لكن فيه، البوتات تنفق أموالها على الترقيات تمامًا مثل اللاعبين -- بما في ذلك ترقية حصرية للبوت ترفع مستوى مهارة الذكاء الاصطناعي الخاص به أثناء اللعبة.

كيان bot_generator

كيان غير واضح وغير موثق إلى حد كبير، يُعتقد أنه استُخدم في وضع التدريب وربما في تطوير MvM المبكر. يعرض مدخل SetDifficulty للتحكم في مستوى المهارة. بعد ذلك، يفقد الأثر -- لم يوثقه Valve أبدًا ولم يحدد أحد سلوكه بالكامل.

لون وهج العين

روبوتات MvM لها جسيم وهج عين يتغير لونه مع مستوى المهارة -- إشارة بصرية لم يشرحها أحد خارج المجتمع أبدًا:

المهارة لون العين RGB
سهل/عادي أزرق #24b4ff
صعب/خبير أصفر #fff000

بوت ثقيل TF2 في وضعية الوقوف

الرؤية: وقت التعرف

البوت لا يتفاعل فور دخول شيء إلى مجال رؤيته -- هناك تأخير مبرمج بشكل ثابت قبل أن يُسمح لبقية الذكاء الاصطناعي حتى بالاعتراف بالتهديد:

المهارة الحد الأدنى لوقت التعرف
سهل 1.00 ثانية
عادي 0.50 ثانية
صعب 0.30 ثانية
خبير 0.20 ثانية

هذا معظم تأثير "البوتات السهلة تبدو غبية" في رقم واحد -- البوت السهل لا يصوب بشكل أسوأ بمجرد أن يلاحظك، فقط يستغرق خمسة أضعاف الوقت ليلاحظ وجودك.

التصويب: معدل التتبع

البوتات لا تتتبعك باستمرار. إنها تأخذ عينة من موقعك وسرعتك بفاصل زمني ثابت وتتنبأ بخط مستقيم من هناك:

المهارة فاصل إعادة الحساب المعدل المكافئ
سهل 1.00 ثانية 1x/ثانية
عادي 0.25 ثانية 4x/ثانية
صعب 0.10 ثانية 10x/ثانية
خبير 0.05 ثانية 20x/ثانية

استثناء: بوتات الجواسيس مبرمجة بشكل ثابت على معدل تتبع عادي بغض النظر عن مستوى مهارتها الفعلي -- جاسوس خبير لا يزال يصوب مثل بوت عادي. هناك أيضًا فيديو توضيحي عام يقارن معدلات التتبع جنبًا إلى جنب إذا أردت رؤية الفجوة بين 1x و20x أثناء الحركة.

التصويب: مهارة خاصة بالسلاح

البوتات لا تشير فقط إلى مركز كتلتك -- لديها منطق خاص بكل سلاح، بعضه مليء بالأخطاء حقًا:

قاذفة القنابل وقاذفة المتفجرات اللاصقة. كل مستويات المهارة تعوض القوس الرأسي، باستخدام قيمة ثابتة من متغير tf_bot_ballistic_elevation_rate. لأن هذا التعويض يعمل فقط لمعرف السلاح الأساسي، المتغيرات الأسرع للقذائف (Loch-n-Load، أي شيء بمعدل سرعة قذائف معدل) لا تحصل على أقواس مضبوطة بشكل صحيح. ولأنه مرتبط بمعرف السلاح تحديدًا، فإن Loose Cannon -- معرف مختلف تمامًا -- لا يحصل على تعويض قوس على الإطلاق.

قوس الصيد (Huntsman). البوتات السهلة لا تعوض سقوط السهم ولا تهدف للرأس أبدًا. بوتات المهارة العادية تعوض القوس، لكنها تهدف للرأس فقط ضمن 150 وحدة. بوتات الصعب/الخبير تهدف للرأس دائمًا.

قاذفات الصواريخ. بعد 150 وحدة، البوتات غير السهلة تهدف إلى قدميك بدلاً من مركز الكتلة، لتعظيم الضرر الانفجاري وفرص الصعق. ضمن 150 وحدة تتحول إلى إصابات الرأس. البوتات السهلة تهدف دائمًا إلى مركز الكتلة بغض النظر عن المدى. هذا أيضًا مقفل بمعرف السلاح: Direct Hit وCow Mangler لا يرثان هذا السلوك. منطقي بالنسبة لـ Direct Hit (لا تأثير انفجاري لاستغلاله)؛ غير منطقي إطلاقًا بالنسبة لـ Cow Mangler -- هذا الجزء من الذكاء الاصطناعي أقدم من وجود السلاح وببساطة لم يُراجع أبدًا.

بنادق القنص. السهل يصوب نحو الجسم. العادي يصوب حوالي 33% من المسافة من الجسم إلى الرأس. الصعب/الخبير يصوب مباشرة نحو الرأس. أقل أهمية في MvM، حيث إصابات الرأس للبوتات لا تحصل على مكافأة الضرر على أي حال.

السمع: الحساسية للطلقات الخفية

كل طلقة نارية تنبه البوتات القريبة لموقع مطلق النار، حتى عبر الجدران، حتى 3000 وحدة مع فرصة ملاحظة 100% (tf_bot_notice_gunfire_range). لكن مجموعة فرعية من الأسلحة مصنفة كـ "خفية" -- مسموعة فقط ضمن 500 وحدة (tf_bot_notice_quiet_gunfire_range)، وحتى مع فرصة تعتمد على المهارة:

المهارة فرصة ملاحظة طلقة خفية
سهل 10%
عادي 30%
صعب 60%
خبير 90%

هذا الاحتمال يُنصف إذا سُمعت طلقة عالية في آخر 3 ثوانٍ -- الأصوات العالية تخفي الأصوات الهادئة.

قائمة معرفات الأسلحة الخفية لم تُحدث منذ ديسمبر 2010. أي شيء أضيف بعد ذلك التاريخ باستخدام معرف سلاح جديد يُعتبر عاليًا افتراضيًا، بغض النظر عن مدى هدوئه المنطقي، إلا إذا صادف أنه أعاد استخدام معرف أقدم. بشكل ملموس:

معرف السلاح يغطي
TF_WEAPON_KNIFE جميع سكاكين الجاسوس
TF_WEAPON_FISTS لكمات خاصة بالثقيل (لكمة متعددة الفئات هي في الواقع TF_WEAPON_FIREAXE)
TF_WEAPON_PDA يُعتقد أنه غير مستخدم مباشرة
TF_WEAPON_PDA_ENGINEER_BUILD PDA بناء المهندس
TF_WEAPON_PDA_ENGINEER_DESTROY PDA تدمير المهندس
TF_WEAPON_PDA_SPY عدة تمويه الجاسوس
TF_WEAPON_BUILDER عدة مهندس/مخرب الجاسوس
TF_WEAPON_MEDIGUN جميع المسدسات الطبية
TF_WEAPON_DISPENSER likely غير مستخدم (الموزعات هي أشياء، وليست أسلحة)
TF_WEAPON_INVIS جميع ساعات التخفي للجاسوس
TF_WEAPON_FLAREGUN جميع مسدسات الشعلة للبايرو باستثناء Manmelter
TF_WEAPON_LUNCHBOX ساندويتش، Dalokohs Bar، Buffalo Steak Sandvich، Bonk!، Crit-a-Cola
TF_WEAPON_JAR Jarate (وليس Mad Milk -- معرف منفصل، غير خفي)
TF_WEAPON_COMPOUND_BOW قوس الصيد (Huntsman)
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

المثال الكلاسيكي لتعفن القائمة: Manmelter حصل على معرف خاص به (TF_WEAPON_RAYGUN_REVENGE)، أضيف بعد تجميد القائمة الخفية -- لذا فهو يُعتبر عاليًا، رغم كونه مسدس شعلة بكل معنى عملي. Scorch Shot، الذي صدر حتى لاحقًا، يعيد استخدام معرف TF_WEAPON_FLAREGUN الأساسي وبالتالي لا يزال يعتبر خفيًا. غير منطقي، لكن هذا هو الكود.

الاستراتيجية: تحديد أولويات التهديد

عندما يكون عدة أعداء مرئيين في وقت واحد، البوتات توزن المسافة، وما إذا كان يتم إطلاق النار عليها، وفوق السهل -- ما إذا كان التهديد الأساسي يتلقى علاجًا:

المهارة يستهدف المعالج بدلاً من ذلك؟
سهل لا
عادي فرصة 50%
صعب نعم
خبير نعم

الأعداء على بعد أكثر من 500 وحدة عادةً ما يُخفض أولويتهم كغير فوريين. استثناءات: بوتات الصعب/الخبير تعامل دائمًا الأطباء والمهندسين البعيدين كتهديدات فورية، وأي قناص عدو يصوب في اتجاهك تقريبًا يُعامل دائمًا كتهديد فوري بغض النظر عن المسافة والمهارة.

المهارة أطباء/مهندسون/قناصة بعيدون يصوبون = تهديد فوري؟
سهل/عادي لا
صعب/خبير نعم

لفحص القناص هذا تاريخ ممتع حقًا. كتابة sigsegv الأصلية افترضت أن اللعبة تتطلب أن يكون حاصل الضرب النقطي بين متجه تصويب القناص وموقع البوت النسبي صفرًا تمامًا -- مقارنة دقيقة جدًا لدرجة أنها لن تتفعل أبدًا تقريبًا في حسابات الفاصلة العائمة، مما يجعل الميزة بأكملها كودًا ميتًا فعليًا. تصحيح صدر لاحقًا (بفضل فك ترجمة Hex-Rays أنظف) أظهر أن الفحص الفعلي هو حاصل ضرب نقطي > 0: أي قناص يواجه من نحوك مباشرة إلى عمودي عليك يُعتبر تهديدًا فوريًا؛ أي شيء من عمودي إلى بعيد الوجه لا يُحتسب. سوء القراءة الأصلي جاء من فك ترجمة سيئة لمقارنة float SSE -- الهندسة العكسية لثنائي AAA ليس علمًا دقيقًا.

الحركة: المراوغة

البوتات السهلة لا تراوغ أبدًا، نقطة فوق السطر. البوتات العادية وما فوق تراوغ يسار/يمين (33% يسار، 33% يمين، 33% لا تفعل شيئًا، مرجحة ضد الفجوات المكتشفة) عندما تحمل سلاح قتال، ورأت عدوًا في آخر 3 ثوانٍ، وذلك العدو لديه خط رؤية عليها.

إنها لن تراوغ إذا أي مما يلي ينطبق: خاصية DisableDodge مضبوطة، السلوك الحالي يقول بالاسراع، حالياً غير معرض للضرر (أي über)، في منتصف استهزاء/استفزاز، تلعب مهندس، غير مرئية أو متنكرة كجاسوس، مكبرة كقناص أو مدورة كثقيل، أو في منتصف سحب قوس الصيد.

الحركة: تجنب دفع الأعداء

فوق العادي، البوتات تحاول تحديدًا عدم الاصطدام بالأعداء أثناء الحركة:

المهارة يتجنب الاصطدام بالأعداء؟
سهل لا
عادي لا
صعب نعم
خبير نعم

عمليًا هذا يهم حقًا فقط لبوتات الجواسيس -- تجنب تصادم محرج مع لاعب عدو هو بالضبط نوع الشيء الذي يفضح التمويه.

البايرو: إتقان الاندفاع المضغوط

الاندفاع المضغوط يخدم غرضين: عكس المقذوفات (PvP وMvM) ودفع الأعداء القريبين عن الحواف (PvP فقط). ما إذا كان البوت سيضغط الزناد فعليًا على فرصة صالحة هو عملة مهارية:

المهارة فرصة تفعيل الاندفاع المضغوط
سهل 0%
عادي 50%
صعب 90%
خبير 100%

بوتات البايرو السهلة لا يمكنها فعليًا استخدام الاندفاع المضغوط -- الرمية مبرمجة بشكل ثابت لعدم النجاح أبدًا، ليس فقط "نادرًا."

الجاسوس: فعالية التمويه

محورين منفصلين يتدرجان مع المهارة. اختيار التمويه:

المهارة طريقة التمويه
سهل/عادي فئة عشوائية، يتجاهل ما يلعبه فريق العدو فعليًا
صعب/خبير يختار لاعب عدو حقيقي وينسخ فئته تمامًا

التمثيل أثناء التمويه:

المهارة السلوك أثناء التمويه/التخفي
سهل/عادي يحدق في لاعبي العدو عندما يراهم (مريب)
صعب/خبير يتجنب التواصل البصري عمدًا (أكثر إقناعًا)

الجاسوس: عدوانية الطعن الخلفي

على مدى بعيد (حتى 300 وحدة، tf_bot_spy_knife_range)، بوت الجاسوس يلتزم فقط بالطعن الخلفي إذا كان يمكنه رؤية الضحية وظهر الضحية منعطف جزئيًا على الأقل. المهارة تحدد كم يُسمح لتلك الزاوية الخلفية بالانحراف عن المركز:

المهارة تسامح الزاوية
سهل يحاول حتى لو كنت تواجهه مباشرة
عادي ±45° من ظهرك
صعب ±78° من ظهرك
خبير ±90° من ظهرك (قوس 180° خلفي كامل)

بوتات الجواسيس السهلة هي انتحارية وظيفيًا -- سيحاولون طعن شخص يحدق بهم مباشرة. استثناء: في Mann vs. Machine، كل بوت جاسوس يُجبر على قيد الزاوية العادي بغض النظر عن المهارة الفعلية.

التكتيكات: اختيار السلاح

يعمل فقط فوق السهل، وغير ذي صلة إلى حد كبير في MvM لأن البوتات هناك عادةً لديها قيود سلاح صارمة:

  • الكشاف: يتحول إلى الثانوي عندما يكون مخزون الأساسي فارغًا.
  • الجندي: يتحول إلى الثانوي على مخزون فارغ و هدف أقرب من 500 وحدة.
  • القناص: يتحول إلى الثانوي لأهداف أقرب من 750 وحدة.
  • البايرو: يتحول إلى الثانوي لأهداف أبعد من 750 وحدة، إلا إذا كان ذلك الهدف جنديًا أو مفجرًا.

التكتيكات: إعادة التحميل تحت الغطاء

لا يُستخدم في MvM. إذا لم يكن سلوك البوت الحالي يأمره بالتراجع، مخزونه الرئيسي فارغ، وهو ليس تحت تأثير über، البوتات ذات المهارة الأعلى ستتراجع مؤقتًا إلى الغطاء لإعادة التحميل بدلاً من إطلاق سلاح فارغ نحوك:

المهارة يتراجع لإعادة التحميل؟
سهل لا
عادي لا
صعب نعم
خبير نعم

وضع CP: تجوال المدافع

لا يُستخدم في MvM. عند الدفاع عن نقطة سيطرة، البوتات ذات المهارة الأعلى أكثر عرضة لترك النقطة لمطاردة القتلى ("ابحث ودمر")، لكن فقط مع قدر لا بأس به من الوقت المتبقي على tf_bot_defense_must_defend_time:

المهارة فرصة التجوال
سهل 10%
عادي 50%
صعب 75%
خبير 90%

وضع CP: منع الاستيلاء

لا يُستخدم في MvM. البوتات المدافعة تتنافس مع محاولة استيلاء العدو:

المهارة سيحاول منع الاستيلاء؟
سهل لا
عادي فرصة 50%
صعب نعم
خبير نعم

جدول الملخص الكامل

الجانب سهل عادي صعب خبير ملاحظات
الرؤية: وقت التعرف 1.00ث 0.50ث 0.30ث 0.20ث
التصويب: معدل التتبع 1x/ث 4x/ث 10x/ث 20x/ث الجواسيس دائمًا يستخدمون عادي
تعويض قوس القنابل/اللاصقة نعم نعم نعم نعم Loose Cannon مستثنى
تعويض رأسي لقوس الصيد لا نعم نعم نعم
إصابات رأس بقوس الصيد لا <150 وحدة نعم نعم
طلقات قدم بقاذفة الصواريخ لا نعم نعم نعم Direct Hit & Cow Mangler مستثنيان
نقطة تصويب بندقية القنص جسم ~33% للرأس رأس رأس
فرصة ملاحظة الطلقات الخفية 10% 30% 60% 90% تنصف إذا أخفتها طلقات عالية
يستهدف المعالج لا 50% نعم نعم
طبيب/مهندس/قناص بعيد = تهديد لا لا نعم نعم
مراوغة لا نعم نعم نعم قائمة استثناءات طويلة
يتجنب الاصطدام بالأعداء لا لا نعم نعم يهم الجاسوس بشكل أساسي
فرصة تفعيل الاندفاع المضغوط 0% 50% 90% 100%
اختيار فئة تمويه الجاسوس عشوائي عشوائي يطابق عدوًا حقيقيًا يطابق عدوًا حقيقيًا
تواصل بصري لجاسوس أثناء التمويه يحدق (واضح) يحدق يتجنب (مقنع) يتجنب
زاوية طعن جاسوس خلفي ~0° ±45° ±78° ±90° MvM تفرض عادي
منطق اختيار السلاح لا نعم نعم نعم أقل صلة في MvM
إعادة تحميل تحت الغطاء لا لا نعم نعم ليس في MvM
تجوال مدافع CP 10% 50% 75% 90% ليس في MvM
منع استيلاء CP لا 50% نعم نعم ليس في MvM

الخاتمة

بوت ثقيل TF2 يصوب مدفعًا رشاشًا

لا شيء من هذا هو تخمين خاطئ من Valve -- إنه نظام تسجيل واحتمالات متعمد ومحدد بالكامل، فقط لم يُكتب أبدًا في أي مكان رسمي. بعض الأشياء الجديرة بالتذكر:

  1. "المهارة" هي حزمة من المقاييس المستقلة، وليس مضاعفًا عالميًا واحدًا. زمن رد الفعل، معدل التصويب، وكل سلوك تكتيكي يتدرج بشكل منفصل، وبعضها (معدل تتبع الجاسوس، زاوية الطعن الخلفي في MvM) يحصل على تجاوزات مبرمجة بشكل ثابت بغض النظر عن المهارة.
  2. بعض هذا مليء بالأخطاء حقًا، وليس مجرد قديم. قائمة الأسلحة الخفية المجمدة منذ 2010، Cow Mangler تفتقد منطق التصويب للقدمين بدون سبب وجيه، فحص حاصل الضرب النقطي للقناص الذي استغرق سنوات لفك ترجمته بشكل صحيح -- كود ذكاء Valve الاصطناعي لديه نسيج ندبي مثل أي قاعدة كود عمرها 17 عامًا.
  3. يمكنك استخدام كل هذا. اعلم أن بوت قناص لن يصيبك في الرأس على عادي، وأن بايرو سهل لا يمكنه فعليًا إرجاع صاروخك بالاندفاع المضغوط، وأن جاسوس سهل سيحاول طعنك وجهًا لوجه. إنه ليس حظًا. إنها ورقة مواصفات.

شكر كبير لـ sigsegv على الغوص الأصلي في الكود الذي جعل معظم هذا ممكنًا، لويكي TF2 للتوثيق الأساسي لأوامر البوتات ودعم الخرائط، ولكل فرد في المجتمع الذي لا يزال يبحث في ذكاء اصطناعي لبوت عمره 17 عامًا ليكتشف بالضبط لماذا يفعل ما يفعله.

Bot TF2 Không Phải Ngẫu Nhiên: Tôi Đã Dịch Ngược Từng Thiết Lập Độ Khó

Tầm nhìn, theo dõi mục tiêu, góc đâm sau lưng của Spy, logic headshot của Sniper, mọi lỗi đã biết -- Valve chưa bao giờ ghi chép điều nào. Vì vậy chúng tôi đã lục tung mã nguồn và biến nó thành một bảng thông số đầy đủ.

Giới thiệu

Bot Soldier TF2 đang ngắm súng rocket

Mọi người chơi TF2 đều đã từng nói ít nhất một lần: "con bot này gian lận." Hoặc ngược lại: "sao con bot Dễ này cứ đứng đó hứng rocket vậy." Không ai thực sự biết "Dễ," "Thường," "Khó," và "Chuyên gia" thực sự có nghĩa là gì bên dưới lớp vỏ -- Valve đưa ra bốn nhãn độ khó và không một tài liệu nào.

Vì vậy một nhóm chúng tôi (tôi, awimii, Mush The Possum, với phần lớn nền tảng do sigsegv thực hiện, người đã thực sự đào bới mã nguồn game đã dịch ngược) đã tổng hợp một tài liệu nghiên cứu đầy đủ về hành vi của TFBot. Mọi cơ chế, mọi lỗi đã biết, mọi xác suất được lập trình cứng. Bài viết này là bản tường trình đầy đủ, không phải bản rút gọn. Cầm lấy lon Bonk đi, bài này dài lắm đây.


Chương I: Những Điều Cơ Bản

Bot so với Bot Rối

TF2 có hai thứ hoàn toàn khác nhau mà người ta gọi là "bot":

  • Bot AI (TFBot): AI thật, được xây dựng trên cùng nền tảng PlayerBot/Infected mà Valve đã dùng cho dòng Left 4 Dead. Chúng chọn lớp ngẫu nhiên, chơi theo mục tiêu, hoạt động mà không cần sv_cheats, và kích hoạt thành tích như người chơi thật.
  • Bot rối (Puppet bot): không có AI, không thể tự di chuyển hay hành động. Chúng tồn tại thuần túy để bị điều khiển thủ công -- người chơi có thể buộc chúng đi theo, ngắm và bắn, chủ yếu dùng để thử nghiệm hoặc tạo ảnh/video điện ảnh. Triệu hồi chúng cần sv_cheats 1, cũng vô hiệu hóa thành tích trong phiên chơi đó.

Bài viết này hoàn toàn nói về loại đầu tiên.

Những gì bot AI có thể (đại loại) được bảo làm

TFBot không thể điều khiển trực tiếp, nhưng có một danh sách ngắn những việc bạn có thể xui chúng làm:

  • Ngắm nòng súng vào bất kỳ bot nào (đồng đội hay kẻ địch) và nó sẽ chế nhạo bạn nếu bạn dùng đúng lệnh giọng nói.
  • Bot Medic đồng minh sẽ chữa trị cho bạn nếu bạn dùng lệnh giọng nói "Medic!"
  • Nếu bot Medic đang chữa cho bạn và có ÜberCharge sẵn sàng, nói "Go go go!" hoặc "Activate charging!" sẽ khiến nó kích hoạt charge ngay lập tức.
  • Bot Medic có charge sẵn sẽ tự động kích hoạt ngay khi nó hoặc mục tiêu đang chữa bị sát thương nghiêm trọng, không cần lệnh giọng nói.
  • Bot sẽ tự động thực hiện các điệu nhảy đôi (High Five) hoặc nhảy nhóm (Conga) với đồng đội gần đó.

Làm cho bot hoạt động trên map không được hỗ trợ

Bot dựa vào lưới dẫn đường (navmesh) để biết nơi chúng được phép đi, và hầu hết map cộng đồng không có sẵn lưới này. Để ép buộc:

  1. sv_cheats 1
  2. nav_generate -- xây dựng navmesh ban đầu, tiến trình hiển thị trong console
  3. Chờ game hoàn tất tạo đường đi
  4. Tùy chọn sửa dữ liệu dẫn đường xấu bằng nav_edit 1
  5. Tải lại hoặc khởi động lại server (bỏ qua bước này sẽ vô hiệu hóa thành tích)
  6. tf_bot_add <số_lượng> để thực sự sinh bot

Cảnh báo: thay đổi navmesh khi bot đang hoạt động trên server có thể làm game crash. Khi lưới đã tồn tại, bạn không cần tạo lại cho các phiên sau -- chỉ cần thêm bot lại bằng tf_bot_add.

Lưới tự động hoạt động tốt nhất trên map Control Point, King of the Hill, Payload và CTF. Trên map Mannpower, bot mặc định chơi kiểu CTF nhưng hầu như không dùng móc hay powerup. Nếu map không có mục tiêu mà bot AI nhận diện được nhưng có entity phòng sinh, đặt tf_bot_offense_must_push_time 0 cho phép bot chiến đấu dù sao.

(Nguồn cho phần này: trang Bot trên Wiki chính thức của TF2.)

Tình trạng hiện tại, theo từng map

Nhờ bản cập nhật Hatless, mọi lớp đều hoạt động chính xác, bao gồm Spy vốn đầy lỗi trước đây. Bot hoạt động tốt trên hầu hết map KOTH chính thức, một số map Payload, Dustbowl/Gorge Attack-Defense, và map CTF/Mann Manor -- dù trên hai loại sau bạn không thể sinh chúng trực tiếp bằng tf_bot_add. Trên map không được hỗ trợ (qua quy trình nav_generate ở trên) chúng vẫn hoạt động, nhưng kém hơn rõ rệt trong việc bắt chước người chơi thật.

Map PLR là vô vọng: bot không thể vượt qua rào trên Hightower và bị kẹt trong góc, và trên mọi map PLR khác chúng chỉ... tổ chức tiệc khiêu vũ thay vì chơi. Việc này có thể sẽ được sửa. Hoặc không.

Hành vi chung của bot

Một tập hợp linh tinh những điều mọi bot đều làm bất kể kỹ năng:

  • Bot chỉ dùng trang bị mặc định (plugin có thể ép chúng dùng vũ khí không mặc định, nhưng bot gốc không bao giờ tự chọn).
  • Bot Dễ hầu như không đụng đến vũ khí phụ. Độ khó cao hơn chuyển sang vũ khí phụ ngay khi đạn chính cạn, hoặc để bù tầm bắn.
  • Bot không thể làm kỹ thuật di chuyển -- không nhảy rocket, không di dời công trình.
  • Sau khi hạ gục, bot có thể chế nhạo, kể cả khi đang bị bắn -- ngoại trừ khi đang mang intelligence của địch, và quy tắc này cũng áp dụng trong MvM.
  • Bot Spy đang cải trang (người chơi hoặc AI) bị các bot khác bỏ qua -- cho đến khi chúng chạm vào kẻ địch, đặt sapper, bắn, hay tàng hình gần một bot. Khi đã bị "lộ," bot/người chơi đó bị nhớ là Spy cho đến khi nó đổi cải trang trong khi vẫn tàng hình, chết, hoặc giả chết bằng Dead Ringer.
  • Bot Pyro dùng Compression Blast thoải mái ở mọi cấp trên Dễ.
  • Bot Medic ưu tiên chữa cho mọi người hơn là Sniper (và ở mức độ thấp hơn, Engineer), kể cả khi bạn spam "Medic!" khi đang chơi Sniper.
  • Bot Medic bị thu hút về phía Heavy, Soldier, Demoman và Pyro -- đặc biệt nếu có người chơi đang dùng các lớp đó. Không có người chơi ở các vai trò đó, không có sự chú ý đặc biệt nào từ Medic.
  • Bot giữ vị trí trong thời gian setup trên map Attack/Defense và Payload -- ngoại trừ Engineer, Sniper và Spy, những lớp di chuyển tự do (bot Demoman cũng được phép đặt stickies trước).
  • Bot Engineer không bao giờ nâng cấp hoặc gỡ sapper khỏi công trình của Engineer đồng đội, trừ khi công trình đó tình cờ nằm trên đường đi của mục tiêu. Chúng đôi khi cũng... không sửa turret của chính mình, dù an toàn để làm.
  • Bot Spy bị phát hiện sẽ chuyển sang revolver và lùi lại thay vì cố đâm.
  • Bot Demoman đã xác định được vị trí sentry (thường bằng cách chết vì nó một lần) có thể ném stickies hoàn hảo vào nó từ ngoài tầm bắn, vòng qua tường và trần nhà nếu hình học cho phép.
  • Bot Sniper không tìm được mục tiêu sau khi ngắm sẽ dùng một trong các câu thoại "Tiêu cực."
  • Medic đồng minh sẽ chữa cho Spy đang cải trang mà không do dự.

Vấn đề / lỗi đã biết

Tài liệu liệt kê một đống các tính năng kỳ lạ tồn tại lâu năm:

  • Bot có thể cố đi hoặc bắn xuyên qua một số vật thể tĩnh nhất định.
  • Bất kỳ khi nào người chơi/bot lộ diện, cải trang, hoặc lộ tẩy, các bot gần đó "thấy" và quay lại phản ứng -- ngay cả khi sự kiện xảy ra bên ngoài tầm nhìn thực tế của chúng. Nó không dựa trên âm thanh; đó là một lỗi kiểm tra thị giác.
  • Hiếm khi, bot có thể bị kẹt vật lý với nhau khi dùng teleporter của Engineer.
  • Lệnh giọng nói của bot (ví dụ "Spy!", "Forward!") không hiển thị dưới dạng chat text như của người chơi.
  • Bot Medic đang tích cực chữa trị cho ai đó sẽ không né đạn hoặc nhặt bộ dụng cụ y tế, ngay cả khi HP cực kỳ thấp.
  • Bot có thể tiếp tục di chuyển khi thực hiện điệu nhảy đôi, điều này phá vỡ hiệu ứng dự định của Festive Critical Strike.
  • Bot Medic vừa bị sát thương thường từ chối dùng Syringe Gun ở tầm xa, thích cận chiến hơn (hoặc, trong trường hợp rất hiếm, cố đánh bạn bằng tia Medi Gun).
  • Bot Medic không bù độ rơi trọng lực cho đạn Syringe Gun -- có khả năng vì vũ khí này không được gắn cờ hitscan đúng trong mã AI.
  • Bot Spy có thể thấy và theo dõi Spy đang tàng hình (người chơi hoặc AI) nếu Spy đó đã từng lộ diện, bất kể cấp kỹ năng của bot theo dõi.
  • Ngay cả khi người chơi Spy cải trang thành lớp của phe mình, va vào kẻ địch vẫn làm lộ chúng (bot không bao giờ tự làm điều này, vì bot không bao giờ cải trang thành phe mình).
  • Bot tôn trọng cân bằng đội tự động -- nếu bạn đang cố dồn bot về một đội, bạn cần mp_teams_unbalance_limit 0 trước.
  • Bot Engineer đôi khi hoàn toàn phớt lờ công trình của chính mình cho đến khi chúng bị phá hủy.
  • Bot Heavy đôi khi cố bắn Minigun khi gần hết đạn, chủ yếu ở độ khó dưới Khó.
  • Bot Medic của đội thua đôi khi tự sát trong giai đoạn Nhục nhã khi không có kẻ địch nào gần -- điều mà người chơi không thể làm được dù có cố.
  • Đặt màn hình chọn đội thành BLU sẽ khiến bot RED hiển thị màu BLU cho bạn.
  • Bot đang cầm vũ khí cận chiến đôi khi từ chối đổi vũ khí ngay cả sau khi nhặt đạn.
  • Sau bản cập nhật Jungle Inferno, bot được sinh với tham số rõ ràng (ví dụ tf_bot_add 5 pyro blue normal) có thể chết ngay trong phòng sinh của chính chúng. Cách sửa: tf_bot_reevaluate_class_in_spawnroom 0 (cần sv_cheats 1).

Tên AI

Tên bot được lấy từ một kho tham chiếu lớn đến TF2, các game khác của Valve và văn hóa lập trình, phần lớn vì cộng đồng liên tục yêu cầu những tên cụ thể trên Steam forums. Một mẫu danh sách: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, và hàng tá tên tương tự.

Cũng có một loạt tên được tìm thấy trong bản dựng nguồn bị rò rỉ chưa từng được phát hành chính thức, vì lý do không rõ -- chủ yếu là các tham chiếu từ Last Dragon và The Fifth Element như John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh?, và I'm your huckleberry.

Bạn có thể ghi đè tất cả: tf_bot_add heavyweapons blue "Blu Hoovy" sinh một BLU Heavy tên là "Blu Hoovy."


Chương II: Bot Gốc / TFBot -- Phân Tích Sâu Cấp Độ Kỹ Năng

Khung phân tích gốc của Sigsegv vẫn đúng: rõ ràng bot Chuyên gia chơi hay hơn bot Dễ, nhưng Valve chưa bao giờ giải thích bao nhiêu hay tại sao. Vì vậy cách duy nhất để biết là đọc mã nguồn. Dưới đây là mọi cơ chế thay đổi theo kỹ năng.

Thiết lập độ khó

Bên ngoài MvM, độ khó được điều khiển bởi một cvar:

tf_bot_difficulty Cấp độ kỹ năng
0 Dễ
1 Thường (mặc định)
2 Khó
3 Chuyên gia

tf_bot_add cũng chấp nhận tham số độ khó trực tiếp (easy/normal/hard/expert).

Popfile MvM

Trong Mann vs. Machine, mỗi block sinh TFBot trong popfile có một khóa Skill tùy chọn. Không có khóa nghĩa là Dễ. Trong các nhiệm vụ chính thức của Valve: Giant hầu như luôn là Chuyên gia, Engineer và Spy hầu như luôn là Chuyên gia, và Sniper thường là Khó (thỉnh thoảng Chuyên gia). Nếu bạn dùng EventChangeAttributes (thêm vào trong bản cập nhật Two Cities) để thay đổi bot linh hoạt giữa đợt dựa trên sự kiện map, kỹ năng bot là một trong những thuộc tính bạn được phép thay đổi ngay lập tức.

Chế độ Vô Tận MvM

Chế độ Vô tận chưa bao giờ được phát hành chính thức, nhưng trong đó, bot tiêu tiền nâng cấp như người chơi -- bao gồm một nâng cấp độc quyền của bot giúp tăng cấp độ kỹ năng AI giữa trận.

Entity bot_generator

Một entity ít biết, hầu như không có tài liệu, được cho là đã dùng trong chế độ luyện tập và có thể trong quá trình phát triển MvM ban đầu. Nó có đầu vào SetDifficulty để kiểm soát cấp độ kỹ năng. Ngoài ra, thông tin rất mơ hồ -- Valve chưa bao giờ ghi chép nó và chưa ai lập bản đồ đầy đủ hành vi của nó.

Màu mắt phát sáng

Robot trong MvM có hiệu ứng hạt phát sáng mắt thay đổi màu theo cấp độ kỹ năng -- một dấu hiệu trực quan mà chưa ai ngoài cộng đồng từng giải thích:

Kỹ năng Màu mắt RGB
Dễ/Thường Xanh dương #24b4ff
Khó/Chuyên gia Vàng #fff000

Bot Heavy TF2 ở tư thế đứng yên

Tầm nhìn: thời gian nhận diện

Bot không phản ứng ngay khi thứ gì đó vào tầm nhìn của nó -- có một độ trễ được lập trình cứng trước khi phần còn lại của AI được phép thừa nhận mối đe dọa:

Kỹ năng Thời gian nhận diện tối thiểu
Dễ 1,00 giây
Thường 0,50 giây
Khó 0,30 giây
Chuyên gia 0,20 giây

Đó là phần lớn hiệu ứng "bot Dễ có vẻ ngu đần" trong một con số -- bot Dễ không ngắm tệ hơn khi nó thấy bạn, nó chỉ mất thời gian gấp năm lần để nhận ra bạn tồn tại.

Ngắm: tốc độ cập nhật

Bot không theo dõi bạn liên tục. Chúng lấy mẫu vị trí và vận tốc của bạn ở một khoảng thời gian cố định và dự đoán đường thẳng từ đó:

Kỹ năng Khoảng thời gian tính lại Tốc độ tương đương
Dễ 1,00 giây 1 lần/giây
Thường 0,25 giây 4 lần/giây
Khó 0,10 giây 10 lần/giây
Chuyên gia 0,05 giây 20 lần/giây

Ngoại lệ: Bot Spy được lập trình cứng ở tốc độ theo dõi Thường bất kể cấp kỹ năng thực tế -- một Spy Chuyên gia vẫn ngắm như bot Thường. Cũng có một video trình diễn công khai so sánh tốc độ theo dõi cạnh nhau nếu bạn muốn thấy khoảng cách 1 lần so với 20 lần trong thực tế.

Ngắm: kỹ năng theo từng vũ khí

Bot không chỉ ngắm vào tâm khối của bạn -- chúng có logic theo từng vũ khí, một số thực sự có lỗi:

Súng phóng lựu & Bẫy dính. Mọi cấp kỹ năng đều bù đường cong thẳng đứng, dùng một giá trị cố định từ cvar tf_bot_ballistic_elevation_rate. Vì việc bù đó chỉ kích hoạt cho ID vũ khí gốc, các biến thể đạn nhanh hơn (Loch-n-Load, bất kỳ thứ gì có chỉ số tốc độ đạn) không được điều chỉnh đường cong chính xác. Và vì nó gắn với ID vũ khí cụ thể, Loose Cannon -- một ID hoàn toàn khác -- không được bù đường cong nào cả.

Huntsman. Bot Dễ không bù độ rơi mũi tên và không bao giờ nhắm đầu. Bot kỹ năng Thường bù đường cong, nhưng chỉ nhắm đầu trong phạm vi 150 HU. Bot Khó/Chuyên gia luôn nhắm đầu.

Súng Rocket. Trên 150 HU, bot không phải Dễ nhắm vào chân bạn thay vì tâm khối, tối đa hóa sát thương lan và tỷ lệ knockback. Trong 150 HU chúng chuyển sang nhắm đầu. Bot Dễ luôn nhắm tâm khối bất kể khoảng cách. Điều này cũng bị khóa theo ID vũ khí: Direct Hit và Cow Mangler không kế thừa hành vi này. Hợp lý cho Direct Hit (không có AoE để khai thác); hoàn toàn vô lý cho Cow Mangler -- phần AI này có trước khi vũ khí tồn tại và đơn giản là chưa bao giờ được xem xét lại.

Súng Sniper. Dễ nhắm vào thân. Thường nhắm khoảng 33% từ thân lên đầu. Khó/Chuyên gia nhắm thẳng vào đầu. Ít quan trọng hơn trong MvM, nơi headshot của bot không nhận thưởng sát thương.

Thính giác: độ nhạy với đạn lén

Mọi tiếng súng đều cảnh báo bot gần đó về vị trí của người bắn, ngay cả qua tường, trong phạm vi 3000 HU với 100% cơ hội phát hiện (tf_bot_notice_gunfire_range). Nhưng một số vũ khí được gắn cờ "lén" -- chỉ nghe được trong phạm vi 500 HU (tf_bot_notice_quiet_gunfire_range), và ngay cả khi đó cũng có xác suất phụ thuộc vào kỹ năng:

Kỹ năng Cơ hội phát hiện đạn lén
Dễ 10%
Thường 30%
Khó 60%
Chuyên gia 90%

Xác suất đó bị giảm một nửa nếu có tiếng súng lớn được nghe thấy trong 3 giây qua -- âm thanh lớn che lấp âm thanh nhỏ.

Danh sách ID vũ khí lén đã không được cập nhật từ tháng 12 năm 2010. Bất cứ thứ gì thêm vào sau ngày đó với ID vũ khí mới đều bị coi là lớn theo mặc định, bất kể logic nó có nên nhỏ đến đâu, trừ khi nó tình cờ dùng lại ID cũ. Cụ thể:

ID vũ khí Bao gồm
TF_WEAPON_KNIFE Tất cả dao của Spy
TF_WEAPON_FISTS Đòn đấm của Heavy (đòn đấm đa lớp của anh ta thực ra là TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Được cho là không dùng trực tiếp
TF_WEAPON_PDA_ENGINEER_BUILD PDA Xây dựng của Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA Phá hủy của Engineer
TF_WEAPON_PDA_SPY Bộ cải trang của Spy
TF_WEAPON_BUILDER Bộ đồ nghề Engineer/Sapper của Spy
TF_WEAPON_MEDIGUN Tất cả Súng Medi
TF_WEAPON_DISPENSER Có thể không dùng (Dispenser là vật thể, không phải vũ khí)
TF_WEAPON_INVIS Tất cả đồng hồ tàng hình của Spy
TF_WEAPON_FLAREGUN Tất cả súng pháo sáng của Pyro ngoại trừ Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (không phải Mad Milk -- ID riêng, không lén)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Ví dụ kinh điển về danh sách mục nát: Manmelter có ID riêng (TF_WEAPON_RAYGUN_REVENGE), được thêm vào sau khi danh sách lén bị đóng băng -- vì vậy nó bị coi là lớn, mặc dù thực tế nó là súng pháo sáng. Scorch Shot, phát hành muộn hơn, dùng lại ID TF_WEAPON_FLAREGUN gốc và do đó vẫn được coi là lén. Vô lý, nhưng đó là mã nguồn.

Chiến thuật: ưu tiên mối đe dọa

Khi nhiều kẻ địch hiện ra cùng lúc, bot cân nhắc khoảng cách, liệu chúng có đang bị bắn không, và -- trên Dễ -- liệu mối đe dọa chính có đang được chữa trị không:

Kỹ năng Nhắm vào người chữa trị thay vì?
Dễ Không
Thường 50% cơ hội
Khó Có
Chuyên gia Có

Kẻ địch cách xa 500 HU thường bị giảm ưu tiên như không khẩn cấp. Ngoại lệ: bot Khó/Chuyên gia luôn coi Medic và Engineer ở xa là mối đe dọa khẩn cấp, và bất kỳ Sniper địch nào đang ngắm về phía bạn luôn bị coi là khẩn cấp bất kể khoảng cách và kỹ năng.

Kỹ năng Medic/Engineer ở xa/Sniper đang ngắm = mối đe dọa khẩn cấp?
Dễ/Thường Không
Khó/Chuyên gia Có

Việc kiểm tra Sniper đó có một lịch sử thú vị. Bản viết gốc của sigsegv cho rằng game yêu cầu tích vô hướng giữa vector ngắm của sniper và vị trí tương đối của bot phải chính xác bằng không -- một phép so sánh chính xác đến mức hầu như không bao giờ kích hoạt trong số học dấu phẩy động, khiến toàn bộ tính năng trở thành mã chết. Một hiệu chỉnh sau đó (nhờ một bản dịch ngược Hex-Rays sạch hơn) cho thấy kiểm tra thực tế là tích vô hướng > 0: bất kỳ Sniper nào đang đối diện từ hướng thẳng vào bạn đến vuông góc với bạn đều bị coi là mối đe dọa khẩn cấp; bất cứ thứ gì từ vuông góc đến quay lưng thì không. Sai sót ban đầu đến từ việc dịch ngược tệ một phép so sánh float SSE -- dịch ngược binary AAA không phải khoa học chính xác.

Di chuyển: né tránh

Bot Dễ không bao giờ né tránh, chấm hết. Bot từ Thường trở lên né trái/phải (33% trái, 33% phải, 33% không làm gì, có trọng số theo khoảng trống phát hiện) khi chúng đang cầm vũ khí chiến đấu, đã thấy kẻ địch trong 3 giây qua và kẻ địch đó có tầm nhìn thẳng tới chúng.

Chúng sẽ không né nếu có bất kỳ điều nào sau đây: thuộc tính DisableDodge được đặt, hành vi hiện tại bảo phải nhanh lên, đang bất khả xâm phạm (bất kỳ über nào), đang giữa điệu nhảy/khiêu khích, đang chơi Engineer, tàng hình hoặc cải trang thành Spy, đang ngắm làm Sniper hoặc đang quay súng làm Heavy, hoặc đang giữa lúc kéo cung Huntsman.

Di chuyển: tránh xô đẩy kẻ địch

Trên Thường, bot đặc biệt cố gắng không va vào kẻ địch khi di chuyển:

Kỹ năng Tránh va chạm kẻ địch?
Dễ Không
Thường Không
Khó Có
Chuyên gia Có

Trong thực tế, điều này chỉ thực sự quan trọng với bot Spy -- tránh một vụ va chạm khó xử với người chơi địch chính là thứ làm lộ cải trang.

Pyro: khả năng airblast

Airblast phục vụ hai mục đích: phản đạn (PvP và MvM) và đẩy kẻ địch gần đó khỏi vực (chỉ PvP). Liệu bot có thực sự kích hoạt khi có cơ hội hợp lệ hay không là một lần tung đồng xu dựa trên kỹ năng:

Kỹ năng Cơ hội kích hoạt airblast
Dễ 0%
Thường 50%
Khó 90%
Chuyên gia 100%

Bot Pyro Dễ hoàn toàn không thể airblast -- tỷ lệ được lập trình cứng không bao giờ thành công, không chỉ "hiếm khi."

Spy: hiệu quả cải trang

Hai trục riêng biệt thay đổi theo kỹ năng. Lựa chọn cải trang:

Kỹ năng Phương pháp cải trang
Dễ/Thường Lớp ngẫu nhiên, bỏ qua lớp mà đội địch thực sự đang chơi
Khó/Chuyên gia Chọn một người chơi địch thực và sao chép chính xác lớp của họ

Diễn xuất cải trang:

Kỹ năng Hành vi khi cải trang/tàng hình
Dễ/Thường Nhìn chằm chằm vào người chơi địch khi thấy họ (đáng ngờ)
Khó/Chuyên gia Cố tình tránh giao tiếp bằng mắt (thuyết phục hơn)

Spy: độ hung hăng đâm sau lưng

Ở tầm xa (lên đến 300 HU, tf_bot_spy_knife_range), bot Spy chỉ cam kết đâm sau lưng nếu nó có thể thấy nạn nhân và lưng nạn nhân ít nhất đã quay đi một phần. Kỹ năng quyết định góc lệch cho phép đó rộng đến đâu:

Kỹ năng Dung sai góc
Dễ Sẽ đâm ngay cả khi đối diện trực tiếp
Thường ±45° từ sau lưng bạn
Khó ±78° từ sau lưng bạn
Chuyên gia ±90° từ sau lưng bạn (toàn bộ cung 180° phía sau)

Bot Spy Dễ có chức năng tự sát -- chúng sẽ cố đâm ai đó đang nhìn thẳng vào chúng. Ngoại lệ: trong Mann vs. Machine, mọi bot Spy đều bị ép vào ràng buộc góc Thường bất kể kỹ năng thực tế.

Chiến thuật: chọn vũ khí

Chỉ kích hoạt trên Dễ và hầu như không liên quan trong MvM vì bot ở đó thường bị giới hạn vũ khí cứng:

  • Scout: chuyển sang vũ khí phụ khi băng đạn chính hết.
  • Soldier: chuyển sang vũ khí phụ khi hết đạn và mục tiêu gần hơn 500 HU.
  • Sniper: chuyển sang vũ khí phụ cho mục tiêu gần hơn 750 HU.
  • Pyro: chuyển sang vũ khí phụ cho mục tiêu xa hơn 750 HU, trừ khi mục tiêu đó là Soldier hoặc Demoman.

Chiến thuật: nạp đạn sau che chắn

Không dùng trong MvM. Nếu hành vi hiện tại của bot không bảo nó rút lui, băng đạn chính đã hết và nó không được uber, bot kỹ năng cao hơn sẽ tạm thời rút lui về chỗ nấp để nạp đạn thay vì bắn súng không đạn vào bạn:

Kỹ năng Rút lui để nạp đạn?
Dễ Không
Thường Không
Khó Có
Chuyên gia Có

Chế độ CP: lang thang của người phòng thủ

Không dùng trong MvM. Khi phòng thủ điểm kiểm soát, bot kỹ năng cao hơn có nhiều khả năng rời điểm để săn mạng ("search and destroy"), nhưng chỉ khi còn một khoảng thời gian kha khá trong tf_bot_defense_must_defend_time:

Kỹ năng Cơ hội lang thang
Dễ 10%
Thường 50%
Khó 75%
Chuyên gia 90%

Chế độ CP: chặn chiếm điểm

Không dùng trong MvM. Bot phòng thủ tranh chấp khi kẻ địch đang cố chiếm điểm:

Kỹ năng Sẽ cố chặn chiếm điểm?
Dễ Không
Thường 50% cơ hội
Khó Có
Chuyên gia Có

Bảng tổng hợp đầy đủ

Khía cạnh Dễ Thường Khó Chuyên gia Ghi chú
Tầm nhìn: thời gian nhận diện 1,00s 0,50s 0,30s 0,20s
Ngắm: tốc độ cập nhật 1 lần/s 4 lần/s 10 lần/s 20 lần/s Spy luôn dùng Thường
Bù đường cong lựu/bẫy dính Có Có Có Có Loose Cannon miễn trừ
Bù đường thẳng đứng Huntsman Không Có Có Có
Headshot Huntsman Không <150 HU Có Có
Nhắm chân Rocket Không Có Có Có Direct Hit & Cow Mangler miễn trừ
Điểm ngắm Súng Sniper Thân ~33% lên đầu Đầu Đầu
Cơ hội phát hiện đạn lén 10% 30% 60% 90% Giảm nửa nếu bị tiếng lớn che
Nhắm vào người chữa trị Không 50% Có Có
Medic/Engineer/Sniper xa = đe dọa Không Không Có Có
Né tránh Không Có Có Có Danh sách ngoại lệ dài
Tránh va chạm kẻ địch Không Không Có Có Chủ yếu cho Spy
Cơ hội kích hoạt airblast 0% 50% 90% 100%
Chọn lớp cải trang Spy Ngẫu nhiên Ngẫu nhiên Khớp địch thật Khớp địch thật
Giao tiếp mắt của Spy khi cải trang Nhìn chằm chằm (rõ) Nhìn chằm chằm Tránh (thuyết phục) Tránh
Góc đâm Spy ~0° ±45° ±78° ±90° MvM ép Thường
Logic chọn vũ khí Không Có Có Có Ít liên quan trong MvM
Nạp đạn sau che chắn Không Không Có Có Không trong MvM
Lang thang phòng thủ CP 10% 50% 75% 90% Không trong MvM
Chặn chiếm điểm CP Không 50% Có Có Không trong MvM

Kết luận

Bot Heavy TF2 đang ngắm súng minigun

Không có điều nào trong số này là phỏng đoán sai lầm từ phía Valve -- đó là một hệ thống tính điểm và xác suất có chủ đích, hoàn toàn xác định, chỉ là chưa bao giờ được viết ra ở bất kỳ đâu chính thức. Một vài điều đáng nhớ:

  1. "Kỹ năng" là một tập hợp các núm điều chỉnh độc lập, không phải một số nhân toàn cục. Thời gian phản ứng, tốc độ ngắm và mọi hành vi chiến thuật thay đổi riêng rẽ, và một vài thứ (tốc độ theo dõi của Spy, góc đâm trong MvM) bị ghi đè cứng bất kể kỹ năng.
  2. Một số thứ này thực sự có lỗi, không chỉ cũ kỹ. Danh sách vũ khí lén bị đóng băng từ năm 2010, Cow Mangler thiếu logic nhắm chân vì không có lý do chính đáng, phép kiểm tra tích vô hướng của Sniper mất nhiều năm để dịch ngược chính xác -- mã AI của Valve có sẹo như bất kỳ codebase 17 năm tuổi nào.
  3. Bạn có thể dùng tất cả những điều này. Biết rằng bot Sniper sẽ không headshot bạn ở Thường, rằng Pyro Dễ hoàn toàn không thể airblast rocket của bạn lại, rằng Spy Dễ sẽ cố đâm bạn mặt đối mặt. Đó không phải may mắn. Đó là một bảng thông số.

Cảm ơn rất nhiều đến sigsegv vì công trình đào mã nguồn ban đầu đã làm nên phần lớn điều này, đến TF2 Wiki vì tài liệu cơ sở về lệnh bot và hỗ trợ map, và đến tất cả mọi người trong cộng đồng vẫn đang mổ xẻ một bot AI 17 năm tuổi để tìm ra chính xác tại sao nó làm những gì nó làm.

TF2 บอทไม่สุ่ม: ผมถอดรหัสทุกรายละเอียดของความยากทุกระดับแล้ว

การมองเห็น, การเล็งเป้า, มุมแทงหลังของ Spy, ตรรกะการยิงหัวของ Sniper, ทุกบั๊กที่รู้จัก -- Valve ไม่เคยบันทึกสิ่งเหล่านี้เลย เราจึงขุดคุ้ยโค้ดและเปลี่ยนมันเป็นเอกสารข้อมูลครบถ้วน

บทนำ

TF2 Soldier bot กำลังเล็ง rocket launcher

ผู้เล่น TF2 ทุกคนเคยพูดอย่างน้อยครั้งหนึ่ง: "บอทนี่โกงชัดๆ" หรือตรงกันข้าม: "ทำไมบอท Easy นี้ยืนเฉยแล้วกินจรวด" ไม่มีใครรู้จริงๆ ว่า "Easy," "Normal," "Hard," และ "Expert" แท้จริงแล้วหมายถึงอะไร -- Valve ส่งป้ายชื่อความยากสี่ระดับมาโดยไม่มีเอกสารใดๆ เลย

พวกเราหลายคน (ผม, awimii, Mush The Possum, โดยมีงานพื้นฐานจำนวนมหาศาลจาก sigsegv ที่ลงไปขุดคุ้ยโค้ดเกมที่ถูกดีคอมไพล์) จึงรวบรวมเอกสารวิจัยฉบับเต็มเกี่ยวกับพฤติกรรมของ TFBot ทุกกลไก, ทุกบั๊กที่รู้จัก, ทุกความน่าจะเป็นที่ถูกฮาร์ดโค้ดไว้ บทความนี้เป็นฉบับเต็ม ไม่ใช่ฉบับย่อ คว้า Bonk ไว้ให้ดี เพราะอันนี้ยาว


บทที่ I: พื้นฐาน

Bot vs Puppet Bot

TF2 มีสิ่งที่คนเรียก "บอท" สองแบบที่แตกต่างกันโดยสิ้นเชิง:

  • AI bots (TFBots): AI จริง, สร้างบนเฟรมเวิร์ค PlayerBot/Infected เดียวกับที่ Valve ใช้ในซีรีส์ Left 4 Dead พวกมันสุ่มคลาส, เล่นตามเป้าหมาย, ทำงานโดยไม่ต้องใช้ sv_cheats, และปลดล็อคความสำเร็จเหมือนผู้เล่นจริง
  • Puppet bots: ไม่มี AI, ไม่สามารถเคลื่อนที่หรือทำอะไรเองได้ มีไว้เพื่อให้ควบคุมด้วยมือเท่านั้น -- ผู้เล่นสามารถบังคับให้มันตาม, เล็ง, และยิงได้ ส่วนใหญ่ใช้สำหรับทดสอบหรือทำภาพ/วิดีโอ cinematic การเกิดต้องใช้ sv_cheats 1 ซึ่งจะปิดความสำเร็จสำหรับเซสชันนั้นด้วย

บทความนี้เกี่ยวกับแบบแรกทั้งหมด

สิ่งที่ AI bot สามารถทำได้ (แบบคร่าวๆ)

TFBots ไม่สามารถควบคุมได้โดยตรง แต่มีสิ่งไม่กี่อย่างที่คุณสามารถกระตุ้นให้มันทำได้:

  • เล็ง crosshair ไปที่บอทใดๆ (ฝ่ายเดียวกันหรือศัตรู) มันจะหยอกล้อคุณถ้าคุณใช้คำสั่งเสียงที่ถูกต้อง
  • บอท Medic ฝ่ายเดียวกันจะรักษาคุณถ้าคุณใช้คำสั่งเสียง "Medic!"
  • ถ้าบอท Medic กำลังรักษาคุณและมี ÜberCharge พร้อม พูด "Go go go!" หรือ "Activate charging!" จะทำให้มันใช้ชาร์จทันที
  • บอท Medic ที่มีชาร์จพร้อมจะใช้ชาร์จอัตโนมัติทันทีที่มันหรือเป้าหมายที่รักษาได้รับความเสียหายรุนแรง โดยไม่ต้องใช้คำสั่งเสียง
  • บอทจะทำ partner taunt (High Five) หรือ group taunt (Conga) กับเพื่อนร่วมทีมที่อยู่ใกล้โดยธรรมชาติ

การทำให้บอททำงานบนแผนที่ที่ไม่รองรับ

บอทอาศัย navigation mesh เพื่อรู้ว่าพวกมันเดินไปไหนได้ และแผนที่ชุมชนส่วนใหญ่ไม่มี mesh ติดมา การบังคับ:

  1. sv_cheats 1
  2. nav_generate -- สร้าง navmesh เริ่มต้น แสดงความคืบหน้าใน console
  3. รอให้เกมสร้างเส้นทางเสร็จ
  4. เลือกแก้ไขข้อมูล nav ที่ไม่ดีด้วยตนเองโดยใช้ nav_edit 1
  5. โหลดใหม่หรือรีสตาร์ทเซิร์ฟเวอร์ (ข้ามขั้นตอนนี้จะปิดความสำเร็จ)
  6. tf_bot_add <จำนวน> เพื่อสร้างบอทจริงๆ

คำเตือน: การเปลี่ยน navmesh ขณะที่บอททำงานบนเซิร์ฟเวอร์อาจทำให้เกม crash เมื่อ mesh มีอยู่แล้ว คุณไม่ต้องสร้างใหม่สำหรับเซสชันถัดไป -- แค่เพิ่มบอทอีกครั้งด้วย tf_bot_add

mesh ที่สร้างอัตโนมัติทำงานได้ดีที่สุดบนแผนที่ Control Point, King of the Hill, Payload, และ CTF บนแผนที่ Mannpower บอทจะเริ่มต้นการเล่นแบบ CTF แต่แทบไม่ใช้ grappling hook หรือ powerup ถ้าแผนที่ไม่มีเป้าหมายที่ AI บอทรองรับแต่มี spawn room entity การตั้งค่า tf_bot_offense_must_push_time 0 จะทำให้บอทสู้ได้อยู่ดี

(ที่มาสำหรับส่วนนี้: หน้า Bots ของ TF2 Wiki ทางการ)

สถานะปัจจุบัน, แผนที่ต่อแผนที่

ต้องขอบคุณอัปเดต Hatless ทำให้ทุกคลาสทำงานได้ถูกต้อง รวมถึง Spy ที่มีบั๊กมาช้านาน บอททำงานได้ดีบนแผนที่ KOTH ทางการส่วนใหญ่, แผนที่ Payload บางส่วน, Dustbowl/Gorge Attack-Defense, และแผนที่ CTF/Mann Manor -- แม้ว่าในสองแบบหลังคุณไม่สามารถสร้างมันด้วย tf_bot_add โดยตรงได้ บนแผนที่ที่ไม่รองรับ (ผ่านกระบวนการ nav_generate ข้างต้น) พวกมันทำงานได้ แต่แย่ลงอย่างเห็นได้ชัดในการเลียนแบบผู้เล่นจริง

แผนที่ PLR เป็นกรณีที่สิ้นหวัง: บอทไม่สามารถผ่านสิ่งกีดขวางบน Hightower และติดอยู่ในมุม และบนแผนที่ PLR อื่นๆ พวกมันก็แค่... มีปาร์ตี้เต้นรำแทนที่จะเล่น อาจจะได้รับการแก้ไขในอนาคต อาจจะไม่

พฤติกรรมทั่วไปของบอท

สิ่งต่าง ๆ ที่บอททุกตัวทำโดยไม่ขึ้นกับฝีมือ:

  • บอทใช้เฉพาะ loadout เริ่มต้นเท่านั้น (plugin สามารถบังคับอาวุธที่ไม่ใช่ของเริ่มต้นได้ แต่บอททั่วไปไม่เคยเลือกเอง)
  • บอท Easy แทบไม่แตะอาวุธรองของมัน ระดับความยากที่สูงกว่าจะสลับไปใช้อาวุธรองทันทีที่อาวุธหลักหมดกระสุน หรือเพื่อชดเชยระยะ
  • บอททำ movement tech ไม่ได้ -- ไม่มี rocket jump, ไม่ย้ายสิ่งปลูกสร้าง
  • หลังจากฆ่าได้ บอทอาจหยอกล้อ แม้กำลังถูกยิง -- ยกเว้นตอนที่ถือ intel ของศัตรู และกฎนี้ใช้กับ MvM ด้วย
  • บอท Spy ที่ปลอมตัว (ผู้เล่นหรือ AI) จะถูกบอทอื่นๆ ไม่สนใจอย่างถูกต้อง -- จนกว่ามันจะแตะศัตรู, sap อะไรบางอย่าง, ยิง, หรือล่องหนใกล้ๆ เมื่อถูก "เปิดโปง" แล้ว บอท/ผู้เล่นนั้นจะถูกจดจำว่าเป็น Spy จนกว่าจะเปลี่ยน disguise ขณะที่ยังล่องหน, ตาย, หรือแสร้งตายด้วย Dead Ringer
  • บอท Pyro ใช้ Compression Blast อย่างอิสระในทุกอย่างที่สูงกว่า Easy
  • บอท Medic ให้ความสำคัญกับการรักษาทุกคนมากกว่า Sniper (และ Engineer ในระดับรองลงมา) ถึงแม้คุณจะตะโกน "Medic!" ในฐานะ Sniper
  • บอท Medic มักจะเข้าหา Heavy, Soldier, Demoman, และ Pyro -- โดยเฉพาะถ้ามี ผู้เล่นจริง เล่นคลาสเหล่านั้นอยู่ ไม่มีผู้เล่นจริงในบทบาทเหล่านั้น ก็ไม่มีความสนใจเป็นพิเศษจาก Medic
  • บอทยืนประจำที่ระหว่างช่วงเตรียมตัวบนแผนที่ Attack/Defense และ Payload -- ยกเว้น Engineer, Sniper, และ Spy ที่เคลื่อนที่ได้อิสระ (บอท Demoman ก็สามารถวาง sticky ล่วงหน้าได้เช่นกัน)
  • บอท Engineer ไม่เคยอัปเกรดหรือ desap สิ่งปลูกสร้างของ Engineer ฝ่ายเดียวกันอื่นๆ เว้นแต่สิ่งปลูกสร้างนั้นบังเอิญอยู่ตรงเส้นทางของเป้าหมาย บางครั้งพวกมันก็... ไม่ซ่อมป้อมตัวเอง แม้จะปลอดภัย
  • บอท Spy ที่ถูกพบเห็นจะเปลี่ยนไปใช้ revolver และถอยหลังแทนที่จะฝักดักแทง
  • บอท Demoman ที่หาป้อมศัตรูเจอ (โดยปกติจากการตายเพราะมันครั้งเดียว) สามารถยิง sticky ลงบนป้อมนั้นจากนอกระยะได้อย่างสมบูรณ์แบบ โค้งข้ามกำแพงและเพดานเมื่อรูปทรงเอื้ออำนวย
  • บอท Sniper ที่หาเป้าไม่เจอหลังจากเล็งกล้องจะใช้เสียง "Negative" หนึ่งในนั้น
  • Medic ฝ่ายเดียวกันจะรักษา Spy ที่ปลอมตัวโดยไม่ลังเล

ปัญหาที่ทราบ / บั๊ก

เอกสารนี้รวบรวมปัญหาค้างคามากมายที่มีมายาวนาน:

  • บอทสามารถพยายามเดินหรือยิงทะลุ prop ที่อยู่กับที่บางชนิดได้
  • เมื่อใดก็ตามที่ผู้เล่น/บอทเปิดหน้ากาก, ปลอมตัว, หรือเปิดเผยตัว บอทที่อยู่ใกล้ๆ จะ "เห็น" และหันไปตอบสนอง -- แม้ว่าเหตุการณ์นั้นจะเกิดขึ้นนอกขอบเขตการมองเห็นจริงของพวกมันก็ตาม ไม่ใช่เสียง; เป็นการข้ามเช็คการมองเห็น
  • นานๆ ครั้ง บอทอาจติดกันทางกายภาพขณะใช้ teleporter ของ Engineer
  • คำสั่งเสียงของบอท (เช่น "Spy!", "Forward!") ไม่แสดงเป็นข้อความแชทเหมือนของผู้เล่น
  • บอท Medic ที่กำลังรักษาใครบางคนอยู่จะไม่หลบกระสุนหรือเก็บ health kit แม้ HP จะต่ำมาก
  • บอทสามารถเคลื่อนที่ต่อไปขณะทำ partner taunt ซึ่งทำลายเอฟเฟกต์ Festive Critical Strike ที่ตั้งใจไว้
  • บอท Medic ที่เพิ่งได้รับความเสียหายมักจะปฏิเสธใช้ Syringe Gun ในระยะ ไกล ชอบใช้ melee (หรือในกรณีที่หายากมาก พยายามตีคุณด้วยลำแสง Medi Gun เอง)
  • บอท Medic ไม่ชดเชยแรงโน้มถ่วงสำหรับการยิง Syringe Gun -- อาจเป็นเพราะอาวุธนี้ไม่ได้ถูกทำเครื่องหมายว่าไม่ใช่ hitscan ในโค้ด AI อย่างถูกต้อง
  • บอท Spy สามารถเห็นและติดตาม Spy ที่ล่องหน (ผู้เล่นหรือ AI) ถ้า Spy นั้นเคยเปิดเผยตัวมาก่อนแล้ว ไม่ว่าระดับฝีมือของบอทที่ติดตามจะเป็นเท่าใด
  • แม้ว่าผู้เล่น-Spy จะปลอมตัวเป็นคลาสของทีมตัวเอง การชนกับศัตรูก็ยังคงเปิดโปงพวกมันอยู่ดี (บอทไม่เคยทำแบบนี้กับตัวเอง เพราะบอทไม่เคยปลอมตัวเป็นทีมตัวเอง)
  • บอทเคารพการปรับสมดุลทีมอัตโนมัติ -- ถ้าคุณพยายามรวมบอทไว้ที่ทีมเดียว คุณต้องใช้ mp_teams_unbalance_limit 0 ก่อน
  • บอท Engineer สามารถเมินเฉยต่อสิ่งปลูกสร้างของตัวเองจนกว่ามันจะถูกทำลาย
  • บอท Heavy บางครั้งพยายามยิง Minigun ขณะที่กระสุนเหลือน้อยมาก ส่วนใหญ่ต่ำกว่าระดับ Hard
  • บอท Medic ของทีมที่แพ้บางครั้งฆ่าตัวตายในช่วง Humiliation เมื่อไม่มีศัตรูอยู่ใกล้ -- สิ่งที่ผู้เล่นจริงไม่สามารถเลียนแบบได้แม้จะพยายาม
  • การตั้งค่าตัวอย่างทีมบนหน้าจอโหลดเป็น BLU ทำให้บอท RED แสดงผลเป็น BLU สำหรับคุณ
  • บอทที่ถืออาวุธ melee บางครั้งปฏิเสธเปลี่ยนอาวุธแม้หลังจากเก็บกระสุนแล้ว
  • หลัง Jungle Inferno, บอทที่สร้างด้วยพารามิเตอร์เฉพาะ (เช่น tf_bot_add 5 pyro blue normal) สามารถตายทันทีใน spawn room ของตัวเอง วิธีแก้: tf_bot_reevaluate_class_in_spawnroom 0 (ต้องใช้ sv_cheats 1)

ชื่อ AI

ชื่อบอทถูกดึงจากกลุ่มคำอ้างอิงถึง TF2, เกมอื่นๆ ของ Valve, และวัฒนธรรมการเขียนโปรแกรม ส่วนใหญ่เป็นเพราะชุมชนขอชื่อเฉพาะบน Steam forums ตัวอย่างจากรายชื่อ: AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, และอีกหลายสิบชื่อในแนวเดียวกัน

นอกจากนี้ยังมีชื่อชุดหนึ่งที่พบใน source build ที่รั่วไหลซึ่งไม่เคยถูกนำไปใช้ในเวอร์ชันจริง ด้วยเหตุผลที่ไม่ชัดเจน -- ส่วนใหญ่เป็นการอ้างอิงถึง Last Dragon และ The Fifth Element เช่น John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh?, และ I'm your huckleberry

คุณสามารถแทนที่ทั้งหมดนี้ได้เอง: tf_bot_add heavyweapons blue "Blu Hoovy" จะสร้างบอท BLU Heavy ชื่อ "Blu Hoovy"


บทที่ II: บอทดั้งเดิม / TFBots -- เจาะลึกระดับฝีมือ

กรอบความคิดดั้งเดิมของ Sigsegv ยังคงใช้ได้: เห็นได้ชัดว่าบอท Expert เล่นเหนือกว่าบอท Easy แต่ Valve ไม่เคยอธิบาย มากแค่ไหน หรือ ทำไม ดังนั้นวิธีเดียวที่จะรู้คืออ่านโค้ด นี่คือทุกกลไกที่ปรับตามฝีมือ

การตั้งค่าความยาก

นอก MvM ความยากถูกควบคุมโดย cvar ตัวเดียว:

tf_bot_difficulty ระดับฝีมือ
0 Easy
1 Normal (ค่าเริ่มต้น)
2 Hard
3 Expert

tf_bot_add ยังรับอาร์กิวเมนต์ความยากได้โดยตรง (easy/normal/hard/expert)

ไฟล์ Pop MvM

ใน Mann vs. Machine แต่ละบล็อกกำเนิด TFBot ใน popfile มีคีย์ Skill แบบไม่บังคับ ไม่มีคีย์หมายถึง Easy ในภารกิจของ Valve: Giant แทบจะเป็น Expert เสมอ, Engineer และ Spy แทบจะเป็น Expert เสมอ, และ Sniper มักจะเป็น Hard (บางครั้ง Expert) ถ้าคุณใช้ EventChangeAttributes (เพิ่มในอัปเดต Two Cities) เพื่อปรับเปลี่ยนบอทระหว่าง wave ตามเหตุการณ์บนแผนที่ ฝีมือบอทเป็นหนึ่งในคุณสมบัติที่คุณสามารถเปลี่ยนได้ทันที

MvM Endless Mode

Endless mode ไม่เคยออกจริง แต่ในนั้น บอทใช้เงินซื้ออัปเกรดเหมือนผู้เล่น -- รวมถึงอัปเกรดเฉพาะบอทที่เพิ่มระดับฝีมือ AI ระหว่างเกม

เอนทิตี bot_generator

เอนทิตีที่ไม่ค่อยมีใครรู้จักและแทบไม่มีเอกสาร เชื่อว่าเคยใช้ในโหมดฝึกซ้อมและอาจใช้ในการพัฒนา MvM ช่วงแรก มันมีอินพุต SetDifficulty สำหรับควบคุมระดับฝีมือ นอกเหนือจากนั้นข้อมูลก็ขาดหายไป -- Valve ไม่เคยบันทึกมันและไม่มีใครทำแผนที่พฤติกรรมของมันอย่างสมบูรณ์

สีเรืองแสงตา

หุ่นยนต์ MvM มีอนุภาคเรืองแสงตาที่เปลี่ยนสีตามระดับฝีมือ -- สัญญาณบอกทางที่ไม่มีใครนอกชุมชนเคยอธิบาย:

ฝีมือ สีตา RGB
Easy/Normal ฟ้า #24b4ff
Hard/Expert เหลือง #fff000

TF2 Heavy bot ในท่ายืนนิ่ง

การมองเห็น: เวลาจดจำ

บอทไม่ตอบสนองทันทีที่อะไรบางอย่างเข้ามาในขอบเขตการมองเห็น -- มีการหน่วงเวลาที่ถูกฮาร์ดโค้ดไว้ก่อนที่ AI ที่เหลือจะรับรู้ถึงภัยคุกคาม:

ฝีมือ เวลาจดจำขั้นต่ำ
Easy 1.00 วินาที
Normal 0.50 วินาที
Hard 0.30 วินาที
Expert 0.20 วินาที

นั่นคือสาเหตุส่วนใหญ่ของ "บอท Easy ดูโง่" ในตัวเลขเดียว -- บอท Easy เล็งไม่ได้แย่กว่าเมื่อมันสังเกตเห็นคุณ มันแค่ใช้เวลานานกว่าห้าเท่าในการสังเกตว่าคุณมีตัวตน

การเล็ง: อัตราการติดตาม

บอทไม่ติดตามคุณอย่างต่อเนื่อง พวกมันสุ่มตัวอย่างตำแหน่งและความเร็วของคุณในช่วงเวลาคงที่และทำนายเส้นตรงจากนั้น:

ฝีมือ ช่วงเวลาคำนวณใหม่ อัตราที่เทียบเท่า
Easy 1.00 วินาที 1x/วินาที
Normal 0.25 วินาที 4x/วินาที
Hard 0.10 วินาที 10x/วินาที
Expert 0.05 วินาที 20x/วินาที

ข้อยกเว้น: บอท Spy ถูกฮาร์ดโค้ดให้ใช้อัตราการติดตามแบบ Normal ไม่ว่าระดับฝีมือจริงของมันจะเป็นเท่าใด -- Expert Spy ยังเล็งเหมือนบอท Normal นอกจากนี้ยังมีวิดีโอสาธิตที่เปรียบเทียบอัตราการติดตามแบบเคียงข้างกันถ้าคุณอยากเห็นความแตกต่างระหว่าง 1x vs 20x ในภาพเคลื่อนไหว

การเล็ง: ฝีมือเฉพาะอาวุธ

บอทไม่เพียงแค่เล็งไปที่จุดศูนย์กลางมวลของคุณ -- พวกมันมีตรรกะต่ออาวุธ บางอย่างก็บั๊กจริงๆ:

Grenade Launcher & Sticky Launcher. ทุกระดับฝีมือชดเชยวิถีโค้ง โดยใช้ค่าคงที่จาก cvar tf_bot_ballistic_elevation_rate เนื่องจากการชดเชยนั้นทำงานเฉพาะกับ ID อาวุธพื้นฐาน อาวุธ projectile ที่เร็วกว่า (Loch-n-Load, อะไรก็ตามที่ปรับความเร็ว projectile) จะไม่ได้รับการปรับวิถีโค้งที่ถูกต้อง และเนื่องจากมันใช้ ID อาวุธโดยเฉพาะ Loose Cannon -- ซึ่งเป็น ID ที่ต่างออกไป -- จึงไม่ได้รับการชดเชยวิถีโค้งเลย

Huntsman. บอท Easy ไม่ชดเชยการตกของลูกธนูและไม่เคยพยายามยิงหัว บอทฝีมือ Normal ชดเชยวิถีโค้ง แต่เล็งที่หัวเฉพาะในระยะ 150 HU บอท Hard/Expert เล็งที่หัวเสมอ

Rocket Launchers. เกิน 150 HU บอทที่ไม่ใช่ Easy เล็งไปที่เท้าของคุณแทนจุดศูนย์กลางมวล เพื่อเพิ่มความเสียหายกระจายและโอกาสกระเด็น knockback ภายใน 150 HU พวกมันเปลี่ยนไปยิงหัว บอท Easy เล็งจุดศูนย์กลางมวลเสมอไม่ว่าระยะเท่าใด สิ่งนี้ถูกล็อกด้วย ID อาวุธเช่นกัน: Direct Hit และ Cow Mangler ไม่ได้รับพฤติกรรมนี้ สมเหตุสมผลสำหรับ Direct Hit (ไม่มี AoE ให้ใช้ประโยชน์); ไม่สมเหตุสมผลเลยสำหรับ Cow Mangler -- ส่วนนี้ของ AI มาก่อนการมีอยู่ของอาวุธนี้และไม่เคยถูกปรับปรุง

Sniper Rifles. Easy เล็งที่ลำตัว Normal เล็งประมาณ 33% จากลำตัวถึงหัว Hard/Expert เล็งที่หัวโดยตรง มีความสำคัญน้อยกว่าใน MvM ที่หัวของบอทไม่ได้รับโบนัสความเสียหายอยู่แล้ว

การได้ยิน: ความไวต่อการยิงเงียบ

ทุกกระสุนปืนแจ้งเตือนบอทใกล้เคียงถึงตำแหน่งของผู้ยิง แม้ผ่านกำแพง ไกลถึง 3000 HU ด้วยโอกาสสังเกต 100% (tf_bot_notice_gunfire_range) แต่อาวุธบางประเภทถูกทำเครื่องหมายว่า " stealth" -- ได้ยินเฉพาะในระยะ 500 HU (tf_bot_notice_quiet_gunfire_range) และถึงอย่างนั้นก็มีโอกาสขึ้นอยู่กับฝีมือ:

ฝีมือ โอกาสสังเกตการยิงเงียบ
Easy 10%
Normal 30%
Hard 60%
Expert 90%

ความน่าจะเป็นนั้นจะลดลงครึ่งหนึ่งถ้ามีการยิง ดัง ได้ยินใน 3 วินาทีที่ผ่านมา -- เสียงดังกลบเสียงเบา

รายชื่อ ID อาวุธ stealth ไม่ได้รับการอัปเดตตั้งแต่ธันวาคม 2010 อะไรก็ตามที่เพิ่มหลังจากวันนั้นโดยใช้ ID อาวุธใหม่จะถูกปฏิบัติเป็นเสียงดังโดยค่าเริ่มต้น ไม่ว่ามันควรจะเงียบแค่ไหนในทางตรรกะ เว้นแต่มันบังเอิญใช้ ID เดิมซ้ำ ตัวอย่าง:

ID อาวุธ ครอบคลุม
TF_WEAPON_KNIFE มีด Spy ทั้งหมด
TF_WEAPON_FISTS หมัดเฉพาะ Heavy (หมัดหลายคลาสของเขาคือ TF_WEAPON_FIREAXE)
TF_WEAPON_PDA เชื่อว่าไม่ได้ใช้โดยตรง
TF_WEAPON_PDA_ENGINEER_BUILD Construction PDA ของ Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY Destruction PDA ของ Engineer
TF_WEAPON_PDA_SPY ชุดปลอมตัวของ Spy
TF_WEAPON_BUILDER ชุดเครื่องมือ Engineer/Sapper ของ Spy
TF_WEAPON_MEDIGUN Medi Gun ทั้งหมด
TF_WEAPON_DISPENSER น่าจะไม่ได้ใช้ (Dispenser เป็นสิ่งของ ไม่ใช่อาวุธ)
TF_WEAPON_INVIS นาฬิการาล่องหนของ Spy ทั้งหมด
TF_WEAPON_FLAREGUN ปืน flare ของ Pyro ทั้งหมด ยกเว้น Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (ไม่ใช่ Mad Milk -- ID แยก, ไม่ stealth)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mòr, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

ตัวอย่างคลาสสิกของรายการที่เน่า: Manmelter ได้ ID ของตัวเอง (TF_WEAPON_RAYGUN_REVENGE) เพิ่มหลังจากรายการ stealth ถูกหยุดนิ่ง -- ดังนั้นมันจึงถูกปฏิบัติเป็นเสียงดัง ทั้งที่มันเป็น flare gun ในทุกความหมายที่ใช้งานได้จริง Scorch Shot ที่ออกทีหลังกว่า ใช้ ID TF_WEAPON_FLAREGUN เดิมซ้ำ ดังนั้นจึงยังถือเป็น stealth ไร้สาระ แต่นั่นคือโค้ด

กลยุทธ์: การจัดลำดับความสำคัญของภัยคุกคาม

เมื่อมีศัตรูหลายตัวปรากฏพร้อมกัน บอทจะชั่งน้ำหนักระยะทาง, ว่ากำลังถูกยิงหรือไม่, และ -- สูงกว่า Easy -- ว่าภัยคุกคามหลักกำลังถูกรักษาอยู่หรือไม่:

ฝีมือ เล็งไปที่ผู้รักษาแทน?
Easy ไม่
Normal โอกาส 50%
Hard ใช่
Expert ใช่

ศัตรูที่เกิน 500 HU จะถูกลดลำดับความสำคัญเป็นไม่เร่งด่วน ข้อยกเว้น: บอท Hard/Expert มักจะถือว่า Medic และ Engineer ที่อยู่ไกลเป็นภัยคุกคามเร่งด่วนเสมอ และ Sniper ศัตรูที่เล็งมาทางคุณคร่าวๆ จะถูกถือว่าเร่งด่วนเสมอไม่ว่าระยะทางและฝีมือ

ฝีมือ Medic/Engineer ที่อยู่ไกล/Sniper ที่เล็ง = ภัยคุกคามเร่งด่วน?
Easy/Normal ไม่
Hard/Expert ใช่

การตรวจ Sniper นั้นมีประวัติที่สนุกจริงๆ งานเขียนดั้งเดิมของ Sigsegv สันนิษฐานว่าเกมต้องการให้ dot product ระหว่างเวกเตอร์เล็งของ sniper กับตำแหน่งสัมพัทธ์ของบอทเป็น ศูนย์พอดี -- การเปรียบเทียบที่แม่นยำจนแทบจะไม่ถูกเรียกใช้ในการคำนวณ float เลย ทำให้ฟีเจอร์ทั้งหมดกลายเป็น dead code โดยพฤติการณ์ การแก้ไขที่ออกมาในภายหลัง (ยกเครดิตให้การดีคอมไพล์ Hex-Rays ที่สะอาดกว่า) แสดงให้เห็นว่าการตรวจสอบจริงคือ dot product > 0: Sniper ที่หันหน้าใดๆ ตั้งแต่ตรงมาหาคุณจนถึงตั้งฉากกับคุณจะถูกนับเป็นภัยคุกคามเร่งด่วน อะไรก็ตามตั้งแต่ตั้งฉากจนถึงหันหลังให้ไม่นับ การอ่านผิดดั้งเดิมมาจากการดีคอมไพล์การเปรียบเทียบ SSE float ที่ไม่ดี -- reverse-engineering ไบนารี AAA ไม่ใช่ศาสตร์ที่แม่นยำ

การเคลื่อนที่: การหลบ

บอท Easy ไม่เคยหลบ หยุดทันที บอท Normal ขึ้นไปหลบซ้าย/ขวา (ซ้าย 33%, ขวา 33%, ไม่ทำอะไร 33%, ถ่วงน้ำหนักตามช่องว่างที่ตรวจพบ) เมื่อพวกมันถืออาวุธต่อสู้, ได้เห็นศัตรูใน 3 วินาทีที่ผ่านมา, และศัตรูนั้นมีแนวการมองเห็นมายังพวกมัน

พวกมันจะ ไม่ หลบถ้ามีเงื่อนไขเหล่านี้: มีแอตทริบิวต์ DisableDodge, พฤติกรรมปัจจุบันบอกให้รีบ, กำลังอยู่ในสภาพไร้กระสุน (über ใดๆ), กำลัง mid-taunt/provocation, เล่นเป็น Engineer, ล่องหนหรือปลอมตัวเป็น Spy, กำลังเล็งกล้องเป็น Sniper หรือกำลังหมุนปืนเป็น Heavy, หรือกำลังกลางชักธนู Huntsman

การเคลื่อนที่: หลีกเลี่ยงการชนศัตรู

สูงกว่า Normal บอทจะพยายามไม่ชนศัตรูขณะเคลื่อนที่โดยเฉพาะ:

ฝีมือ หลีกเลี่ยงการชนศัตรู?
Easy ไม่
Normal ไม่
Hard ใช่
Expert ใช่

ในทางปฏิบัติสิ่งนี้สำคัญกับบอท Spy เท่านั้น -- การหลีกเลี่ยงการชนที่น่าอึดอัดกับผู้เล่นศัตรูคือสิ่งที่ทำให้ disguise แตกพอดี

Pyro: ความชำนาญในการเป่า

Airblast มีจุดประสงค์สองอย่าง: สะท้อน projectile (PvP และ MvM) และผลักศัตรูที่อยู่ใกล้ตกขอบ (PvP เท่านั้น) ไม่ว่าบอทจะกดใช้งานจริงในโอกาสที่เหมาะสมหรือไม่นั้นคือการพลิกเหรียญตามฝีมือ:

ฝีมือ โอกาสในการใช้ Airblast
Easy 0%
Normal 50%
Hard 90%
Expert 100%

บอท Pyro Easy ไม่สามารถ airblast ได้เลยตามตัวอักษร -- การสุ่มถูกฮาร์ดโค้ดให้ไม่สำเร็จ ไม่ใช่แค่ "นานๆ ครั้ง"

Spy: ประสิทธิภาพการปลอมตัว

สองแกนแยกกันปรับตามฝีมือ การเลือก disguise:

ฝีมือ วิธีการปลอมตัว
Easy/Normal คลาสสุ่ม โดยไม่สนใจว่าทีมศัตรูกำลังเล่นอะไรอยู่
Hard/Expert เลือกผู้เล่นศัตรูจริงและลอกคลาสของพวกเขาเป๊ะๆ

การ แสดง เป็น disguise:

ฝีมือ พฤติกรรมขณะปลอมตัว/ล่องหน
Easy/Normal จ้องผู้เล่นศัตรูเมื่อเห็นพวกเขา (น่าสงสัย)
Hard/Expert หลีกเลี่ยงการสบตาโดยเจตนา (น่าเชื่อถือกว่า)

Spy: ความก้าวร้าวในการแทงหลัง

ในระยะไกล (สูงถึง 300 HU, tf_bot_spy_knife_range), บอท Spy จะลงมือแทงหลังต่อเมื่อมันเห็นเหยื่อและหลังของเหยื่อหันออกอย่างน้อยบางส่วน ฝีมือกำหนดว่ามุมที่เบี่ยงจากศูนย์กลางนั้นสามารถเบี่ยงได้เท่าใด:

ฝีมือ ค่าความคลาดเคลื่อนของมุม
Easy พยายามแทงแม้คุณหันหน้าเข้าหามันโดยตรง
Normal ±45° จากหลังของคุณ
Hard ±78° จากหลังของคุณ
Expert ±90° จากหลังของคุณ (ส่วนโค้ง 180° ด้านหลังเต็ม)

บอท Spy Easy ฆ่าตัวตายในทางปฏิบัติ -- พวกมันจะพยายามแทงคนที่จ้องมองพวกมันอยู่ ข้อยกเว้น: ใน Mann vs. Machine บอท Spy ทุกตัวถูกบังคับให้ใช้ข้อจำกัดมุมแบบ Normal ไม่ว่าระดับฝีมือจริง

ยุทธวิธี: การเลือกอาวุธ

ทำงานเฉพาะสูงกว่า Easy และส่วนใหญ่ไม่เกี่ยวข้องใน MvM เนื่องจากบอทที่นั่นมักมีข้อจำกัดอาวุธที่เข้มงวด:

  • Scout: สลับไปใช้อาวุธรองเมื่อแม็กกาซีนของอาวุธหลักหมด
  • Soldier: สลับไปใช้อาวุธรองเมื่อแม็กหมด และ เป้าหมายอยู่ใกล้กว่า 500 HU
  • Sniper: สลับไปใช้อาวุธรองสำหรับเป้าหมายที่ใกล้กว่า 750 HU
  • Pyro: สลับไปใช้อาวุธรองสำหรับเป้าหมายที่ไกลกว่า 750 HU เว้นแต่เป้าหมายนั้นจะเป็น Soldier หรือ Demoman

ยุทธวิธี: การรีโหลดหลังที่กำบัง

ไม่ได้ใช้ใน MvM ถ้าพฤติกรรมปัจจุบันของบอทไม่ได้บอกให้ถอย, แม็กกาซีนหลักหมด, และไม่ได้อยู่ในสภาพ über บอทที่มีฝีมือสูงกว่าจะถอยชั่วคราวไปยังที่กำบังเพื่อรีโหลดแทนที่จะกดยิงปืนที่ไม่มีกระสุนใส่คุณ:

ฝีมือ ถอยเพื่อรีโหลด?
Easy ไม่
Normal ไม่
Hard ใช่
Expert ใช่

โหมด CP: การเดินเตร่ของผู้ป้องกัน

ไม่ได้ใช้ใน MvM เมื่อป้องกัน control point บอทที่มีฝีมือสูงกว่ามีแนวโน้มที่จะออกจากจุดเพื่อล่าศพ ("search and destroy") แต่จะต่อเมื่อมีเวลาเหลือพอสมควรใน tf_bot_defense_must_defend_time:

ฝีมือ โอกาสในการเดินเตร่
Easy 10%
Normal 50%
Hard 75%
Expert 90%

โหมด CP: การขัดขวางการยึด

ไม่ได้ใช้ใน MvM บอทที่ป้องกันซึ่งขัดขวางการพยายามยึดของศัตรู:

ฝีมือ จะพยายามขัดขวางการยึดหรือไม่?
Easy ไม่
Normal โอกาส 50%
Hard ใช่
Expert ใช่

ตารางสรุปทั้งหมด

ลักษณะ Easy Normal Hard Expert หมายเหตุ
การมองเห็น: เวลาจดจำ 1.00วินาที 0.50วินาที 0.30วินาที 0.20วินาที
การเล็ง: อัตราติดตาม 1x/วินาที 4x/วินาที 10x/วินาที 20x/วินาที Spy ใช้ Normal เสมอ
ชดเชยวิถี grenade/sticky ใช่ ใช่ ใช่ ใช่ ยกเว้น Loose Cannon
ชดเชยวิถีแนวตั้ง Huntsman ไม่ ใช่ ใช่ ใช่
ยิงหัว Huntsman ไม่ <150 HU ใช่ ใช่
ยิงเท้า Rocket Launcher ไม่ ใช่ ใช่ ใช่ ยกเว้น Direct Hit & Cow Mangler
จุดเล็ง Sniper Rifle ลำตัว ~33% ถึงหัว หัว หัว
โอกาสสังเกตการยิงเงียบ 10% 30% 60% 90% ลดลงครึ่งหนึ่งถ้าถูกกลบด้วยเสียงดัง
เล็งที่ผู้รักษา ไม่ 50% ใช่ ใช่
Medic/Engineer/Sniper ไกล = ภัยคุกคาม ไม่ ไม่ ใช่ ใช่
การหลบ ไม่ ใช่ ใช่ ใช่ มีรายการข้อยกเว้นยาว
หลีกเลี่ยงการชนศัตรู ไม่ ไม่ ใช่ ใช่ ส่วนใหญ่สำคัญกับ Spy
โอกาสใช้ Airblast 0% 50% 90% 100%
การเลือกคลาสปลอมตัว Spy สุ่ม สุ่ม เลียนแบบศัตรูจริง เลียนแบบศัตรูจริง
การสบตาขณะปลอมตัว Spy จ้อง (ชัดเจน) จ้อง หลบ (น่าเชื่อถือ) หลบ
มุมแทงหลัง Spy ~0° ±45° ±78° ±90° MvM บังคับ Normal
ตรรกะเลือกอาวุธ ไม่ ใช่ ใช่ ใช่ เกี่ยวข้องน้อยใน MvM
รีโหลดหลังที่กำบัง ไม่ ไม่ ใช่ ใช่ ไม่ใช่ใน MvM
การเดินเตร่ผู้ป้องกัน CP 10% 50% 75% 90% ไม่ใช่ใน MvM
การขัดขวางการยึด CP ไม่ 50% ใช่ ใช่ ไม่ใช่ใน MvM

บทสรุป

TF2 Heavy bot กำลังเล็ง minigun

ไม่มีสิ่งใดเลยที่เป็นการเดาผิดของ Valve -- มันเป็นระบบการให้คะแนนและความน่าจะเป็นที่จงใจและกำหนดได้อย่างสมบูรณ์ แค่ไม่เคยถูกเขียนไว้ที่ไหนอย่างเป็นทางการ สองสามสิ่งที่ควรจำ:

  1. "ฝีมือ" คือกลุ่มของปุ่มปรับอิสระ ไม่ใช่ตัวคูณรวมเพียงตัวเดียว เวลาตอบสนอง, อัตราการเล็ง, และพฤติกรรมทางยุทธวิธีทุกอย่างปรับแยกกัน และบางอย่าง (อัตราการติดตามของ Spy, มุมแทงหลัง MvM) ถูกฮาร์ดโค้ดทับไม่ว่าระดับฝีมือจะเป็นเท่าใด
  2. บางอย่างนี่บั๊กจริงๆ ไม่ใช่แค่เก่า รายชื่ออาวุธ stealth ที่ถูกหยุดนิ่งตั้งแต่ปี 2010, Cow Mangler ที่ขาดตรรกะยิงเท้าอย่างไม่มีเหตุผล, การเช็ค dot-product ของ Sniper ที่ใช้เวลาหลายปีกว่าจะถูกดีคอมไพล์อย่างถูกต้อง -- โค้ด AI ของ Valve มีรอยแผลเป็นเหมือนโค้ดเบสอายุ 17 ปีอื่นๆ
  3. คุณสามารถใช้ทั้งหมดนี้ได้ รู้ว่าบอท Sniper จะไม่ยิงหัวคุณในโหมด Normal, ว่า Pyro Easy ไม่สามารถ airblast จรวดของคุณกลับมาได้ตามตัวอักษร, ว่า Spy Easy จะพยายามแทงคุณต่อหน้าต่อตา มันไม่ใช่โชค มันคือเอกสารข้อมูล

ขอบคุณอย่างมากถึง sigsegv สำหรับการดำดิ่งสู่โค้ดดั้งเดิมที่ทำให้สิ่งนี้เป็นไปได้, ถึง TF2 Wiki สำหรับเอกสารพื้นฐานเกี่ยวกับคำสั่งบอทและการรองรับแผนที่, และถึงทุกคนในชุมชนที่ยังคงยุ่งเกี่ยวกับ AI บอทอายุ 17 ปีเพื่อค้นหาว่ามันทำสิ่งที่มันทำเพราะอะไร

Related Articles