GitHub avatar

Fox's Blog

TF2 Bots Aren't Random: I Rediscovered Every Difficulty Parameter

Vision, aim, backstab angles, 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 with a rocket launcher

Every TF2 player has said it at least once: "that bot is cheating." Or the opposite: "why is that Easy bot just standing there eating rockets." Nobody really knows what "Easy," "Normal," "Hard," and "Expert" 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 base work done by sigsegv, who really dug through the game's decompiled code) put together a full research document on TFBot behavior. Every mechanic, every known bug, every hardcoded probability. This article is the full report, not the condensed version. Grab a Bonk, it's going to be long.


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, play the objective, work without sv_cheats, and trigger achievements like a real player.
  • Puppet Bots: zero AI, unable to move or act on their own. They exist only to be manually controlled -- a player can force them to follow, aim, and shoot. Mainly used for testing or for cinematic screenshots and videos. Spawning them requires sv_cheats 1, which also disables achievements for the session.

This article is entirely about the first kind.

What you can (more or less) tell AI bots to do

TFBots aren't directly controllable, but you can nudge them into doing certain things:

  • Aim at any bot (ally or enemy) with your crosshair and it will taunt you if you use the right voice commands.
  • An allied Medic bot heals you if you use the "Medic!" voice command.
  • If a Medic bot healing you has an UberCharge ready, saying "Go go go!" or "Activate charge!" makes it pop the charge immediately.
  • A Medic bot with a ready charge auto-pops it as soon as either it or its heal target takes serious damage, no voice command needed.
  • Bots spontaneously perform duo taunts (High Five) or group taunts (Conga) with nearby teammates.

Making bots work on unsupported maps

Bots depend on a navigation mesh to know where they're allowed to walk, and most community maps don't ship 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, manually fix bad nav data with nav_edit 1
  5. Reload or restart the server (skipping this step disables achievements)
  6. tf_bot_add <number> to spawn the bots

Warning: editing 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 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-like behavior but barely use grapples or powerups. If a map has no objective the bot AI recognizes but has a spawn room entity, setting tf_bot_offense_must_push_time 0 lets the bots fight anyway.

(Source for this section: the official TF2 wiki Bots page.)

Current status, map by map

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

PLR maps are a lost cause: bots can't cross the barriers on Hightower and get stuck in corners, and on all other PLR maps they just... have a dance party instead of playing. Maybe it'll get fixed someday, maybe it'll stay that way.

General bot behavior

A grab bag of things every bot does regardless of level:

  • Bots only use stock loadouts (a plugin can force non-stock weapons on them, but vanilla bots never pick their own).
  • Easy bots barely use their secondary. Higher difficulties switch to secondary as soon as the primary mag is empty, or to compensate for distance.
  • Bots ignore advanced movement techniques: no rocket jumps, no building relocations.
  • After a kill, a bot may taunt, even under fire, unless it's carrying the enemy intel, and that rule applies in MvM too.
  • Disguised Spy bots (player or AI) are correctly ignored by other bots: until they touch an enemy, sap something, shoot, or go invisible near one. Once "found out," that specific bot/player is remembered as a Spy until it changes disguise while cloaked, dies, or feigns death with the Dead Ringer.
  • Pyro bots use Compression Blast liberally from Normal up.
  • Medic bots prioritize healing everyone except Snipers (and, to a lesser extent, Engineers), even if you spam "Medic!" as one.
  • Medic bots gravitate toward Heavies, Soldiers, Demomen, and Pyros: specifically when a human plays those classes. That attention follows a human's presence in those roles.
  • Bots hold position during setup on Attack/Defense and Payload maps, except Engineers, Snipers, and Spies, who move freely (Demomen bots are also allowed to pre-place stickies).
  • Engineer bots never upgrade or disable another allied Engineer's buildings, unless that building sits in their target's path. They sometimes just don't repair their own sentry, even when it seems obvious.
  • Spotted Spy bots switch to their revolver and back off instead of forcing a knife stab.
  • Demomen bots that located a sentry (usually by dying to it once) can perfectly arc stickies onto it from outside its range, through walls and ceilings when geometry allows.
  • Sniper bots that find no target after aiming use one of the "Negatives." voice lines.
  • Allied Medics heal a disguised Spy without hesitation.

Known issues / bugs

The document lists a good number of long-standing quirks:

  • Bots may try to walk or shoot through certain static props.
  • Every time a player/bot undisguises, 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-test bypass.
  • Rarely, bots can get physically stuck together using an Engineer teleporter.
  • Bot voice commands (e.g. "Spy!", "Go!") don't show as text in chat like players' do.
  • A Medic bot actively healing someone won't dodge incoming fire or grab health kits, even at critical HP.
  • Bots may keep moving during a duo taunt, breaking the intended Festive Critical Strike effect.
  • Recently damaged Medic bots often refuse to use the Syringe Gun at range, preferring melee (or, in very rare cases, trying to poke you with the Medi Gun beam itself).
  • Medic bots don't compensate for gravity on Syringe Gun shots: probably because the weapon isn't correctly flagged as non-hitscan in the AI code.
  • Spy bots can see and follow an invisible Spy (player or AI) if that Spy was already found out once, regardless of the following bot's skill level.
  • Even if a player-Spy disguises as a class on his own team, bumping an enemy still undisguises him (bots never do that to themselves, since bots never disguise as their own team).
  • Bots respect team autobalance: if you try cramming bots on one side, use mp_teams_unbalance_limit 0 first.
  • Engineer bots can outright ignore their own buildings until they get destroyed.
  • Heavy bots sometimes try firing the Minigun while out of ammo, especially below Hard.
  • Losing-team Medic bots occasionally suicide during Humiliation when no enemy is near -- something a human player can't reproduce even by trying.
  • Setting your team preview to BLU in the loading screen makes RED bots visually render as BLU to you.
  • Bots with a melee weapon out sometimes refuse to switch weapons even after picking up ammo.
  • After Jungle Inferno, bots spawned with explicit params (e.g. tf_bot_add 5 pyro blue normal) can instantly die in their own spawn room. Fix: tf_bot_reevaluate_class_in_spawnroom 0 (requires sv_cheats 1).

AI names

Bot names come from a big pool of TF2 references, other Valve games, and programming culture references, largely because the community kept requesting specific ones on the Steam forums. A sample from 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 the same vein.

There's also a batch of names found in a leaked source build that never shipped to 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 all of that yourself: tf_bot_add heavyweapons blue "Blu Hoovy" spawns a BLU Heavy named "Blu Hoovy."


Chapter II: The Original Bots / TFBots -- Diving Into Skill Levels

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

Setting difficulty

Outside MvM, difficulty is controlled by a cvar:

tf_bot_difficulty Difficulty 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 spawn block in the popfile has an optional Skill key. A missing key means Easy. In Valve missions: Giants are almost always Expert, Engineers and Spies are almost always Expert, and Snipers are usually Hard (occasionally Expert). If you use EventChangeAttributes (added in the Two Cities update) to dynamically alter bots mid-wave on map events, bot skill is one of the properties you can change on the fly.

Endless MvM mode

Endless mode was never officially shipped, but in it, bots spend their money on upgrades like players, including one bot-exclusive upgrade raising their in-game AI skill level.

The bot_generator entity

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

Eye glow color

MvM robots have an eye-glow particle changing color with skill level, a visual indicator nobody outside the community ever explained:

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

TF2 Heavy bot in idle position

Vision: recognition time

A bot doesn't react instantly when 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 the bulk of the "Easy bots look dumb" effect in a single number: an Easy bot doesn't aim worse once it's noticed you, it just takes five times longer to notice you exist.

Aim: tracking 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 Recalc interval Equivalent 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

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

Aim: weapon-specific skill

Bots don't just aim at your center of mass: they have per-weapon logic, sometimes really buggy:

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

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

Rocket Launcher. Beyond 150 HU, non-Easy bots aim at your feet instead of center of mass, maximizing splash and knockback odds. Under 150 HU, they switch to headshots. Easy bots always aim center of mass whatever the distance. It's also locked by weapon ID: the Direct Hit and Cow Mangler don't inherit that behavior. Makes sense for the Direct Hit (no splash to exploit); zero sense for the Cow Mangler: that part of the AI predates the weapon's existence and simply never got revisited.

Sniper Rifles. Easy aims at the body. Normal aims about 33% up from body toward head. Hard/Expert aim straight at the head. Less important in MvM, where bot headshots don't get the damage bonus anyway.

Hearing: quiet gunfire sensitivity

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

Skill Chance of noticing quiet gunfire
Easy 10%
Normal 30%
Hard 60%
Expert 90%

That probability halves if a loud shot was heard in the last 3 seconds: loud sounds mask quiet ones.

The quiet-weapon ID list hasn't been updated since December 2010. Any later addition using a new weapon ID is treated as loud by default, no matter how logically quiet it should be, unless it reuses 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 Presumably unused directly
TF_WEAPON_PDA_ENGINEER_BUILD Engineer build PDA
TF_WEAPON_PDA_ENGINEER_DESTROY Engineer destroy PDA
TF_WEAPON_PDA_SPY Spy disguise kit
TF_WEAPON_BUILDER Spy/Engineer/Sapper toolkits
TF_WEAPON_MEDIGUN All Medi Guns
TF_WEAPON_DISPENSER Probably unused (Dispensers are objects, not weapons)
TF_WEAPON_INVIS All Spy invis 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 ID, non-quiet)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

The classic example of the rotting list: the Manmelter got its own ID (TF_WEAPON_RAYGUN_REVENGE), added after the quiet-weapons list froze, 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 so still counts as quiet. Insane, but that's the code.

Strategy: threat prioritization

When several enemies are visible at once, bots weight distance, whether they're being shot at, and, above Easy, whether the main threat is being healed:

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

Enemies beyond 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 roughly aiming your way is always treated as immediate whatever the distance and skill.

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

That Sniper check has a story I still love telling. 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 float math, making the whole feature effectively dead code. A later-published fix (credit to a cleaner Hex-Rays decompile) showed the actual check is dot product > 0: any Sniper facing from straight at you to perpendicular counts as an immediate threat; anything from perpendicular to facing away doesn't. The original misread came from a bad decompile of an SSE float comparison. Reverse-engineering a AAA binary stays an approximate exercise.

Movement: dodging

Easy bots never dodge, period. Normal+ bots dodge left/right (33% left, 33% right, 33% do nothing, weighted against detected holes) when holding a combat weapon, having seen an enemy in the last 3 seconds, and that enemy having line of sight on them.

They will not dodge if any of these apply: DisableDodge attribute set, current behavior says hurry, currently invulnerable (any uber), mid-taunt/provocation, playing Engineer, cloaked or disguised as Spy, scoped as Sniper or spun up as Heavy, or charging the Huntsman.

Movement: avoiding bumping enemies

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

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

In practice, that matters only 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 does two things: reflecting projectiles (PvP and MvM) and pushing enemies near ledges (PvP only). Whether the bot 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 actually runs
Hard/Expert Picks a real enemy player and copies their exact class

Behavior in disguise:

Skill Disguised/invisible behavior
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 partly turned. Skill determines how off-center that back angle can be:

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

Easy Spy bots are functionally suicidal: they'll try knifing someone staring them straight in the eyes. Exception: in Mann vs. Machine, every Spy bot is forced to the Normal angle constraint whatever its actual skill level.

Tactics: weapon selection

That logic only concerns levels above Easy, with reduced interest in MvM since bots there usually have strict weapon restrictions:

  • Scout: switches to secondary when primary mag is empty.
  • Soldier: switches to secondary when mag is empty and the target is under 500 HU.
  • Sniper: switches to secondary for targets under 750 HU.
  • Pyro: switches to secondary for targets over 750 HU, unless that target is a Soldier or Demoman.

Tactics: reloading under cover

Logic absent from MvM. If the bot's current behavior doesn't tell it to retreat, its primary mag is empty, and it stays vulnerable without uber, higher-level bots temporarily pull back to cover to reload instead of clicking an empty gun in your face:

Skill Pulls back to reload?
Easy No
Normal No
Hard Yes
Expert Yes

CP mode: defender roaming

Logic absent from MvM. When defending a control point, higher-level bots are likelier to leave the point to hunt kills ("search and destroy"), but only with decent time left on tf_bot_defense_must_defend_time:

Skill Roam chance
Easy 10%
Normal 50%
Hard 75%
Expert 90%

CP mode: capture blocking

Logic absent from MvM. Defender bots contesting an enemy capture attempt:

Skill Will try blocking 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: tracking 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% toward head Head Head
Noticing quiet gunfire chance 10% 30% 60% 90% Halved if masked by loud fire
Aim at healer No 50% Yes Yes
Distant Medic/Engineer/aiming Sniper = immediate No No Yes Yes
Dodge No Yes Yes Yes Long exception list
Avoid bumping enemies No No Yes Yes Mostly matters for Spy
Airblast trigger chance 0% 50% 90% 100%
Spy disguise class choice Random Random Matches a real enemy Matches a real enemy
Spy eye contact in disguise 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
Reload under cover No No Yes Yes Not in MvM
CP defender roaming 10% 50% 75% 90% Not in MvM
CP capture blocking No 50% Yes Yes Not in MvM

Conclusion

TF2 Heavy bot aiming with a minigun

All of that reflects a deliberate Valve system: fully deterministic scores and probabilities, just never officially documented. Here are the points I take away after that dive:

  1. "Skill" is a set of independent sliders, not a global multiplier. Reaction time, aim cadence, and each tactical behavior scale separately, and some (Spy tracking rate, MvM backstab angle) have hardcoded overrides whatever the level.
  2. Some of it is genuinely buggy, not just old. The quiet-weapons list frozen since 2010, the Cow Mangler with no foot-shot logic for no good reason, the Sniper dot-product check that took years to decompile correctly: Valve's bot AI code has scars like any 17-year-old codebase.
  3. You can use all of that. Know that a Sniper bot won't headshot you on Normal, that an Easy Pyro literally can't reflect your rocket, that an Easy Spy will try knifing you face to face. That's not luck. It's a spec sheet.

Huge thanks to sigsegv for the original code dive that made most of this possible, to the TF2 wiki for the base bot-command and map-support docs, and to everyone in the community still tinkering with 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 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. 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 que ça restera en l'état.

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 ignorent les techniques de mouvement avancées : aucun rocket jump, aucune 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 quand un humain joue ces classes. Cette attention suit la présence d'un humain dans ces rôles.
  • 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. L'absence de clé correspond au niveau 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 étonnante que j'aime toujours raconter. 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 reste un exercice approximatif.

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

Cette logique concerne uniquement les niveaux au-dessus de Facile, avec un intérêt réduit 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

Logique absente du MvM. Si le comportement actuel du bot ne lui dit pas de battre en retraite, que son chargeur principal est vide et qu'il reste vulnérable sans uber, les bots de niveau supérieur se retirent 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

Logique absente du 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

Logique absente du 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

Tout cela reflète un système délibéré de Valve : scores et probabilités entièrement déterministes, simplement jamais documentés officiellement. Voici les points que je retiens après cette plongée :

  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 机器人(TFBot):真 AI,和 Valve 给 Left 4 Dead 用的 PlayerBot/Infected 同框架。随机选职业,打目标,不用 sv_cheats,像真玩家一样触发成就。
  • 木偶机器人:零 AI,自己不会动不会打。只给人手动遥控用,玩家让它跟随、瞄准、开火。主要给测试、截图、拍片。刷出来要 sv_cheats 1,这 session 成就也关了。

这篇只讲第一种。

AI 机器人能(差不多)指挥动什么

TFBot 不能直接控制,但能哄着干点事:

  • 准星指着任何机器人(友军敌军都行),用对的语音命令它会嘲讽你。
  • 友军医生机器人,你喊"Medic!"它给你奶。
  • 奶你的医生有满 Uber,你喊"Go go go!"或"开冲!"它立刻开。不用语音也行。
  • 有满 Uber 的医生,自己或奶的人掉血狠了,不用喊自动开。
  • 机器人和近距离队友自发双人嘲讽(High Five)或组嘲(Conga)。

让机器人在没导航的图上跑

机器人走路靠导航网格,没导航的社区图它们寸步难行。强制办法:

  1. sv_cheats 1
  2. nav_generate,建初始导航网格,进度打控制台
  3. 等游戏算完路
  4. 可选用 nav_edit 1 手修烂导航数据
  5. 重载或重启服务器(不做这步成就关着)
  6. tf_bot_add <数量> 刷机器人

警告: 服务器上有活跃机器人时改导航可能直接崩盘。网格建好以后不用重建:以后直接 tf_bot_add 加人。

自生成网格在占点、山丘之王、推车、夺旗图上最好用。Mannpower 图机器人默认按夺旗打,钩子和加成基本不用。图上没机器人认识的目标、但有出生室实体,把 tf_bot_offense_must_push_time 置 0,机器人照样打。

(这节来源:TF2 官方 wiki 机器人页。)

各图现状,一个个来

Hatless 更新后各职业全修好了,包括历史上 bug 堆成山的间谍。机器人大多数官方 KOTH 图正常,部分推车图正常,Dustbowl/Gorge 攻防和夺旗/Mann Manor 正常。后两种不能直接 tf_bot_add 刷。没支持的图(上面 nav_generate 流程走一遍)能跑,但装真人差很多。

PLR 图没救:Hightower 机器人过不了栅栏卡角落,别的所有 PLR 图它们只……开蹦迪派对不打。以后修不修随缘吧。

机器人通用行为

所有难度共有的大杂烩:

  • 机器人只用默认配置(插件能硬塞非标武器,vanilla 机器人自己不换)。
  • 简单机器人基本不用副武器。高难度主弹夹打空切副,或按距离切。
  • 机器人不用高级身法:不火箭跳,不搬建筑。
  • 杀完人机器人可能嘲讽,枪林弹雨也嘲,除非抱着敌方情报,MvM 也一样。
  • 伪装间谍(玩家或 AI)别的机器人正确无视:直到它摸人、炸东西、开枪、近处隐身。一旦"识破",这个具体机器人/玩家记成间谍,直到它隐身换装、死了、或 Dead Ringer 装死。
  • 火焰兵普通起用压缩气爆随便吹。
  • 医生奶人优先级:除了狙击手(工程师也往后稍)谁都奶,哪怕你玩狙击手刷"Medic!"。
  • 医生往人类玩的重装、士兵、爆破、火焰兵身边凑:专盯人类玩这些职业。这个跟随看人类面子。
  • 攻防和推车准备时间机器人原地站:工程师、狙击、间谍随便走(爆破兵也允许预埋粘弹)。
  • 工程师机器人不升级不拆友军工程师的建筑,除非挡它目标路。有时连自己炮都不修,看着急死。
  • 识破的间谍机器人切左轮往后退,不硬拼刀。
  • 哪里死的在哪记住的爆破兵,能隔着掩体抛物线把粘弹完美扔进哨兵射程外,穿墙穿天花板看几何。
  • 找不到目标瞄半天的狙击机器人来句"Negatives."语音。
  • 友军医生奶伪装间谍不带犹豫。

已知问题 / bug

文档列了堆陈年怪事:

  • 机器人能试着穿某些静态道具走路开枪。
  • 玩家/机器人每次掏枪、伪装、现形,附近机器人"看"见了回头反应:哪怕事件发生在真实视野外。不靠声音,是视野检测的绕过。
  • 极少数机器人挤着过工程师传送门能互相卡死。
  • 机器人语音命令(如"Spy!"、"冲!")不像玩家一样打字幕。
  • 奶人的医生机器人不躲子弹,残血不捡医疗包。
  • 双人嘲讽进行中机器人能继续移动,Festive Critical Strike 预期效果没了。
  • 刚挨打的医生经常远程掏针枪不用,非贴脸(极少数还拿医疗枪光束捅你)。
  • 医生不给针枪弹道补偿重力:大概率代码 AI 里这武器没标非 hitscan。
  • 间谍机器人能看见跟住隐身间谍(玩家或 AI),只要这间谍被识破过一次,跟的人什么难度都行。
  • 玩家间谍哪怕伪装成本队职业,撞敌人一下就现形(机器人自己从不伪装成本队,所以它们没这事)。
  • 机器人守队伍自动平衡:想一边堆人,先 mp_teams_unbalance_limit 0。
  • 工程师机器人能彻底无视自己建筑直到被拆。
  • 困难以下重装有时刻着 Minigun 空枪扣,明明没子弹。
  • 输的一方医生在羞辱阶段附近没敌人时偶尔自杀,人类玩家想学都学不来。
  • 加载界面队伍预览选 BLU,RED 机器人你看着像蓝的。
  • 掏近战的机器人捡了子弹有时不切枪。
  • Jungle Inferno 之后带显式参数刷的机器人(如 tf_bot_add 5 pyro bleu 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,几十个同味。

还有批泄露源码 build 里有、正式版没发的,原因不明:主要是 Last Dragon 和 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"的蓝重装。


第二章:原生机器人 / TFBot,难度深潜

Sigsegv 的原框架依然成立:专家显然强过简单,但 Valve 从没说过强多少、为什么。只能读代码。每个随难度变的机制都在下面。

调难度

MvM 外难度走 cvar:

tf_bot_difficulty 难度
0 简单
1 普通(默认)
2 困难
3 专家

tf_bot_add 也能直接带难度参数(easy/normal/hard/expert)。

MvM popfile

Mann vs. Machine 里每个 TFBot 生成块的 Skill key 可选。不写等于简单。Valve 官方任务:巨人几乎全专家,工程师和间谍几乎全专家,狙击一般困难(偶尔专家)。EventChangeAttributes(Two Cities 更新加的)能在波次中按地图事件动态改机器人,难度是能热改的属性之一。

无尽 MvM 模式

无尽模式从没正式发,里面机器人像玩家一样花钱升级,包括一条机器人专属升级:对局中涨 AI 难度。

bot_generator 实体

巨冷门、基本没文档的实体,疑似训练模式用过,MvM 早期开发也许用过。暴露 SetDifficulty 输入调难度。再往下没了:Valve 没写过文档,没人完整摸过它的行为。

眼睛辉光颜色

MvM 机器人眼睛粒子颜色随难度变,社区外没人解释过的视觉指示:

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

待机重装机器人

视野:认出时间

东西进视野机器人不立刻反应:硬编码延迟,剩下的 AI 在此之前连威胁都不认:

难度 最小认出时间
简单 1.00 秒
普通 0.50 秒
困难 0.30 秒
专家 0.20 秒

"简单机器人看着傻"大半就这一个数字:简单机器人认出你之后瞄得不差,只是认出你要慢五倍。

瞄准:追踪频率

机器人不连续跟你。固定间隔采样你的位置速度,直线外推:

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

例外: 间谍机器人写死普通追踪频率,不管真实难度:专家间谍瞄准也像普通。还有公开对比演示视频,并排看 1x 对 20x 的差距。

瞄准:分武器逻辑

机器人不瞄你质心,有分武器逻辑,有的真 bug:

榴弹枪和粘弹枪。 全难度补偿纵向弧线,用 tf_bot_notice_gunfire_range cvar 定值。但补偿只认基础武器 ID 更快的弹道变体(Loch-n-Load、一切弹速 mod)弧线算不准。按武器 ID 绑的,Loose Cannon(ID 不同)完全没弧线补偿。

猎人。 简单不补偿箭下坠,不找爆头。普通补偿弧线,但 150 HU 内才瞄头。困难/专家永远瞄头。

火箭筒。 150 HU 外非简单瞄脚不瞄质心,最大化范围伤害和击飞。150 HU 内转爆头。简单永远质心不管距离。也是武器 ID 锁:Direct Hit 和 Cow Mangler 没这行为。Direct Hit 合理(没范围可炸),Cow Mangler 没道理:这段 AI 比这武器老,从没回头看过。

狙击枪。 简单瞄身。普通瞄身往头约 1/3 处。困难/专家直接头。MvM 里轻点,机器人爆头没伤害加成。

听觉:安静开火敏感度

每声枪响 3000 HU 内附近机器人全听见位置(tf_bot_notice_gunfire_range),穿墙,100% 注意。但一小撮武器标"安静":只 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、牛排、Bonk!、Crit-a-Cola
TF_WEAPON_JAR Jarate(Mad Milk 是独立 ID,算响)
TF_WEAPON_COMPOUND_BOW 猎人
TF_WEAPON_SWORD Eyelander、Skullcutter、Claidheamh Mor、Persian Persuader、Half-Zatoichi
TF_WEAPON_CROSSBOW 十字军弩

表烂掉的经典:Manmelter 拿了独立 ID(TF_WEAPON_RAYGUN_REVENGE),安静表冻结之后加的,所以算响,明明实际就是信号枪。更晚的 Scorch Shot 复用基础 TF_WEAPON_FLAREGUN ID,所以一直算安静。离谱,但是代码。

策略:威胁优先级

多敌人同时可见,机器人按距离、谁在打我、普通以上看主要威胁有没有被奶,掂量:

难度 转打奶妈吗?
简单 不
普通 50% 概率
困难 打
专家 打

500 HU 外敌人一般降级非迫切。例外:困难/专家永远把远处医生和工程师当迫切,任何瞄着你大方向的敌方狙击永远迫切,不管距离难度。

难度 远处医生/工程师/瞄你的狙击 = 迫切吗?
简单/普通 不
困难/专家 是

狙击这条有个我超爱讲的考据。Sigsegv 原文以为游戏要求狙击瞄准向量和机器人相对位置点积精确等于零:浮点比较严到几乎永不触发,整功能等于死代码。后来更干净的 Hex-Rays 反编译修正(credit 归它)真实检查是点积 > 0:正对你到侧对你的狙击全算迫切,侧对到背对不算。原误读来自浮点 SSE 比较的坏反编译。给 17 年 AAA 二进制做逆向,永远是近似活。

移动:闪避

简单机器人永不闪避,就这样。普通以上满足就左右闪(左 33%、右 33%、不动 33%,探到坑加权):拿着战斗武器、3 秒内见过敌人、敌人能直视它。

这些情况不闪:有 DisableDodge 属性、当前行为叫快跑、任何无敌(uber)、嘲讽/挑衅中、玩工程师、间谍隐身或伪装、狙击开镜或重装转枪管、拉猎人弓。

移动:别撞敌人

普通以上移动特意不撞敌人:

难度 避撞敌人吗?
简单 不
普通 不
困难 避
专家 避

实际只对间谍机器人重要:别扭地撞玩家正是暴露伪装的招牌。

火焰兵:气爆掌握

气爆两用:反弹道(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 没这逻辑。当前行为不叫撤退、主弹夹空、无 uber 脆着,高难度临时退掩体换弹,不空枪指你脸:

难度 退掩体换弹吗?
简单 不
普通 不
困难 退
专家 退

占点:防守游荡

MvM 没这逻辑。守点时高难度更爱离点找杀("search and destroy"),但 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 豁免
狙击瞄准点 身 往头约 1/3 头 头
听见安静开火概率 10% 30% 60% 90% 被响枪盖住减半
转打奶妈 不 50% 打 打
远处医生/工程师/瞄你的狙击 = 迫切 不 不 是 是
闪避 无 有 有 有 例外一长串
避撞敌人 不 不 避 避 主要是间谍
气爆概率 0% 50% 90% 100%
间谍伪装选角 随机 随机 抄真敌人 抄真敌人
间谍伪装视线接触 盯(露馅) 盯 避(像真的) 避
间谍背刺角 约 0° ±45° ±78° ±90° MvM 强制普通
切枪逻辑 无 有 有 有 MvM 不太相关
掩体换弹 无 无 有 有 MvM 无
占点防守游荡 10% 50% 75% 90% MvM 无
占点断点 无 50% 断 断 MvM 无

结语

拿 minigun 瞄准的重装机器人

这些反映 Valve 一套故意的系统:全确定性分数概率,只是官方从没写过文档。深潜完我记住三点:

  1. "难度"是一堆独立旋钮,不是全局倍率。反应时间、瞄准频率、每条战术行为各走各的,有的(间谍追踪频率、MvM 背刺角)写死覆盖不管难度。
  2. 一部分真是 bug,不是老。 2010 年冻结的安静武器表、没道理没打脚逻辑的 Cow Mangler、狙击点积检查花几年才反编译对:17 年代码库全是 Valve 的疤。
  3. 全能用上。 知道普通狙击机器人不爆你头,简单火焰兵字面反射不了你火箭,简单间谍敢你脸上捅刀。这不是运气。是技术表。

巨感谢 sigsegv 原创代码深潜,没有它大半不可能,感谢 TF2 wiki 机器人命令和地图支持基础文档,感谢社区里折腾 17 年老 bot AI、非要搞清它为什么这么干的所有人。

TF2ボットはランダムじゃない:難易度パラメータを全部掘り直した

視界、照準、backstab角度、headshot理屈、既知バグ全部。Valveは何も文書化しなかった。だからコードを漁って完全技術シートに変えた。

はじめに

ロケットランチャーで狙うTF2ソルジャーボット

TF2プレイヤーは全員最低1回言ったことがある。「このボットチートだろ」って。逆もある。「なんでこのイージーボットはロケット食って突っ立ってるんだ」って。でも「イージー」「ノーマル」「ハード」「エキスパート」が内部で何意味するか本当に知ってる人は誰もいない。Valveは4つの難易度ラベルを出して、文書は正確にゼロだった。

だから有志(私、awimii、Mush The Possum。土台作業の大半はゲーム逆コンパイルコードを本当に漁ったsigsegv)がTFBot挙動の完全研究文書をまとめた。各仕組み、各既知バグ、各ハードコード確率だ。この記事は完全報告で、縮約版じゃない。Bonk取って。長くなるよ。


第1章:基礎

ボット対操りボット

TF2には人々が「ボット」って呼ぶまったく違う2つがある。

  • AIボット(TFBot):本物AIで、ValveがLeft 4 Deadシリーズに使ったのと同じPlayerBotやInfectedフレームワーク土台だ。ランダムにクラスを選んで、目標を遊んで、sv_cheatsなしで動いて、本物プレイヤーみたいに実績を起こす。
  • 操りボット:AIゼロで、自分では動くことも行動することもできない。手動操作専用だ。プレイヤーが追従や狙いや発砲を強制できる。主にテスト用か、映画風スクショや動画撮影用だ。出すにはsv_cheats 1が必要で、そのセッションの実績も無効になる。

この記事は完全に前者についてだ。

AIボットに(だいたい)言えること

TFBotは直接操作できない。でも特定のことを促せる。

  • ボット(味方も敵も)に crosshair を向けて正しいボイスコマンドを使えば挑発してくる。
  • 味方メディックボットは「Medic!」ボイスコマンドで回復してくれる。
  • 君を回復中のメディックボットがUberCharge準備済みなら「Go go go!」か「チャージ発動!」で言えば即発動する。
  • チャージ準備済みメディックボットは自分か回復対象が深刻ダメージを受けたら、ボイスコマンドなしで自動発動する。
  • ボットは近くの仲間と自発的に二人挑発(High Five)や集団挑発(Conga)をする。

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

ボットはどこ歩いていいか知るのにナビメッシュ依存で、コミュニティマップの大半は付属してない。強制するにはこうだ。

  1. sv_cheats 1
  2. nav_generate → 初期navmeshを構築、進行はコンソール表示
  3. ゲームが経路生成を終えるまで待つ
  4. 任意で悪いナビデータをnav_edit 1で手直しする
  5. サーバーを再読み込みか再起動する(この手順飛ばすと実績無効)
  6. tf_bot_add <数>でボットを出す

警告: サーバーでボット動作中にnavmeshをいじるとゲームが落ちうる。メッシュができたら今後のセッションで再生成は要らない。tf_bot_addでボットを足すだけだ。

自動生成メッシュはコントロールポイント、King of the Hill、Payload、CTFマップでいちばん動く。MannpowerマップではボットはデフォルトでCTF風挙動になるけど、グラップルやパワーアップはほとんど使わない。ボットAIが認識する目標がなくて出現部屋エンティティがあるマップなら、tf_bot_offense_must_push_time 0を設定すればそれでも戦う。

(この節の出典:公式TF2 wikiのBotsページ。)

現状、マップごと

Hatless更新のおかげで今は各クラス正しく動く。歴史的バグ持ちスパイ込みだ。ボットは公式KOTHマップ大半、一部Payload、DustbowlやGorgeのAttack-Defense、CTFやMann Manorマップで正しく振る舞う。後ろ2つはtf_bot_addで直接出せない。未対応マップ(上のnav_generate手順経由)では動くけど、本物プレイヤーの真似はかなり下手だ。

PLRマップは諦めものだ。Hightowerの柵をボットは越えられず隅に詰まる。他PLRマップではただ遊ばずダンスパーティーする。いつか直るかもだし、このままかもだ。

ボット共通挙動

水準問わず各ボットがやることの寄せ集めだ。

  • ボットは基本ロードアウトだけ使う(プラグインで非標準武器を強制できるけど、バニラボットは自分で選ばない)。
  • イージーボットは副武器をほとんど使わない。上位難易度は主マガジン空か距離埋めに副武器へ替える。
  • ボットは高度移動技術を無視する。ロケットジャンプなし、建物移設なし。
  • キル後にボットは挑発しうる。撃たれててもね。敵インテリ持ってる場合は除く。この規則はMvMにも当てはまる。
  • 変装スパイボット(プレイヤーもAIも)は他ボットに正しく無視される。敵に触れる、妨害する、撃つ、近くで透明になるまではね。一度「見つかる」と、その特定ボットやプレイヤーはスパイとして記憶される。透明のまま変装を替える、死ぬ、Dead Ringerで死んだふりするまでだ。
  • パイロボットはノーマル水準からCompression Blastを自由に使う。
  • メディックボットはスナイパー(と少なめにエンジニア)以外みんな回復優先だ。そういう職で「Medic!」連打してもね。
  • メディックボットはヘビー、ソルジャー、デモマン、パイロに寄る。人間がこのクラスを遊んでるときに特にね。この注目はこの役の人間存在を追う。
  • Attack/DefenseとPayloadマップの準備時間中、ボットは位置に留まる。エンジニア、スナイパー、スパイ除く。自由に動ける(デモマンボットは粘着爆弾の事前設置も許される)。
  • エンジニアボットは味方エンジニアの建物を強化も無効化もしない。目標経路上にある場合除く。自タレットを明らかに見えても修理しないことがある。
  • 見つかったスパイボットはリボルバーに替えて後退する。ナイフ一撃を強行しない。
  • セントリーを特定したデモマンボット(だいたい一度死んで)は、射程外から粘着爆弾を壁や天井越しに弧を描いて完璧投げられる。形状が許せばね。
  • 標的が見つからず狙ってたスナイパーボットは「Negatives」系ボイスのどれかを使う。
  • 味方メディックは変装スパイをためらわず回復する。

既知問題やバグ

文書は長年の変な挙動をかなり挙げる。

  • ボットは一部静的prop越しに歩こうとしたり撃とうとしたりする。
  • プレイヤーやボットが変装を解く、変装する、姿を現すたびに、近いボットは「見て」振り返って反応する。実視界外で起きてもね。音基準じゃない。視界テストの回避策だ。
  • まれにボットはエンジニアのテレポーター使いで物理的に詰まり合う。
  • ボットのボイスコマンド(たとえば「Spy!」「前に!」)はプレイヤーみたいにチャットへテキスト表示されない。
  • 治療中メディックボットは飛んでくる発砲を避けないし回復キットも取らない。HP危機でもね。
  • ボットは二人挑発中に動き続けうる。Festive Critical Strikeの想定演出を壊す。
  • 負傷直後メディックボットは遠距離でSyringe Gunを使いたがらない。接近戦を好む(とてもまれにMedi Gun光線自体で触ろうとする)。
  • メディックボットはSyringe Gun発砲の重力を補正しない。コードAI内で武器が非hitscan印されてないせいだろう。
  • スパイボットは透明スパイ(プレイヤーもAIも)を見て追える。一度見つけられてたら、追うボットの技量水準問わずだ。
  • プレイヤースパイが自チーム職に変装しても、敵にぶつかれば姿を現す(ボットは自分でやらない。ボットは自チームに変装しないからね)。
  • ボットは自動チーム均衡を尊重する。片側にボット詰めしたければ、まずmp_teams_unbalance_limit 0を使う。
  • エンジニアボットは自建物を破壊されるまで完全無視することがある。
  • ヘビーボットは弾切れなのにMinigunを撃とうとすることがある。ハード未満で特にだ。
  • 負けチームのメディックボットはHumiliation段階で敵が近くにいないと自殺することがある。人力で真似しようとしてもできないことだ。
  • 読み込み画面でチームプレビューをBLUにすると、REDボットが視覚的にBLU描画に見える。
  • 近接武器出しボットは弾拾っても武器替えを拒むことがある。
  • Jungle Inferno後、明示パラメータで出したボット(たとえばtf_bot_add 5 pyro bleu 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ヘビーを出す。


第2章:元祖ボットやTFBot。技量水準の潜入

Sigsegvの元枠組みは今も立つ。エキスパートボットがイージーボットに勝るのは明らかだが、Valveはどれだけもなぜも説明しなかった。だから知る唯一の方法はコードを読むことだ。技量で変わる各仕組みはこうだ。

難易度を設定する

MvM外では、難易度はcvarで管理する。

tf_bot_difficulty 難易度
0 イージー
1 ノーマル(デフォルト)
2 ハード
3 エキスパート

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

MvM popfile

Mann vs. Machineでは、popfile内各TFBot出現ブロックに任意Skillキーがある。キーなしはイージー水準に対応する。Valveミッションではこうだ。ジャイアントはほぼつねにエキスパート、エンジニアとスパイはほぼつねにエキスパート、スナイパーはだいたいハード(ときどきエキスパート)だ。EventChangeAttributes(Two Cities更新で追加)でマップイベントに応じてウェーブ中にボットを動的変更するなら、ボット技量はその場で変えられる特性の1つだ。

Endless MvMモード

Endlessモードは正式出荷されなかった。でも中でボットはプレイヤーみたいに金で強化を買う。ボット専用強化込みで、対局中にAI技量水準を上げる。

bot_generatorエンティティ

ほぼ無文書の謎エンティティで、訓練モードと初期MvM開発で使われたと推定される。技量水準管理用SetDifficulty入力を出す。先は冷える。Valveは文書化しなかったし、挙動を完全図化した人は誰もいない。

眼光色

MvMロボットは技量水準で色が変わる眼光パーティクルを持つ。コミュニティ外の誰も説明しなかった視覚表示だ。

技量 眼色 RGB
イージー/ノーマル 青 #24b4ff
ハード/エキスパート 黄 #fff000

待機姿勢のTF2ヘビーボット

視界:認識時間

何かが視界に入ったらボットは即反応しない。残りAIが脅威認識を許される前にハードコード遅延がある。

技量 最小認識時間
イージー 1.00秒
ノーマル 0.50秒
ハード 0.30秒
エキスパート 0.20秒

「イージーボットがばかっぽい」効果の大半はこの1数字だ。イージーボットは君に気づいてからの狙いが下手なんじゃない。君の存在に気づくのに5倍時間がかかるだけだ。

照準:追跡率

ボットは継続追跡しない。位置と速度を固定間隔で抽出して、そこから直線を予測する。

技量 再計算間隔 同等率
イージー 1.00秒 1回/秒
ノーマル 0.25秒 4回/秒
ハード 0.10秒 10回/秒
エキスパート 0.05秒 20回/秒

例外: スパイボットは実技量水準問わずノーマル追跡率でハードコードされる。エキスパートスパイもノーマルボットみたいに狙う。1回対20回の差を動きで見たければ並列比較の公開デモ動画もある。

照準:武器別技量

ボットは重心だけ狙うんじゃない。武器ごとの理屈があって、ときどき本当にバグってる。

グレネードランチャーと粘着爆弾ランチャー。 全技量水準がcvar tf_bot_ballistic_elevation_rateの固定値で垂直弧を補正する。この補正は基本武器IDにしか起動しないから、速い弾派生(Loch-n-Load、弾速変更付き全部)は弧が正しく調整されない。武器ID縛りだからLoose Cannon(違うID)は弧補正を受けない。

Huntsman。 イージーボットは矢落ちを補正しないしheadshotを狙わない。ノーマル水準ボットは弧を補正するけど、150HU未満だけ頭を狙う。ハードやエキスパートボットはつねに頭を狙う。

ロケットランチャー。 150HU超ではノーマル超ボットは重心じゃなく足を狙って、範囲ダメージと吹き飛ばし率を最大化する。150HU未満ではheadshotへ替える。イージーボットは距離問わずつねに重心だ。これも武器ID縛りだ。Direct HitとCow Manglerはこの挙動を受け継がない。Direct Hitは理屈ある(活かせる範囲効果なし)。Cow Manglerは意味ゼロだ。このAI部分は武器存在より古くて見直されたことがないだけだ。

スナイパーライフル。 イージーは体を狙う。ノーマルは体から頭へ約33パーセントを狙う。ハードやエキスパートは直接頭を狙う。MvMでは重要度低い。ボットのheadshotはどのみちダメージボーナスを得ない。

聴覚:静かな発砲への感度

各発砲は壁越しでも近くボットに発砲者位置を知らせる。3000HUまで100パーセント気づき率だ(tf_bot_notice_gunfire_range)。でも武器 subset は「静か」印だ。500HU内だけ聞こえる(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 全Medi Gun
TF_WEAPON_DISPENSER たぶん未使用(Dispenserは物で武器じゃない)
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じゃない。別IDで非静か)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander、Skullcutter、Claidheamh Mor、Persian Persuader、Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

一覧腐敗の古典例:Manmelterは独自ID(TF_WEAPON_RAYGUN_REVENGE)をもらった。静か武器一覧凍結後に足されたから、うるさい扱いだ。実務上フレアガンなのにね。さらに後に出たScorch Shotは基本ID TF_WEAPON_FLAREGUNを再利用してる。だから今も静か扱いだ。非常識だけどコードだ。

戦略:脅威優先度

複数敵が同時に見えたら、ボットは距離、自分が撃たれてるか、イージー超では主脅威が回復されてるかを重み付けする。

技量 代わりに回復者を狙う?
イージー いいえ
ノーマル 50パーセント
ハード はい
エキスパート はい

500HU超の敵は通常すぐじゃない扱いだ。例外:ハードやエキスパートボットは遠いメディックとエンジニアをつねにすぐの脅威として扱う。だいたい君方向を狙ってる敵スナイパーは距離も技量も問わずつねにすぐ扱いだ。

技量 遠いメディックやエンジニアや狙い中スナイパーはすぐの脅威?
イージー/ノーマル いいえ
ハード/エキスパート はい

このスナイパー確認には私がいつも話す驚きの歴史がある。Sigsegvの元記述は、ゲームがスナイパー狙いベクトルとボット相対位置の内積を正確にゼロ要求すると思ってた。浮動小数点計算ではほぼ発火しない精度の比較で、機能全体が事実上死にコードになる。後公開の修正(きれいなHex-Rays逆コンパイルの功績)は実際の確認が内積 > 0だと示した。君へ真っ直ぐから垂直までの向きのスナイパーはすぐの脅威とみなす。垂直から背向けは違う。元誤読は浮動小数点SSE比較の悪い逆コンパイルから来た。AAAバイナリのリバースは近似作業のままだ。

移動:回避

イージーボットは絶対回避しない。以上だ。ノーマル超ボットは戦闘武器持ちで、直前3秒に敵を見て、その敵に照準線があるとき左右に回避する(左33パーセント、右33パーセント、何もしない33パーセント。検出穴寄りに重み付け)。

こんな場合回避しない:DisableDodge属性設定、現挙動が急げと言う、無敵中(uber問わず)、挑発や煽り最中、エンジニアを遊ぶ、スパイで透明か変装中、スナイパー狙い中かヘビー回転中、Huntsman引き絞り中だ。

移動:敵にぶつからないよう避ける

ノーマル超では、ボットは移動中に敵へ入らないよう特に努める。

技量 敵にぶつかるのを避ける?
イージー いいえ
ノーマル いいえ
ハード はい
エキスパート はい

実際、スパイボットにしか重要じゃない。敵プレイヤーとの気まずい衝突回避は変装を危うくする類のことだからね。

パイロ:エアブラスト習熟

エアブラストは2用途だ。弾を跳ね返す(PvPとMvM)と縁近くの敵を押す(PvPのみ)。有効機会に引き金を引くかは技量コイントスだ。

技量 エアブラスト発動確率
イージー 0%
ノーマル 50%
ハード 90%
エキスパート 100%

イージーパイロボットは文字通りエアブラストできない。抽選は絶対成功しないハードコードで、「まれに」じゃない。

スパイ:変装効率

2つの別軸が技量で変わる。変装選択:

技量 変装方法
イージー/ノーマル ランダム職。敵が実際何遊んでるか無視する
ハード/エキスパート 本物敵プレイヤーを選んで正確な職を写す

変装中挙動:

技量 変装や透明中挙動
イージー/ノーマル 敵プレイヤーを見たら凝視する(怪しい)
ハード/エキスパート わざと目線を避ける(説得力ある)

スパイ:backstab積極性

長射程(300HUまで、tf_bot_spy_knife_range)では、スパイボットは獲物が見えて獲物の背中が少なくとも部分的に向いてるときだけbackstabに入る。技量は背中角度がどれだけ外れてていいか決める。

技量 角度許容
イージー 目の前でも試みる
ノーマル 背中±45°
ハード 背中±78°
エキスパート 背中±90°(後ろ180°弧全部)

イージースパイボットは機能的に自殺的だ。目を見てる相手にナイフ一撃を試みる。例外: Mann vs. Machineでは各スパイボットは実技量水準問わずノーマル角度制約を強制される。

戦術:武器選択

この理屈はイージー超水準だけだ。MvMでは興味薄い。ボットは概して厳密な武器制限があるからね。

  • スカウト:主マガジン空で副武器へ替える。
  • ソルジャー:マガジン空かつ標的500HU未満で副武器へ替える。
  • スナイパー:750HU未満標的用に副武器へ替える。
  • パイロ:750HU超標的用に副武器へ替える。標的がソルジャーかデモマンの場合除く。

戦術:陰で装填

MvMにない理屈だ。現ボット挙動が retreat を言わず、主マガジン空で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 headshot なし 150HU未満 あり あり
ロケット足撃ち なし あり あり あり Direct HitとCow Mangler除外
スナイパーライフル狙点 体 頭へ約33% 頭 頭
静かな発砲気付き率 10% 30% 60% 90% うるさい発砲で隠れたら半分
回復者を狙う いいえ 50% はい はい
遠いメディックやエンジニアや狙い中スナイパーは脅威 いいえ いいえ はい はい
回避 なし あり あり あり 長い除外一覧
敵にぶつかるの避ける いいえ いいえ はい はい スパイに主に大事
エアブラスト発動確率 0% 50% 90% 100%
スパイ変装職選択 ランダム ランダム 本物敵に合わせる 本物敵に合わせる
変装中目線スパイ 凝視(明白) 凝視 避ける(説得力) 避ける
スパイbackstab角度 約0° ±45° ±78° ±90° MvMはノーマル強制
武器選択理屈 なし あり あり あり MvMでは重要度低い
陰装填 いいえ いいえ はい はい MvMなし
CP守備放浪 10% 50% 75% 90% MvMなし
CP占拠阻止 いいえ 50% はい はい MvMなし

結論

minigunで狙うTF2ヘビーボット

全部がValveの意図的仕組みを映す。完全決定的なスコアと確率で、公式文書化されたことがないだけだ。この潜入後に私が保つ点はこうだ。

  1. 「技量」は独立カーソル群だ。全体倍率じゃない。反応時間、照準間隔、各戦術挙動は別々に変わる。一部(スパイ追跡率、MvM backstab角度)は水準問わずハードコード上書きがある。
  2. 一部は本当にバグってて古いだけじゃない。 2010年から凍結の静か武器一覧、正当理由なしに足撃ち理屈のないCow Mangler、正しく逆コンパイルされるのに何年もかかったスナイパー内積確認。17年ベースのValve AIコードには傷がある。
  3. 全部使える。 スナイパーボットがノーマルでheadshotしないと知って、イージーパイロは文字通りロケットを跳ね返せないと知って、イージースパイは目の前で刺そうとすると知ってる。運じゃない。技術シートだ。

元コード潜入を可能にしてくれたsigsegv、ボットコマンドとマップ対応の基本文書化をしてくれたTF2 wiki、17年物ボットAIをなぜそう動くか正確に理解するためいじり続けるコミュニティ全員に大感謝だ。

TF2 봇은 무작위가 아니에요: 난이도 매개변수마다 다시 찾았어요

시야, 조준, 백스탭 각도, 헤드샷 논리, 알려진 버그마다. Valve는 아무것도 문서화하지 않았어요. 그래서 코드를 뒤져서 완전한 기술 명세로 만들었어요.

소개

로켓 발사기로 조준하는 TF2 솔저 봇

TF2 플레이어마다 최소 한 번은 말했어요. "이 봇 핵 써요." 또는 반대로요. "이 쉬움 봇은 왜 로켓을 맞으며 가만히 서 있어요." "쉬움"과 "보통", "어려움", "전문가"가 내부적으로 무슨 뜻인지 아무도 몰라요. Valve는 난이도 라벨 네 개를 내놓고 문서 제로를 내놓았어요.

그래서 저희 몇 명(저와 awimii, Mush The Possum, 디컴파일된 게임 코드를 정말 뒤진 sigsegv의 엄청난 토대 작업과 함께)이 TFBot 행동에 대한 완전한 연구 문서를 모았어요. 모든 구조와 알려진 버그, 하드코딩된 확률마다요. 이 글은 완전한 보고예요. 요약 버전이 아니에요. Bonk 하나 잡으세요. 길어져요.


1장: 기초

봇 대 꼭두각시 봇

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

  • AI 봇 (TFBot): 진짜 AI. Valve가 Left 4 Dead 시리즈에 쓴 PlayerBot과 Infected와 같은 프레임워크로 지었어요. 무작위 클래스를 고르고, 목표를 하고, sv_cheats 없이 동작하고, 진짜 플레이어처럼 도전과제를 일으켜요.
  • 꼭두각시 봇: AI 제로. 혼자 움직이거나 행동할 수 없어요. 손으로 조종하려고만 존재해요. 플레이어가 따라오게 하고 조준하고 쏘게 강제할 수 있어요. 주로 테스트나 영화 스크린샷과 영상용. 나타나게 하려면 sv_cheats 1이 필요하고, 세션 도전과제도 꺼져요.

이 글은 전적으로 첫 종류 이야기예요.

AI 봇에게 (대충) 시킬 수 있는 것

TFBot은 직접 조종할 수 없지만, 특정 일을 하도록 유도할 수 있어요.

  • 크로스헤어로 봇(아군이나 적)을 조준하고 올바른 음성 명령을 쓰면 여러분을 놀려요.
  • 아군 Medic 봇은 "Medic!" 음성 명령을 쓰면 치료해 줘요.
  • 여러분을 치료하는 Medic 봇이 UberCharge 준비됐으면 "가자 가자!"나 "차지 켜!"라고 하면 바로 차지를 일으켜요.
  • 차지 준비된 Medic 봇은 자신이나 치료 대상이 진지한 피해를 입자마자 음성 명령 없이 자동으로 차지를 켜요.
  • 봇은 가까운 팀원과 둘 놀리기(High Five)나 무리 놀리기(Conga)를 자발적으로 해요.

지원되지 않는 맵에서 봇 돌리기

봇은 걸어도 되는 곳을 알려고 내비게이션 망에 기대고, 대부분 커뮤니티 맵이 이를 제공하지 않아요. 강제하려면요.

  1. sv_cheats 1
  2. nav_generate: 처음 내비망 만들기, 진행이 콘솔에 나와요
  3. 게임이 길 만들기를 마칠 때까지 기다리기
  4. 선택 사항으로 nav_edit 1로 나쁜 내비 자료를 손으로 고치기
  5. 서버를 다시 불러오거나 다시 시작하기 (이 단계 건너뛰면 도전과제가 꺼져요)
  6. tf_bot_add <nombre>로 봇 나타나게 하기

경고: 서버에 봇이 활성 상태일 때 내비망을 고치면 게임이 죽을 수 있어요. 망이 있으면 나중 세션에 다시 만들 필요 없어요. tf_bot_add로 봇을 더하면 돼요.

자동 만든 망은 점령 지점과 King of the Hill, Payload, CTF 맵에서 가장 잘 동작해요. Mannpower 맵에서는 봇이 기본 CTF식 행동을 하지만 갈고리나 파워업을 거의 쓰지 않아요. 봇 AI가 아는 목표가 없는데 스폰방 개체가 있는 맵이면 tf_bot_offense_must_push_time 0을 정하면 봇이 그래도 싸워요.

(이 섹션 출처: 공식 TF2 위키 Bots 페이지.)

지금 상태, 맵별로

Hatless 업데이트 덕분에 역사적으로 버그투성이 Spy를 포함해 이제 각 클래스가 제대로 동작해요. 봇은 대부분 공식 KOTH 맵과 일부 Payload 맵, Dustbowl과 Gorge 공격과 방어, CTF와 Mann Manor 맵에서 제대로 행동해요. 뒤의 둘에서는 tf_bot_add로 직접 나타나게 할 수 없어요. 지원되지 않는 맵(위 과정 경유)에서는 동작하지만 진짜 플레이어 흉내가 분명히 떨어져요.

PLR 맵은 가망이 없어요. 봇이 Hightower 장벽을 넘지 못하고 구석에 끼고, 다른 모든 PLR 맵에서는 그냥 플레이 대신 춤 파티를 해요. 언젠가 고쳐질 수도 있고 그대로 남을 수도 있어요.

봇 일반 행동

수준과 무관하게 각 봇이 하는 것들 모음:

  • 봇은 기본 로드아웃만 써요 (플러그인이 비표준 무기를 강제할 수 있지만 바닐라 봇은 절대 자기 것을 고르지 않아요).
  • 쉬움 봇은 보조 무기를 거의 쓰지 않아요. 상위 난이도는 주 탄창이 비면 보조 무기로 바꾸거나 거리를 메우려고 바꿔요.
  • 봇은 고급 이동 기술을 무시해요. 로켓 점프도 없고 건물 재배치도 없어요.
  • 처치 뒤 봇이 놀릴 수 있어요. 불 속에서도요. 단 적 첩보를 들었으면 빼고, 이 규칙은 MvM에도 적용돼요.
  • 변장 Spy 봇(플레이어나 AI)은 다른 봇이 제대로 무시해요. 적을 건드리거나 무언가를 사보타주하거나 쏘거나 근처에서 투명해지기 전까지요. "들키면" 그 특정 봇과 플레이어가 변장을 바꾸면서 투명을 유지하거나 죽거나 Dead Ringer로 죽은 척하기 전까지 Spy로 기억돼요.
  • Pyro 봇은 보통 수준부터 Compression Blast를 아낌없이 써요.
  • Medic 봇은 Sniper(덜하지만 Engineer)를 빼고 모두 치료를 우선해요. 그런 직업으로 "Medic!"을 연타해도요.
  • Medic 봇은 Heavy, Soldier, Demoman, Pyro 쪽으로 끌려요. 사람이 이 클래스를 할 때 특히요. 이 관심은 이 역할에 사람이 있는지를 따라가요.
  • 봇은 공격과 방어, Payload 맵 준비 시간에 자리에 있어요. 자유롭게 움직이는 Engineer, Sniper, Spy 빼고요 (Demoman 봇도 점착 폭탄 미리 놓기가 허용돼요).
  • Engineer 봇은 목표 길에 아군 Engineer 건조물이 있어도 절대 고치거나 끄지 않아요. 자기 포탑이 뻔해 보여도 가끔 그냥 안 고쳐요.
  • 들킨 Spy 봇은 칼 찌르기를 강제하지 않고 리볼버로 바꾸고 물러나요.
  • 센트리 위치를 안 봇(보통 한 번 죽어서) Demoman 봇은 사거리 밖에서 구조가 되면 벽과 천장을 둥글게 돌아 점착 폭탄을 완벽히 던질 수 있어요.
  • 조준하고 목표를 찾지 못하는 Sniper 봇은 "Negatives." 음성 대사 중 하나를 써요.
  • 아군 Medic은 변장 Spy를 망설임 없이 치료해요.

알려진 문제와 버그

문서에 오래된 이상함이 꽤 나열되어 있어요.

  • 봇이 특정 정적 소품을 뚫고 걷거나 쏘려고 할 수 있어요.
  • 플레이어와 봇이 변장을 풀거나 쓰거나 드러날 때마다 근처 봇이 "봐요". 돌아서 반응해요. 실제 시야 밖에서 일어났어도요. 소리 기반이 아니에요. 시야 테스트 우회예요.
  • 드물게 봇이 Engineer 텔레포터를 쓰면서 물리적으로 서로 끼일 수 있어요.
  • 봇 음성 명령(예: "Spy!", "앞으로!")은 플레이어 것처럼 채팅에 텍스트로 나오지 않아요.
  • 누군가를 활발히 치료하는 Medic 봇은 들어오는 사격을 피하지도 체력 키트를 먹지도 않아요. 체력이 위중해도요.
  • 봇이 둘 놀리기 중에 계속 움직일 수 있어서 Festive Critical Strike 의도 효과가 깨져요.
  • 최근 다친 Medic 봇은 원거리에서 Syringe Gun 쓰기를 자주 거부하고 백병전을 좋아해요 (아주 드물게 Medi Gun 광선 자체로 여러분을 건드리려고 해요).
  • Medic 봇은 Syringe Gun 사격 중력을 보정하지 않아요. AI 코드에 이 무기가 비히트스캔으로 제대로 표시되지 않아서일 가능성이 커요.
  • Spy 봇은 들킨 적 있는 투명 Spy(플레이어나 AI)를 보고 따라갈 수 있어요. 따라가는 봇의 실력과 무관하게요.
  • 플레이어 Spy가 자기 팀 클래스로 변장해도 적을 건드리면 변장이 풀려요 (봇은 절대 자기 자신에게 그렇게 하지 않아요. 봇은 절대 자기 팀으로 변장하지 않으니까요).
  • 봇은 자동 팀 균형을 지켜요. 한쪽에 봇을 몰아넣으려면 먼저 mp_teams_unbalance_limit 0을 써야 해요.
  • Engineer 봇은 자기 건조물이 파괴될 때까지 완전히 무시할 수 있어요.
  • Heavy 봇은 특히 어려움 미만에서 탄약이 없는데 Minigun을 쏘려고 할 때가 있어요.
  • 지는 팀 Medic 봇은 적이 근처에 없으면 굴욕 단계에 가끔 자살해요. 사람 플레이어는 애써도 재현할 수 없는 것.
  • 불러오기 화면에서 팀 미리보기를 BLU로 정하면 RED 봇이 시각적으로 BLU로 렌더된 것처럼 보여요.
  • 근접 무기를 든 봇은 탄약을 주운 뒤에도 가끔 무기 바꾸기를 거부해요.
  • Jungle Inferno 뒤에 명시 매개변수로 태어난 봇(예: tf_bot_add 5 pyro bleu 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의 원본 틀이 여전히 서 있어요. 전문가 봇이 쉬움 봇을 능가함은 뻔하지만 Valve는 얼마나 왜 무엇 때문에 설명한 적이 없어요. 그래서 아는 유일한 방법은 코드를 읽는 거예요. 실력과 함께 바뀌는 구조마다 여기 있어요.

난이도 정하기

MvM 밖에서 난이도는 cvar 하나로 조종돼요.

tf_bot_difficulty 난이도
0 쉬움
1 보통 (기본값)
2 어려움
3 전문가

tf_bot_add도 난이도 인수(easy와 normal, hard, expert)를 바로 받아요.

MvM popfile

Mann vs. Machine에서는 popfile의 각 TFBot 스폰 블록에 선택적 Skill 키가 있어요. 키 부재가 쉬움 수준에 해당해요. Valve 미션에서는 자이언트가 거의 항상 전문가, Engineer와 Spy가 거의 항상 전문가, Sniper가 보통 어려움 (가끔 전문가)이에요. EventChangeAttributes(Two Cities 업데이트에 추가)로 맵 이벤트에 따라 웨이브 중 봇을 동적으로 바꾸면 봇 실력이 그때그때 바꿀 수 있는 속성 중 하나예요.

끝없는 MvM 모드

Endless 모드는 공식 출시된 적이 없지만, 안에서는 봇이 플레이어처럼 돈을 개선에 써요. 게임 중에 AI 실력 수준을 올리는 봇 전용 개선도 포함해서요.

bot_generator 개체

알려지지 않고 대체로 문서화되지 않은 개체. 훈련 모드와 초기 MvM 개발에 쓰였을 것으로 추정돼요. 실력 수준을 조종하는 SetDifficulty 입력을 노출해요. 그 너머는 흔적이 식어요. Valve가 문서화한 적이 없고 아무도 행동을 완전히 지도화하지 않았어요.

눈빛 색

MvM 로봇에는 실력 수준 따라 색이 바뀌는 눈빛 입자가 있어요. 커뮤니티 밖에는 아무도 설명한 적 없는 시각 표시기.

실력 눈 색 RGB
쉬움과 보통 파랑 #24b4ff
어려움과 전문가 노랑 #fff000

대기 자세 Heavy 봇 TF2

시야: 인식 시간

봇은 뭔가가 시야에 들어오면 바로 반응하지 않아요. 나머지 AI가 위협을 인식하도록 허용되기 전 하드코딩된 지연이 있어요.

실력 최소 인식 시간
쉬움 1,00 s
보통 0,50 s
어려움 0,30 s
전문가 0,20 s

"쉬움 봇이 바보 같아 보여요" 효과의 본질이 숫자 하나에 있어요. 쉬움 봇은 여러분을 알아본 뒤 조준을 덜 잘하는 것이 아니라 알아보는 데 5배 오래 걸려요.

조준: 추적 속도

봇은 계속 추적하지 않아요. 자리와 속도를 고정 간격으로 샘플링하고 거기에서 직선을 예측해요.

실력 재계산 간격 같은 속도
쉬움 1,00 s 1x/s
보통 0,25 s 4x/s
어려움 0,10 s 10x/s
전문가 0,05 s 20x/s

예외: Spy 봇은 실제 실력과 무관하게 보통 추적 속도로 하드코딩돼요. 전문가 Spy도 항상 보통 봇처럼 조준해요. 1x 대 20x 차이를 움직이면서 보고 싶으면 나란히 비교하는 공개 시연 영상도 있어요.

조준: 무기별 실력

봇은 질량 중심만 조준하지 않아요. 무기별 논리가 있고 가끔 진짜 버그투성이예요.

유탄 발사기와 점착 폭탄 발사기. 모든 수준이 고정 cvar 값 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는 논리적이에요 (악용할 범위 효과 없어요). 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년 12월 이후로 고치지 않았어요. 새 ID를 쓰는 뒤의 추가는 논리적으로 얼마나 조용해야 하든 기본 시끄러운 것으로 처리돼요. 더 옛 ID를 재사용하지 않는 한요. 구체적으로요.

무기 ID 해당
TF_WEAPON_KNIFE 모든 Spy 칼
TF_WEAPON_FISTS Heavy 전용 주먹 (멀티클래스 주먹은 사실 TF_WEAPON_FIREAXE예요)
TF_WEAPON_PDA 직접 쓰이지 않는 것으로 추정
TF_WEAPON_PDA_ENGINEER_BUILD Engineer 건설 PDA
TF_WEAPON_PDA_ENGINEER_DESTROY Engineer 파괴 PDA
TF_WEAPON_PDA_SPY Spy 변장 키트
TF_WEAPON_BUILDER Spy와 Engineer, Saboteur 도구 키트
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 Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, 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 너머 적은 보통 긴급하지 않다고 우선순위를 낮춰요. 예외: 어려움과 전문가 봇은 먼 Medic과 Engineer를 항상 긴급 위협으로 다루고, 대충 여러분 방향을 조준하는 적 Sniper는 거리와 실력에 무관하게 항상 긴급으로 다뤄요.

실력 먼 Medic와 Engineer, 조준 Sniper = 긴급 위협?
쉬움과 보통 아니요
어려움과 전문가 네

이 Sniper 검사에는 제가 항상 이야기하기 좋아하는 놀라운 역사가 있어요. Sigsegv 원문은 게임이 저격수 조준 벡터와 봇 상대 위치 사이 내적이 정확히 0이어야 한다고 가정했어요. 부동소수점 계산에서는 거의 일어나지 않을 만큼 정확한 비교라서 전체 기능이 사실상 죽은 코드가 돼요. 뒤에 나온 수정 (더 깨끗한 Hex-Rays 디컴파일 덕분)이 실제 검사가 내적 > 0임을 보였어요. 여러분을 향해 정면에서 수직까지 마주 보는 모든 Sniper가 긴급 위협으로 여겨져요. 수직에서 등을 돌린 것은 아니에요. 원문 오독은 부동소수점 SSE 비교의 잘못된 디컴파일에서 왔어요. AAA 바이너리 리버싱은 여전히 대충 하는 연습이에요.

움직임: 피하기

쉬움 봇은 절대 피하지 않아요. 끝. 보통 이상 봇은 전투 무기를 들고, 지난 3초에 적을 보고, 그 적이 자기에게 시야가 닿으면 좌우로 피해요 (왼쪽 33퍼센트, 오른쪽 33퍼센트, 아무것도 안 하기 33퍼센트. 감지된 구멍 반대 가중).

이런 경우 피하지 않아요. DisableDodge 속성이 서 있고, 현재 행동이 서두르라고 하고, 현재 무적 (어떤 uber든)이고, 놀리기와 도발 중이고, Engineer를 하고, Spy로 투명하거나 변장하고, Sniper로 조준하거나 Heavy로 회전하거나, Huntsman을 당기고 있으면요.

움직임: 적과 부딪히지 않기

보통 위에서는 봇이 움직이면서 적 안으로 들어가지 않으려고 특히 애써요.

실력 적과 부딪히지 않나요?
쉬움 아니요
보통 아니요
어려움 네
전문가 네

실제로는 Spy 봇에만 중요해요. 적 플레이어와 어색한 충돌을 피하는 것이 변장을 무너뜨리는 종류의 일이거든요.

Pyro: 에어블라스트 숙련

에어블라스트는 두 가지에 쓰여요. 발사체 반사(PvP와 MvM)와 가장자리 근처 적 밀기(PvP만). 유효 기회에 봇이 방아쇠를 당기는지는 실력 기반 동전 던지기예요.

실력 에어블라스트를 일으킬 확률
쉬움 0%
보통 50%
어려움 90%
전문가 100%

쉬움 Pyro 봇은 말 그대로 에어블라스트를 못 해요. 추첨이 절대 성공하지 않도록 하드코딩돼 있어요. "드물게"가 아니에요.

Spy: 변장 효율

실력과 함께 바뀌는 서로 다른 축 둘. 변장 고르기:

실력 변장 방법
쉬움과 보통 무작위 클래스, 적 팀이 실제로 무엇을 하는지 무시
어려움과 전문가 진짜 적 플레이어를 고르고 정확한 클래스를 베껴요

변장 행동:

실력 변장과 투명 행동
쉬움과 보통 보면 적 플레이어를 쳐다봐요 (수상)
어려움과 전문가 일부러 눈을 마주치지 않아요 (더 설득력)

Spy: 백스탭 공격성

장거리 (최대 300 HU, tf_bot_spy_knife_range)에서 Spy 봇은 피해자를 볼 수 있고 피해자 등이 최소 부분 돌아가 있을 때만 백스탭에 나서요. 실력이 등 각도가 얼마나 빗나갈 수 있는지 정해요.

실력 각도 허용
쉬움 정면으로 마주 봐도 시도해요
보통 등에서 앞뒤 45도
어려움 등에서 앞뒤 78도
전문가 등에서 앞뒤 90도 (뒤 180도 전체)

쉬움 Spy 봇은 기능적으로 자살해요. 눈을 똑바로 마주 보는 누군가에게 칼 찌르기를 시도해요. 예외: Mann vs. Machine에서는 각 Spy 봇이 실제 실력과 무관하게 보통 각도 제약으로 강제돼요.

전술: 무기 고르기

쉬움 위 수준만 해당하고, MvM에서는 봇이 보통 엄격한 무기 제한을 가져서 관심이 줄어요.

  • Scout: 주 탄창이 비면 보조 무기로 바꿔요.
  • Soldier: 탄창이 비고 목표가 500 HU 미만이면 보조 무기로 바꿔요.
  • Sniper: 750 HU 미만 목표에 보조 무기로 바꿔요.
  • Pyro: 750 HU 초과 목표에 보조 무기로 바꿔요. 목표가 Soldier나 Demoman이면 빼고요.

전술: 엄폐 재장전

MvM에 없는 논리. 현재 봇 행동이 후퇴하라고 하지 않고, 주 탄창이 비고, uber 없이 취약하게 남으면, 상위 봇이 여러분 앞에서 빈 무기를 딸깍거리는 대신 잠시 엄폐로 물러나 재장전해요.

실력 재장전하려고 물러나나요?
쉬움 아니요
보통 아니요
어려움 네
전문가 네

CP 모드: 수비수 방랑

MvM에 없는 논리. 점령 지점을 방어하면서 상위 봇은 지점을 떠나 처치를 사냥할("수색하고 파괴") 가능성이 커요. tf_bot_defense_must_defend_time에 괜찮은 시간이 남을 때만요.

실력 방랑 확률
쉬움 10%
보통 50%
어려움 75%
전문가 90%

CP 모드: 점령 막기

적 점령 시도를 다투는 수비 봇:

실력 점령 막기를 시도하나요?
쉬움 아니요
보통 50% 확률
어려움 네
전문가 네

완전 요약표

측면 쉬움 보통 어려움 전문가 비고
시야: 인식 시간 1,00s 0,50s 0,30s 0,20s
조준: 추적 속도 1x/s 4x/s 10x/s 20x/s Spy는 항상 보통
유탄과 점착 포물선 보정 네 네 네 네 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은 보통 강제
무기 고르기 논리 아니요 네 네 네 MvM에서 덜 적절
엄폐 재장전 아니요 아니요 네 네 MvM 아님
CP 수비수 방랑 10% 50% 75% 90% MvM 아님
CP 점령 막기 아니요 50% 네 네 MvM 아님

결론

Minigun으로 조준하는 TF2 Heavy 봇

이 모든 것은 Valve의 작심 시스템을 비춰요. 완전히 결정적인 점수와 확률, 다만 공식 문서가 전혀 없어요. 이 다이빙 뒤에 제가 간직하는 지점은요.

  1. "실력"은 독립 커서 모음이지 전역 배율이 아니에요. 반응 시간과 조준 속도, 각 전술 행동이 따로 바뀌고, 일부(Spy 추적 속도와 MvM 백스탭 각도)는 수준에 무관한 하드코딩 덮어쓰기가 있어요.
  2. 일부는 정말 버그지 낡은 것이 아니에요. 2010년 이후 얼어붙은 조용한 무기 목록, 정당한 이유 없이 발 조준 논리가 없는 Cow Mangler, 제대로 디컴파일되는 데 몇 년 걸린 Sniper 내적 검사. 17년 된 코드베이스처럼 Valve AI 코드에 흉터가 있어요.
  3. 이 모든 것을 쓸 수 있어요. 보통 Sniper 봇이 헤드샷하지 않고, 쉬움 Pyro가 말 그대로 여러분 로켓을 반사할 수 없고, 쉬움 Spy가 정면에서 찌르려고 한다는 것을 아세요. 운이 아니에요. 기술 명세예요.

원본 코드 다이빙을 가능하게 한 sigsegv에게 큰 감사, 봇 명령과 맵 지원 토대 문서의 TF2 위키에게, 17년 된 봇 AI를 계속 뒤져서 왜 그렇게 하는지 정확히 이해하는 커뮤니티 모두에게 감사해요.

TF2 botları rastgele değil: her zorluk parametresini yeniden keşfettim

Görüş, nişan, backstab açıları, headshot mantığı, bilinen her hata, Valve hiçbir şeyi belgelemedi. O yüzden kodu kazdık ve hepsini eksiksiz bir teknik föye dönüştürdük.

Giriş

Roketatarla nişan alan TF2 Asker botu

Her TF2 oyuncusu bunu en az bir kez söylemiştir: "bu bot hile yapıyor." Ya da tersi: "bu Kolay bot neden roketleri yemeye dikilip duruyor." "Kolay", "Normal", "Zor" ve "Uzman"ın kaputun altında gerçekte ne anlama geldiğini kimse bilmez: Valve dört zorluk etiketi gönderdi ve tam sıfır belgeleme.

O yüzden bir grup (ben, awimii, Mush The Possum ve oyunun derlenmiş kodunu gerçekten kazan büyük kısmı yapan sigsegv) TFBot davranışına dair eksiksiz bir araştırma belgesi topladı. Her mekanik, bilinen her hata, sabit kodlanmış her olasılık. Bu makale tam tutanaktır, özet sürüm değil. Bir Bonk alın, uzun olacak.


Bölüm I: Temeller

Bot ve Kukla Bot

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

  • Yapay zekâ Botları (TFBotlar): gerçek yapay zekâ, Valveın Left 4 Dead serisi için kullandığı aynı PlayerBot/Infected çerçevesi üstüne inşa edilmiş. Rastgele bir sınıf seçerler, hedefi oynarlar, sv_cheats olmadan çalışırlar ve gerçek bir oyuncu gibi başarımları tetiklerler.
  • Kukla Botlar: sıfır yapay zekâ, kendi kendine hareket ya da eylem yapamaz. Yalnızca manuel kontrol için vardırlar: bir oyuncu onları izlemeye, nişan almaya ve ateş etmeye zorlayabilir. Esas olarak testler ya da sinematik ekran görüntüleri ve videoları için kullanılır. Onları doğurmak sv_cheats 1 gerektirir, bu da oturum için başarımları devre dışı bırakır.

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

Yapay zekâ botlarına (aşağı yukarı) ne yaptırabiliriz

TFBotlar doğrudan kontrol edilemez ama bazı şeyleri yapmaya teşvik edilebilirler:

  • Doğru sesli komutları kullanırsan herhangi bir botu (dost ya da düşman) nişangâhınla hedefleyip alay ettirebilirsin.
  • Dost bir Medic botu "Medic!" sesli komutunu kullanırsan seni iyileştirir.
  • Seni iyileştiren bir Medic botunun hazır UberChargeı varsa "Go go go!" ya da "Chargeı etkinleştir!" demek chargeı hemen tetikletir.
  • Hazır chargeı olan bir Medic botu, kendisi ya da iyileştirme hedefi ciddi hasar alır almaz sesli komutsuz otomatik etkinleştirir.
  • Botlar yakın takım arkadaşlarıyla kendiliğinden ikili alaylar (High Five) ya da grup alayları (Conga) yaparlar.

Botları desteklenmeyen haritalarda çalıştırma

Botlar nerede yürüyebileceklerini bilmek için bir gezinme ağına bağlıdır ve çoğu topluluk haritası bunu sağlamaz. Zorlamak için:

  1. sv_cheats 1
  2. nav_generate: başlangıç navmeshini inşa eder, ilerleme konsolda gösterilir
  3. Oyunun yolları üretmeyi bitirmesini bekle
  4. İsteğe bağlı, nav_edit 1 ile kötü gezinme verilerini manuel düzelt
  5. Sunucuyu yeniden yükle ya da yeniden başlat (bu adımı atlamak başarımları devre dışı bırakır)
  6. Botları doğurmak için tf_bot_add <sayı>

Uyarı: sunucuda aktif botlar varken navmeshi değiştirmek oyunu çökertebilir. Ağ mevcut olduktan sonra sonraki oturumlar için yeniden üretmen gerekmez: botları sadece tf_bot_add ile ekle.

Otomatik üretilmiş ağlar Kontrol Noktası, King of the Hill, Payload ve CTF haritalarında en iyi çalışır. Mannpower haritalarında botlar varsayılan CTF benzeri davranış benimser ama kancaları ya da powerupları zar zor kullanır. Bir haritanın bot yapay zekâsının tanıdığı bir hedefi yok ama doğma odası varlığı varsa tf_bot_offense_must_push_time 0 ayarlamak botların yine de savaşmasını sağlar.

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

Güncel durum, harita harita

Hatless güncellemesi sayesinde tarihsel hatalı Spy dahil her sınıf artık düzgün çalışıyor. Botlar çoğu resmi KOTH haritasında, bazı Payload haritalarında, Dustbowl/Gorge Saldırı-Savunma ve CTF/Mann Manor haritalarında düzgün davranır. Son ikisinde onları doğrudan tf_bot_add ile doğuramazsın. Desteklenmeyen haritalarda (yukarıdaki nav_generate süreciyle) çalışırlar ama gerçek bir oyuncuyu taklitte belirgin kötüdürler.

PLR haritaları umutsuz vakadır: botlar Hightowerda bariyerleri geçemez ve köşelerde sıkışır, diğer tüm PLR haritalarında sadece oynamak yerine dans partisi yaparlar. Belki bir gün düzelir, belki öyle kalır.

Botların genel davranışı

Her botun seviyesinden bağımsız yaptığı şeylerin karması:

  • Botlar yalnızca temel yüklemeleri kullanır (bir eklenti onlara standart dışı silahlar dayatabilir ama vanilla botlar kendilerininkini asla seçmez).
  • Kolay botlar ikincil silahını zar zor kullanır. Üst seviyeler ana şarjör boşalır boşalmaz ya da mesafeyi kapatmak için ikincile geçer.
  • Botlar gelişmiş hareket tekniklerini görmezden gelir: roket zıplaması yok, bina yeri değişimi yok.
  • Bir bot kill sonrası, ateş altındayken bile alay edebilir; düşman istihbaratını taşıyorsa hariç ve bu kural MvMde de geçerlidir.
  • Kılık değiştirmiş Spy botları (oyuncu ya da yapay zekâ) diğer botlarca doğru görmezden gelinir: bir düşmana dokunana, bir şeyi sabote edene, ateş edene ya da yakınında görünmez olana kadar. Bir kez "keşfedilince" o belirli bot/oyuncu, görünmezken kılık değiştirip, ölüp ya da Dead Ringer ile ölüm taklidi yapana kadar Spy olarak ezberlenir.
  • Pyro botları Normal seviyeden itibaren Compression Blastı bol kullanır.
  • Medic botları "Medic!" diye spamlesen bile Sniperlar (ve daha az ölçüde Engineerlar) hariç herkeste iyileştirmeyi önceler.
  • Medic botları Heavy, Soldier, Demoman ve Pyrolara yönelir: özellikle bu sınıfları bir insan oynadığında. Bu ilgi bu rollerde bir insanın varlığını izler.
  • Botlar Saldırı/Savunma ve Payload haritalarında hazırlık süresinde pozisyonda kalır; serbest hareket eden Engineer, Sniper ve Spyler hariç (Demoman botlarının da yapışkan bombaları önceden yerleştirmesine izin verilir).
  • Engineer botları hedeflerinin yolunda değilse dost başka bir Engineerin yapılarını asla yükseltmez ya da devre dışı bırakmaz. Bazen bariz görünse bile kendi taretini tamir etmez.
  • Fark edilmiş Spy botları bıçaklamaya zorlamak yerine tabancaya geçip geri çekilir.
  • Bir sentryi bulmuş (genelde bir kez üzerinde ölerek) Demoman botları geometri izin verdiğinde menzili dışından duvar ve tavanlardan kavisle yapışkan bombaları mükemmel atabilir.
  • Hedef bulamayınca nişan almış Sniper botları "Negatives." seslendirmelerinden birini kullanır.
  • Dost Medicler kılık değiştirmiş bir Spyi tereddütsüz iyileştirir.

Bilinen sorunlar / hatalar

Belge uzun süredir bir sürü tuhaflık listeler:

  • Botlar bazı statik aksesuarların içinden yürümeye ya da ateş etmeye çalışabilir.
  • Bir oyuncu/bot her maskesini düşürdüğünde, kılık değiştirdiğinde ya da kendini belli ettiğinde yakın botlar onu "görür" ve tepki için döner: olay gerçek görüş alanları dışında olsa bile. Bu sese dayalı değildir; görüş testinin bir atlatmasıdır.
  • Nadiren botlar bir Engineer ışınlayıcı kullanırken fiziksel birbirine sıkışıp kalabilir.
  • Botların sesli komutları (ör. "Spy!", "İleri!") oyuncularınki gibi sohbette metin olarak görünmez.
  • Aktif birini iyileştiren bir Medic botu kritik HPde bile gelen ateşlerden kaçmaz ya da sağlık kiti almaz.
  • Botlar ikili alay sırasında hareket etmeye devam edebilir, bu Festive Critical Strikeın amaçlanan etkisini bozar.
  • Yakın zamanda yaralanmış Medic botları menzilde Syringe Gun kullanmayı genelde reddeder, yakın dövüşü tercih eder (ya da çok nadir durumda Medi Gun ışınının kendisiyle sana dokunmaya çalışır).
  • Medic botları Syringe Gun atışları için yerçekimini telafi etmez: muhtemelen silah yapay zekâ kodunda hitscan dışı olarak doğru işaretlenmemiştir.
  • Spy botları bir görünmez Spyi (oyuncu ya da yapay zekâ), o Spy bir kez keşfedildiyse görüp izleyebilir; izleyen botun beceri seviyesinden bağımsız.
  • Bir oyuncu Spy kendi takımının sınıfına bürünse bile düşmana çarpmak onu yine de maskesini düşürür (botlar kendilerine bunu asla yapmaz çünkü botlar asla kendi takımına bürünmez).
  • Botlar otomatik takım dengelemeye saygı duyar: botları bir tarafa yığmaya çalışırsan önce mp_teams_unbalance_limit 0 kullanmak gerekir.
  • Engineer botları yok edilene kadar kendi yapılarını tamamen görmezden gelebilir.
  • Heavy botları özellikle Zor seviyenin altında cephanesi bitmişken Minigun ateşlemeyi bazen dener.
  • Kaybeden takımın Medic botları Yakın dövüş fazasında yakın düşman yokken ara sıra intihar eder: insan oyuncunun denese bile üretemeyeceği bir şey.
  • Yükleme ekranında takım önizlemeni BLU yapmak RED botlarının sana görsel BLU işlenmiş görünmesine neden olur.
  • Yakın dövüş silahı çekili botlar cephane aldıktan sonra bile bazen silah değiştirmeyi reddeder.
  • Jungle Infernodan sonra açık parametrelerle doğmuş botlar (ör. tf_bot_add 5 pyro bleu normal) kendi doğma odasında anında ölebilir. Düzeltme: tf_bot_reevaluate_class_in_spawnroom 0 (sv_cheats 1 gerektirir).

Yapay zekâ isimleri

Bot isimleri TF2, diğer Valve oyunları ve programlama kültürüne göndermelerden büyük bir havuzdan alınır, büyük ölçüde topluluk Steam forumlarında belirli olanları istemeyi bırakmadığı için. Listeden bir örnek: 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 aynı tarzda onlarcası.

Üretime hiç gönderilmemiş sızmış kaynak derlemede bulunmuş, nedenleri pek belli olmayan bir grup isim de var: esas olarak Last Dragon ve The Fifth Element göndermeleri: John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh? ve I'm your huckleberry.

Bunların hepsini kendin değiştirebilirsin: tf_bot_add heavyweapons blue "Blu Hoovy" "Blu Hoovy" adlı bir BLU Heavy doğurur.


Bölüm II: Orijinal Botlar / TFBotlar, Beceri Seviyelerine Dalış

Sigsegvin orijinal çerçevesi hâlâ geçerli: Uzman botların Kolay botlardan açık üstün olduğu bellidir ama Valve ne kadar ya da neden olduğunu hiç açıklamadı. O yüzden bilmenin tek yolu kodu okumaktır. İşte beceriyle evrilen her mekanik.

Zorluğu ayarlamak

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

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

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

MvM popfileları

Mann vs. Machinede popfiledaki her TFBot doğma bloğunun opsiyonel bir Skill anahtarı vardır. Anahtar yokluğu Kolay seviyeye karşılık gelir. Valve görevlerinde: Devler neredeyse hep Uzmandır, Engineerlar ve Spylar neredeyse hep Uzmandır ve Sniperlar genelde Zordur (ara sıra Uzman). Dalga sırasında harita olaylarına göre botları dinamik değiştirmek için EventChangeAttributes (Two Cities güncellemesinde eklendi) kullanırsan bot becerisi anında değiştirebileceğin özelliklerden biridir.

Sonsuz MvM Modu

Sonsuz mod hiç resmi gönderilmedi ama içinde botlar oyuncular gibi paralarını yükseltmelere harcar; oyunda yapay zekâ beceri seviyesini artıran bota özel yükseltme dahil.

bot_generator varlığı

Büyük ölçüde belgelenmemiş karanlık bir varlık, eğitim modunda ve belki erken MvM geliştirmede kullanılmış varsayılır. Seviyeyi kontrol için SetDifficulty girdisini sunar. Ötesi soğuk izdir: Valve onu hiç belgelemedi ve kimse davranışını tamamen haritalamadı.

Göz parıltısı rengi

MvM robotlarının beceri seviyesiyle rengi değişen bir göz parıltısı parçacığı vardır, topluluk dışında kimsenin açıklamadığı görsel bir gösterge:

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

Bekleme pozisyonunda TF2 Heavy botu

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

Görüş alanına bir şey girince bir bot anında tepki vermez: tehdidi yapay zekânın geri kalanının tanımasına bile izin verilmeden önce sabit kodlanmış bir gecikme vardır:

Beceri Minimum tanıma süresi
Kolay 1,00 sn
Normal 0,50 sn
Zor 0,30 sn
Uzman 0,20 sn

"Kolay botlar aptal görünür" etkisinin özü tek bir sayıdadır: bir Kolay bot seni fark edince daha kötü nişan almaz, varlığını fark etmesi beş kat uzun sürer.

Nişan: izleme hızı

Botlar seni sürekli izlemez. Konumunu ve hızını sabit aralıkla örnekler ve oradan düz bir çizgi öngörür:

Beceri Yeniden hesaplama aralığı Eşdeğer hız
Kolay 1,00 sn 1x/sn
Normal 0,25 sn 4x/sn
Zor 0,10 sn 10x/sn
Uzman 0,05 sn 20x/sn

İstisna: Spy botları gerçek beceri seviyesi ne olursa olsun Normal izleme hızıyla sabit kodlanmıştır: Uzman bir Spy hep Normal bir bot gibi nişan alır. Hareketli 1x ve 20x farkını görmek istersen yan yana karşılaştıran herkese açık bir tanıtım videosu da vardır.

Nişan: silaha özel beceri

Botlar sadece kütle merkezine nişan almaz: silaha göre mantıkları vardır, bazen gerçekten hatalı:

Bombaatar ve Yapışkan Bomba Atar. Tüm beceri seviyeleri tf_bot_ballistic_elevation_rate cvarının sabit değerini kullanarak dikey yayı telafi eder. Bu telafi yalnızca temel silah IDsi için etkinleştiği için daha hızlı mermili varyantlar (Loch-n-Load, mermi hızı değiştiricili her şey) doğru ayarlanmış yaya sahip değildir. Ve özellikle silah IDsiyle bağlı olduğu için Loose Cannon (farklı bir ID) hiç yay telafisi almaz.

Huntsman. Kolay botlar ok düşmesini telafi etmez ve headshot aramaz. Normal seviye botlar yayı telafi eder ama yalnızca 150 HU altında kafayı hedefler. Zor/Uzman botlar hep kafayı hedefler.

Roketatar. 150 HU ötesinde Kolay olmayan botlar kütle merkezi yerine ayaklarını hedefler, alan hasarı ve itme şansını maksimize eder. 150 HU altında headshotlara geçer. Kolay botlar mesafeden bağımsız hep kütle merkezini hedefler. Bu da silah IDsiyle kilitlidir: Direct Hit ve Cow Mangler bu davranışı kalıtmaz. Direct Hit için mantıklıdır (suistimal edilecek alan etkisi yok); Cow Mangler için sıfır anlam: yapay zekânın bu kısmı silahın varlığından öncedir ve hiç gözden geçirilmemiştir.

Keskin nişancı tüfekleri. Kolay gövdeyi hedefler. Normal gövdeden kafaya ~%33 hedefler. Zor/Uzman doğrudan kafayı hedefler. MvMde daha az önemlidir; bot headshotları zaten hasar bonusu almaz.

İşitme: sessiz atışlara duyarlılık

Her silah sesi, duvarlar ardından bile yakındaki botları atıcının konumuna karşı 3000 HUye kadar %100 fark edilme şansıyla uyarır (tf_bot_notice_gunfire_range). Ama bir alt küme silah "sessiz" işaretlidir: yalnızca 500 HU içinde duyulur (tf_bot_notice_quiet_gunfire_range) ve o zaman bile beceriye bağlı şansla:

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

Bu olasılık son 3 saniyede gürültülü bir atış duyulduysa yarıya iner: güçlü sesler zayıf sesleri maskeler.

Sessiz silah ID listesi Aralık 2010dan beri güncellenmedi. Yeni ID kullanan sonraki her ekleme mantıksal ne kadar sessiz olması gerekirse gereksin varsayılan gürültülü sayılır; daha eski bir IDyi yeniden kullanmadıkça. Somut olarak:

Silah IDsi Kapsar
TF_WEAPON_KNIFE Tüm Spy bıçakları
TF_WEAPON_FISTS Heavye özel yumruklar (çok sınıflı yumruğu aslında TF_WEAPON_FIREAXEdir)
TF_WEAPON_PDA Doğrudan kullanılmadığı varsayılır
TF_WEAPON_PDA_ENGINEER_BUILD Engineer inşa PDAi
TF_WEAPON_PDA_ENGINEER_DESTROY Engineer yıkım PDAi
TF_WEAPON_PDA_SPY Spy kılık kiti
TF_WEAPON_BUILDER Spy/Engineer/Sabotajcı alet kiti
TF_WEAPON_MEDIGUN Tüm Medi Gunlar
TF_WEAPON_DISPENSER Muhtemelen kullanılmaz (Dispenserler eşya, silah değil)
TF_WEAPON_INVIS Tüm Spy görünmezlik saatleri
TF_WEAPON_FLAREGUN Manmelter hariç tüm Pyro işaret fişekleri
TF_WEAPON_LUNCHBOX Sandviç, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (Mad Milk değil: ayrı ID, sessiz değil)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Listenin çürümesinin klasik örneği: Manmelter kendi ID'sini aldı (TF_WEAPON_RAYGUN_REVENGE), sessiz silah listesi dondurulduktan sonra eklendi, o yüzden pratik her anlamda işaret fişeği olmasına rağmen gürültülü sayılır. Daha da sonra çıkan Scorch Shot temel TF_WEAPON_FLAREGUN IDyi yeniden kullanır ve bu yüzden hâlâ sessiz sayılır. Saçma ama kod bu.

Strateji: tehdit önceliği

Aynı anda birden çok düşman görünürken botlar mesafeyi, üzerlerine ateş açılıp açılmadığını ve Kolayın üstünde ana tehdidin iyileştirilip iyileştirilmediğini ağırlıklandırır:

Beceri Onun yerine şifacıyı mı hedefler?
Kolay Hayır
Normal %50 şans
Zor Evet
Uzman Evet

500 HU ötesindeki düşmanlar normalde acil dışı olarak önceliksizleştirilir. İstisnalar: Zor/Uzman botları uzak Medic ve Engineerları hep acil tehdit sayar ve kabaca sana doğru nişan alan her düşman Sniper mesafe ve beceriden bağımsız hep acil sayılır.

Beceri Uzak Medic/Engineer/Nişan alan Sniper = acil tehdit mi?
Kolay/Normal Hayır
Zor/Uzman Evet

Bu Sniper kontrolünün anlatmayı hep sevdiğim şaşırtıcı bir hikâyesi vardır. Sigsegvin orijinal yazısı oyunun sniperın nişan vektörü ile botun göreli konumu arasındaki nokta çarpımın tam sıfır olmasını gerektirdiğini varsayıyordu: kayan noktada neredeyse hiç tetiklenmeyecek kadar hassas bir karşılaştırma, tüm işlevi fiilen ölü kod yapardı. Sonra yayınlanan bir düzeltme (daha temiz bir Hex-Rays derlemesine borçlu) gerçek kontrolün nokta çarpım > 0 olduğunu gösterdi: doğrudan sana dönükten sana dik olana kadar yüzü dönük her Sniper acil tehdit sayılır; dikten arkası dönüğe giden hiçbir şey sayılmaz. Orijinal yanlış okuma kayan noktalı SSE karşılaştırmasının kötü derlemesinden geliyordu. AAA ikili üzerinde tersine mühendislik yaklaşık bir egzersiz olmaya devam ediyor.

Hareket: kaçınma

Kolay botlar asla kaçınmaz, nokta. Normal ve üstü botlar bir savaş silahı tutarken, son 3 saniyede bir düşman görmüşken ve bu düşmanın üzerlerinde görüş hattı varken sola/sağa kaçınır (%33 sol, %33 sağ, %33 hiçbir şey yapma, tespitli çukurlara karşı ağırlıklı).

Şu durumlardan biri geçerliyse kaçınMAzlar: DisableDodge özniteliği ayarlı, mevcut davranış acele et diyor, şu an yenilmez (herhangi bir uber), tam alay/tahrikte, Engineer oynuyor, Spy olarak görünmez ya da kılık değiştirmiş, Sniper olarak nişan alıyor ya da Heavy olarak dönüyor, ya da Huntsmanı geriyor.

Hareket: düşmanlara çarpmaktan kaçınma

Normalin üstünde botlar hareket ederken özellikle düşmanların içine girmemeye çalışır:

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

Pratikte bu yalnızca Spy botları için önemlidir: düşman oyuncuyla sakar bir çarpışmadan kaçınmak kılık bozan türden bir şeydir.

Pyro: airblast ustalığı

airblast iki şeye yarar: mermileri yansıtmak (PvP ve MvM) ve düşmanları kenarlardan itmek (yalnızca PvP). Botun geçerli bir fırsat karşısında tetiğe basıp basmaması beceriye dayalı yazı turadır:

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

Kolay Pyro botları kelimenin tam anlamıyla airblast yapamaz: çekiliş asla başarmayacak şekilde sabit kodlanmıştır, sadece "nadiren" değil.

Spy: kılık etkinliği

Beceriye göre iki ayrı eksen evrilir. Kılık seçimi:

Beceri Kılık yöntemi
Kolay/Normal Rastgele sınıf, düşman takımın gerçekte ne oynadığını görmezden gelir
Zor/Uzman Gerçek bir düşman oyuncu seçer ve tam sınıfını kopyalar

Kılıkta davranış:

Beceri Kılıkta/görünmezlikte davranış
Kolay/Normal Görünce düşman oyunculara diker (şüpheli)
Zor/Uzman Bilerek göz temasından kaçınır (daha inandırıcı)

Spy: backstab saldırganlığı

Uzun menzilde (300 HUye kadar, tf_bot_spy_knife_range) bir Spy botu kurbanı görebiliyorsa ve kurbanın sırtı en az kısmen dönükse backstabe girişir. Beceri sırt açısının ne kadar merkez dışı olabileceğini belirler:

Beceri Açı toleransı
Kolay Doğrudan yüzüne bakıyorsan bile dener
Normal Sırtından ±45°
Zor Sırtından ±78°
Uzman Sırtından ±90° (tam 180° arka yay)

Kolay Spy botları işlevsel intiharcıdır: gözlerinin içine bakan birini bıçaklamaya çalışırlar. İstisna: Mann vs. Machinede her Spy botu gerçek beceri seviyesi ne olursa olsun Normal açı kısıtına zorlanır.

Taktikler: silah seçimi

Bu mantık yalnızca Kolayın üstündeki seviyeleri ilgilendirir, MvMde ilgisi azdır çünkü botların orada genelde katı silah kısıtları vardır:

  • Scout: birincilin şarjörü boşalınca ikincile geçer.
  • Soldier: şarjör boşsa ve hedef 500 HU altındaysa ikincile geçer.
  • Sniper: 750 HU altındaki hedefler için ikincile geçer.
  • Pyro: hedef Soldier ya da Demoman değilse 750 HU üstündeki hedefler için ikincile geçer.

Taktikler: siperde yeniden doldurma

MvMde olmayan mantık. Botun mevcut davranışı geri çekilmesini söylemiyorsa, ana şarjörü boşsa ve ubersiz savunmasız kalıyorsa üst seviye botlar boş silahla suratına tıklamak yerine yeniden doldurmak için geçici sipere çekilir:

Beceri Doldurmak için çekilir mi?
Kolay Hayır
Normal Hayır
Zor Evet
Uzman Evet

CP Modu: savunmacı başıboşluğu

MvMde olmayan mantık. Bir kontrol noktasını savunurken üst seviye botların noktayı kill kovalamak için terk etme ("ara ve yok et") olasılığı daha yüksektir ama yalnızca tf_bot_defense_must_defend_time üzerinde yeterli süre varken:

Beceri Başıboşluk şansı
Kolay %10
Normal %50
Zor %75
Uzman %90

CP Modu: ele geçirme engelleme

MvMde olmayan mantık. Düşman ele geçirme girişimine itiraz eden savunmacı botlar:

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

Tam özet tablosu

Yön Kolay Normal Zor Uzman Notlar
Görüş: tanıma süresi 1,00 sn 0,50 sn 0,30 sn 0,20 sn
Nişan: izleme hızı 1x/sn 4x/sn 10x/sn 20x/sn Spylar hep Normal kullanır
Bombaatar/yapışkan yay telafisi Evet Evet Evet Evet Loose Cannon muaf
Huntsman dikey telafisi Hayır Evet Evet Evet
Huntsman headshotları Hayır <150 HU Evet Evet
Roketatar ayak atışı Hayır Evet Evet Evet Direct Hit ve Cow Mangler muaf
Keskin nişancı tüfeği nişan noktası Gövde kafaya ~%33 Kafa Kafa
Sessiz atışları fark etme şansı %10 %30 %60 %90 Gürültülü atışlarla maskelenirse yarıya iner
Şifacıyı hedefler Hayır %50 Evet Evet
Uzak Medic/Engineer/Nişan alan Sniper = 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 Spy için önemli
airblast tetikleme şansı %0 %50 %90 %100
Spy kılık sınıfı seçimi Rastgele Rastgele Gerçek düşmana uyar Gerçek düşmana uyar
Kılıkta Spy göz teması Diker (bariz) Diker Kaçınır (inandırıcı) Kaçınır
Spy backstab açısı ~0° ±45° ±78° ±90° MvM Normal zorlar
Silah seçimi mantığı Hayır Evet Evet Evet MvMde daha az ilgili
Siperde yeniden doldurma Hayır Hayır Evet Evet MvMde yok
CP savunmacı başıboşluğu %10 %50 %75 %90 MvMde yok
CP ele geçirme engelleme Hayır %50 Evet Evet MvMde yok

Sonuç

Minigunla nişan alan TF2 Heavy botu

Bütün bunlar Valvedan bilinçli bir sistemi yansıtır: tamamen deterministik skorlar ve olasılıklar, sadece resmi hiç belgelenmemiş. Bu dalıştan sonra aklımda kalan noktalar:

  1. "Beceri" global bir çarpan değil, bağımsız imleçler kümesidir. Tepki süresi, nişan hızı ve her taktik davranış ayrı evrilir ve bazıları (Spy izleme hızı, MvM backstab açısı) seviyeden bağımsız sabit kodlanmış geçersiz kılmalara sahiptir.
  2. Bir kısmı gerçekten hatalı, sadece eski değil. 2010dan beri donmuş sessiz silah listesi, hiçbir geçerli nedensiz ayak atış mantığsız Cow Mangler, doğru derlenmesi yıllar alan Sniper nokta çarpım kontrolü: Valve yapay zekâ kodunun 17 yıllık herhangi bir kod tabanı gibi yara izleri vardır.
  3. Bütün bunları kullanabilirsin. Normalde bir Sniper botunun sana headshot atmayacağını, Kolay bir Pyronun roketini kelimenin tam anlamıyla yansıtamayacağını, Kolay bir Spyin suratına bıçaklamaya çalışacağını bil. Bu şans değildir. Bu teknik föydür.

Kodu orijinal kazan ve bunun çoğunu mümkün kılan sigsegve, bot komutları ve harita desteğine dair temel belgeler için TF2 wikisine ve 17 yıllık bir bot yapay zekâsını tam ne yaptığını anlamak için kurcalamaya devam eden topluluktaki herkese muazzam teşekkürler.

I bot di TF2 non sono casuali: ho riscoperto ogni parametro di difficoltà

Visione, mira, angoli di backstab, logica di headshot, ogni bug noto: Valve non ha mai documentato niente. Così abbiamo scavato nel codice e trasformato tutto in una scheda tecnica completa.

Introduzione

Soldat bot TF2 visant avec un lance-roquettes

Ogni giocatore di TF2 l'ha detto almeno una volta: "questo bot bara." O l'inverso: "perché questo bot Facile resta piantato a mangiare razzi." Nessuno sa davvero cosa "Facile", "Normale", "Difficile" ed "Esperto" significhino sotto il cofano: Valve ha spedito quattro etichette di difficoltà e esattamente zero documentazione.

Così un gruppo di noi (io, awimii, Mush The Possum, con una grossa parte del lavoro di base fatto da sigsegv, che ha davvero scavato nel codice decompilato del gioco) ha riunito un documento di ricerca completo sul comportamento dei TFBot. Ogni meccanica, ogni bug noto, ogni probabilità hardcodata. Questo articolo è il resoconto integrale, non la versione condensata. Prendete un Bonk, sarà lunga.


Capitolo I: le basi

Bot contro Bot Marionetta

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

  • Bot IA (TFBot): vera IA, costruita sullo stesso framework PlayerBot/Infected che Valve ha usato per la serie Left 4 Dead. Scelgono una classe casuale, giocano l'obiettivo, funzionano senza sv_cheats e attivano gli achievement come un vero giocatore.
  • Bot Marionetta: zero IA, incapaci di muoversi o agire da soli. Esistono solo per essere controllati manualmente: un giocatore può forzarli a seguire, mirare e sparare. Usati principalmente per test o per fare screenshot e video cinematici. Farli apparire richiede sv_cheats 1, il che disattiva anche gli achievement per la sessione.

Questo articolo riguarda interamente il primo tipo.

Cosa possiamo (più o meno) dire ai bot IA di fare

I TFBot non sono direttamente controllabili, ma possiamo spingerli a fare certe cose:

  • Punta qualsiasi bot (alleato o nemico) col tuo crosshair e ti schernirà se usi i giusti comandi vocali.
  • Un bot Medic alleato ti cura se usi il comando vocale "Medic!"
  • Se un bot Medic ti cura e ha una UberCharge pronta, dire "Go go go!" o "Attiva la carica!" lo fa scattare la carica subito.
  • Un bot Medic con una carica pronta l'attiva automaticamente appena lui stesso o il suo bersaglio di cura subisce danni seri, senza comando vocale necessario.
  • I bot eseguono spontaneamente scherni in duo (High Five) o scherni di gruppo (Conga) con compagni vicini.

Far funzionare i bot su mappe non supportate

I bot dipendono da una mesh di navigazione per sapere dove hanno diritto di camminare, e quasi tutte le mappe community non ne forniscono una. Per forzare:

  1. sv_cheats 1
  2. nav_generate: costruisce la navmesh iniziale, progressione mostrata in console
  3. Aspetta che il gioco finisca di generare i percorsi
  4. Opzionalmente, correggi manualmente i cattivi dati di navigazione con nav_edit 1
  5. Ricarica o riavvia il server (saltare questo passo disattiva gli achievement)
  6. tf_bot_add <numero> per far apparire i bot

Avviso: modificare la navmesh mentre ci sono bot attivi sul server può piantare il gioco. Una volta che la mesh esiste, non devi rigenerarla per le sessioni future: aggiungi semplicemente i bot con tf_bot_add.

Le mesh auto-generate funzionano meglio sulle mappe Punto di Controllo, King of the Hill, Payload e CTF. Sulle mappe Mannpower, i bot adottano di default un comportamento tipo CTF ma usano a malapena rampini o powerup. Se una mappa non ha un obiettivo che l'IA del bot riconosce ma ha un'entità di stanza di spawn, definire tf_bot_offense_must_push_time 0 permette ai bot di combattere comunque.

(Fonte per questa sezione: la pagina Bot del wiki ufficiale TF2.)

Stato attuale, mappa per mappa

Grazie all'aggiornamento Hatless, ogni classe funziona correttamente ora, compreso lo Spy storicamente buggato. I bot si comportano correttamente sulla maggior parte delle mappe KOTH ufficiali, certe mappe Payload, Dustbowl/Gorge Attack-Defense e le mappe CTF/Mann Manor. Su queste ultime due, non puoi farli apparire direttamente con tf_bot_add. Sulle mappe non supportate (via il processo nav_generate qui sopra), funzionano, ma sono nettamente meno bravi a imitare un vero giocatore.

Le mappe PLR sono una causa persa: i bot non possono superare le barriere su Hightower e si incastrano negli angoli, e su tutte le altre mappe PLR fanno solo... una festa danzante invece di giocare. Forse sarà corretto un giorno, forse resterà così.

Comportamento generale dei bot

Un calderone di cose che ogni bot fa indipendentemente dal suo livello:

  • I bot usano solo loadout di base (un plugin può forzarli ad armi non standard, ma i bot vanilla non scelgono mai le loro).
  • I bot Facili usano a malapena la loro arma secondaria. Le difficoltà superiori passano all'arma secondaria appena il caricatore principale è vuoto, o per compensare la distanza.
  • I bot ignorano le tecniche di movimento avanzate: niente rocket jump, niente rilocazione di edifici.
  • Dopo una kill, un bot può schernire, anche sotto il fuoco, a meno che porti l'intelligence nemica, e questa regola si applica anche in MvM.
  • I bot Spy travestiti (giocatore o IA) sono correttamente ignorati dagli altri bot: finché non toccano un nemico, sabotano qualcosa, sparano o diventano invisibili vicino a uno. Una volta "scoperti", quel bot/giocatore specifico è memorizzato come Spy finché non cambia travestimento restando invisibile, muore o finge la morte col Dead Ringer.
  • I bot Pyro usano la Compression Blast liberamente dal livello Normale.
  • I bot Medic priorizzano le cure su tutti tranne gli Sniper (e, in misura minore, gli Engineer), anche se spami "Medic!" come tale.
  • I bot Medic gravitano verso Heavy, Soldier, Demoman e Pyro: specificamente quando un umano gioca queste classi. Questa attenzione segue la presenza di un umano in questi ruoli.
  • I bot restano in posizione durante il tempo di preparazione sulle mappe Attack/Defense e Payload, tranne Engineer, Sniper e Spy, che si muovono liberamente (i bot Demoman sono anche autorizzati a pre-piazzare sticky bomb).
  • I bot Engineer non migliorano né disattivano mai le costruzioni di un altro Engineer alleato, a meno che questa costruzione si trovi sul percorso del loro bersaglio. A volte semplicemente non riparano la loro torretta, anche quando sembra ovvio.
  • I bot Spy beccati passano al loro revolver e indietreggiano invece di forzare un colpo di coltello.
  • I bot Demoman che hanno localizzato una sentry (generalmente morendoci sopra una volta) possono lanciare perfettamente sticky bomb sopra da fuori la sua portata, in arco attraverso muri e soffitti quando la geometria lo permette.
  • I bot Sniper che non trovano un bersaglio dopo aver mirato usano una delle linee vocali "Negative."
  • I Medic alleati curano uno Spy travestito senza esitazione.

Problemi / bug noti

Il documento elenca un buon numero di stranezze di lunga data:

  • I bot possono provare a camminare o sparare attraverso certi prop statici.
  • Ogni volta che un giocatore/bot si smaschera, si traveste o si rivela, i bot vicini lo "vedono" e si girano per reagire: anche se l'evento è avvenuto fuori dal loro reale campo visivo. Non è basato sul suono; è una scappatoia del test di visione.
  • Raramente, i bot possono restare fisicamente incastrati insieme usando un teletrasporto di Engineer.
  • I comandi vocali dei bot (es. "Spy!", "Avanti!") non si mostrano in testo nella chat come quelli dei giocatori.
  • Un bot Medic che cura attivamente qualcuno non schiverà i colpi in arrivo né prenderà kit di cura, anche a PV critici.
  • I bot possono continuare a muoversi durante uno scherno in duo, il che rompe l'effetto previsto del Festive Critical Strike.
  • I bot Medic da poco feriti rifiutano spesso di usare la Syringe Gun a distanza, preferendo il corpo a corpo (o, in casi molto rari, provando a toccarti col raggio del Medi Gun stesso).
  • I bot Medic non compensano la gravità per i colpi della Syringe Gun: probabilmente perché l'arma non è correttamente segnata come non-hitscan nel codice IA.
  • I bot Spy possono vedere e seguire uno Spy invisibile (giocatore o IA) se questo Spy è già stato scoperto una volta, indipendentemente dal livello di abilità del bot che lo segue.
  • Anche se un giocatore-Spy si traveste da classe della sua squadra, urtare un nemico lo smaschera comunque (i bot non fanno mai questo a se stessi, dato che i bot non si travestono mai da loro squadra).
  • I bot rispettano il bilanciamento automatico delle squadre: se provi ad ammassare bot da un lato, devi prima usare mp_teams_unbalance_limit 0.
  • I bot Engineer possono ignorare completamente le proprie costruzioni finché non sono distrutte.
  • I bot Heavy provano a volte a sparare col Minigun mentre sono a corto di munizioni, soprattutto sotto il livello Difficile.
  • I bot Medic della squadra perdente si suicidano occasionalmente durante la fase di Umiliazione quando nessun nemico è vicino: qualcosa che un giocatore umano non può riprodurre nemmeno provandoci.
  • Regolare la tua anteprima di squadra su BLU nella schermata di caricamento fa sì che i bot RED ti sembrino visivamente resi in BLU.
  • I bot con un'arma corpo a corpo fuori rifiutano a volte di cambiare arma anche dopo aver raccolto munizioni.
  • Dopo Jungle Inferno, i bot apparsi con parametri espliciti (es. tf_bot_add 5 pyro blu normale) possono morire istantaneamente nella loro stanza di spawn. Correzione: tf_bot_reevaluate_class_in_spawnroom 0 (richiede sv_cheats 1).

Nomi delle IA

I nomi dei bot sono presi da un grande serbatoio di riferimenti a TF2, ad altri giochi Valve e alla cultura di programmazione, in gran parte perché la community non smetteva di chiederne di specifici sui forum 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 decine di altri dello stesso genere.

C'è anche un lotto di nomi trovati in un build sorgente trapelato mai spedito in produzione, per ragioni poco chiare: principalmente riferimenti a Last Dragon e The Fifth Element come John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh? e I'm your huckleberry.

Puoi sostituire tutto questo da solo: tf_bot_add heavyweapons blue "Blu Hoovy" fa apparire un Heavy BLU chiamato "Blu Hoovy."


Capitolo II: i Bot Originali / TFBot: immersione nei livelli di abilità

La cornice originale di Sigsegv tiene ancora: è ovvio che i bot Esperti superano i bot Facili, ma Valve non ha mai spiegato quanto né perché. Quindi l'unico modo di sapere è leggere il codice. Ecco ogni meccanica che evolve con l'abilità.

Regolare la difficoltà

Fuori dal MvM, la difficoltà è controllata da una cvar:

tf_bot_difficulty Livello di difficoltà
0 Facile
1 Normale (default)
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. L'assenza di chiave corrisponde al livello Facile. Nelle missioni di Valve: i Giganti sono quasi sempre Esperti, gli Engineer e gli Spy sono quasi sempre Esperti, e gli Sniper sono generalmente Difficili (occasionalmente Esperti). Se usi EventChangeAttributes (aggiunto nell'aggiornamento Two Cities) per modificare dinamicamente i bot in corso di ondata in base a eventi di mappa, l'abilità del bot è una delle proprietà che puoi cambiare al volo.

Modalità Endless MvM

La modalità Endless non è mai stata ufficialmente spedita, ma dentro, i bot spendono i loro soldi in miglioramenti come i giocatori, compresa un miglioramento esclusivo ai bot che aumenta il loro livello di abilità IA in corso di gioco.

L'entità bot_generator

Un'entità oscura, largamente non documentata, presunta usata nella modalità allenamento e forse nello sviluppo precoce del MvM. Espone un input SetDifficulty per controllare il livello di abilità. Oltre, la pista si raffredda: Valve non l'ha mai documentata e nessuno ha interamente mappato il suo comportamento.

Colore del bagliore oculare

I robot MvM hanno una particella di bagliore oculare che cambia colore col livello di abilità, un indicatore visivo che nessuno fuori dalla community ha mai spiegato:

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

Heavy bot TF2 in posizione d'attesa

Visione: tempo di riconoscimento

Un bot non reagisce istantaneamente quando qualcosa entra nel suo campo visivo: c'è un ritardo hardcodato prima che il resto dell'IA sia persino autorizzato a riconoscere la minaccia:

Abilità Tempo di riconoscimento minimo
Facile 1,00 s
Normale 0,50 s
Difficile 0,30 s
Esperto 0,20 s

È l'essenziale dell'effetto "i bot Facili sembrano stupidi" in un solo numero: un bot Facile non mira peggio una volta che ti ha notato, mette solo cinque volte più tempo a notare la tua esistenza.

Mira: tasso di inseguimento

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

Abilità Intervallo di ricalcolo Tasso equivalente
Facile 1,00 s 1x/s
Normale 0,25 s 4x/s
Difficile 0,10 s 10x/s
Esperto 0,05 s 20x/s

Eccezione: i bot Spy sono hardcodati col tasso di inseguimento Normale qualsiasi sia il loro reale livello di abilità: uno Spy Esperto mira sempre come un bot Normale. Esiste anche un video dimostrativo pubblico che confronta i tassi di inseguimento fianco a fianco se vuoi vedere lo scarto 1x contro 20x in movimento.

Mira: abilità specifica per arma

I bot non mirano solo al tuo centro di massa: hanno una logica per arma, a volte davvero buggata:

Lanciagranate e Lanciabombe adesive. Tutti i livelli di abilità compensano l'arco verticale, usando un valore fisso della cvar tf_bot_ballistic_elevation_rate. Poiché questa compensazione scatta solo per l'ID di arma di base, le varianti di proiettili più rapidi (Loch-n-Load, tutto ciò che ha un modificatore di velocità proiettile) non hanno arco correttamente aggiustato. E dato che è legato all'ID di arma specificamente, il Loose Cannon (un ID diverso) non riceve alcuna compensazione di arco.

Huntsman. I bot Facili non compensano la caduta della freccia e non cercano mai gli headshot. I bot di livello Normale compensano l'arco, ma mirano alla testa solo a meno di 150 HU. I bot Difficile/Esperto mirano sempre alla testa.

Lanciarazzi. Oltre 150 HU, i bot non-Facili mirano ai tuoi piedi invece del centro di massa, massimizzando le probabilità di danni ad area e spinta. Sotto 150 HU, passano agli headshot. I bot Facili mirano sempre al centro di massa qualsiasi sia la distanza. Anche questo è bloccato per ID di arma: il Direct Hit e il Cow Mangler non ereditano questo comportamento. Logico per il Direct Hit (niente area di effetto da sfruttare); zero senso per il Cow Mangler: questa parte dell'IA predata l'esistenza dell'arma e non è semplicemente mai stata rivista.

Fucili da cecchino. Facile mira al corpo. Normale mira circa al 33% dal corpo verso la testa. Difficile/Esperto mirano direttamente alla testa. Meno importante in MvM, dove gli headshot dei bot non ottengono comunque il bonus di danni.

Udito: sensibilità ai colpi discreti

Ogni colpo avvisa i bot vicini della posizione del tiratore, anche attraverso i muri, fino a 3000 HU con 100% di probabilità di essere notato (tf_bot_notice_gunfire_range). Ma un sottoinsieme di armi è segnato "discreto": udibile solo entro 500 HU (tf_bot_notice_quiet_gunfire_range), e anche allora con una probabilità dipendente dall'abilità:

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

Questa probabilità è dimezzata se un colpo rumoroso è stato sentito negli ultimi 3 secondi: i suoni forti mascherano i suoni deboli.

La lista degli ID di armi discrete non è stata aggiornata dal dicembre 2010. Qualsiasi aggiunta successiva che usa un nuovo ID di arma è trattata come rumorosa di default, non importa quanto logicamente dovrebbe essere discreta, a meno che riusi un ID più vecchio. In concreto:

ID di arma Copre
TF_WEAPON_KNIFE Tutti i coltelli di Spy
TF_WEAPON_FISTS Pugni specifici dell'Heavy (il suo pugno multi-classe è in realtà TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Presunto inutilizzato direttamente
TF_WEAPON_PDA_ENGINEER_BUILD PDA di costruzione dell'Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA di distruzione dell'Engineer
TF_WEAPON_PDA_SPY Kit di travestimento dello Spy
TF_WEAPON_BUILDER Kit di attrezzi di Spy/Engineer/Sabotatore
TF_WEAPON_MEDIGUN Tutti i Medi Gun
TF_WEAPON_DISPENSER Probabilmente inutilizzato (i Dispenser sono oggetti, non armi)
TF_WEAPON_INVIS Tutti gli orologi di invisibilità di Spy
TF_WEAPON_FLAREGUN Tutte le pistole a razzi Pyro tranne 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 discreto)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

L'esempio classico della lista che marcisce: il Manmelter ha ricevuto il suo ID (TF_WEAPON_RAYGUN_REVENGE), aggiunto dopo che la lista delle armi discrete era stata congelata, quindi è trattato come rumoroso, nonostante sia una pistola a razzi in tutti i sensi pratici. Lo Scorch Shot, uscito ancora dopo, riusa l'ID di base TF_WEAPON_FLAREGUN ed è quindi sempre considerato discreto. Insensato, ma è il codice.

Strategia: prioritizzazione delle minacce

Quando più nemici sono visibili insieme, i bot pesano la distanza, se si fanno sparare addosso e, sopra Facile, se la minaccia principale è curata:

Abilità Mira al curatore invece?
Facile No
Normale 50% di probabilità
Difficile Sì
Esperto Sì

I nemici a oltre 500 HU sono normalmente deprioritizzati come non immediati. Eccezioni: i bot Difficile/Esperto trattano sempre Medic ed Engineer lontani come minacce immediate, e qualsiasi Sniper nemico che mira approssimativamente nella tua direzione è sempre trattato come immediato qualsiasi sia la distanza e l'abilità.

Abilità Medic/Engineer lontani/Sniper che mira = minaccia immediata?
Facile/Normale No
Difficile/Esperto Sì

Questa verifica dello Sniper ha una storia sorprendente che amo sempre raccontare. Lo scritto originale di Sigsegv supponeva che il gioco esigesse che il prodotto scalare tra il vettore di mira del cecchino e la posizione relativa del bot fosse esattamente zero: un confronto così preciso da non scattare quasi mai in calcolo float, rendendo tutta la funzionalità di fatto codice morto. Una correzione pubblicata dopo (credito a una decompilazione Hex-Rays più pulita) ha mostrato che la verifica reale è prodotto scalare > 0: qualsiasi Sniper che guarda da direttamente verso di te a perpendicolare a te è considerato minaccia immediata; tutto ciò che va da perpendicolare a spalle girate non lo è. La cattiva lettura originale veniva da una cattiva decompilazione di un confronto SSE di float. Fare reverse-engineering su un binario AAA resta un esercizio approssimativo.

Movimento: schivata

I bot Facili non schivano mai, punto finale. I bot Normale e superiori schivano a sinistra/destra (33% sinistra, 33% destra, 33% non fare niente, pesato contro i buchi rilevati) quando tengono un'arma da combattimento, hanno visto un nemico negli ultimi 3 secondi e questo nemico ha una linea di vista su di loro.

Non schiveranno se uno di questi casi si applica: attributo DisableDodge definito, comportamento attuale dice di sbrigarsi, attualmente invulnerabile (qualsiasi uber), in pieno scherno/provocazione, gioca Engineer, invisibile o travestito da Spy, in mira come Sniper o in rotazione come Heavy, o mentre tende l'Huntsman.

Movimento: evitare di urtare i nemici

Sopra Normale, i bot provano specificamente a non entrare nei nemici spostandosi:

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

In pratica, conta solo per i bot Spy: evitare una collisione imbarazzante con un giocatore nemico è esattamente il tipo di cosa che compromette un travestimento.

Pyro: padronanza dell'airblast

L'airblast serve a due cose: riflettere i proiettili (PvP e MvM) e spingere i nemici vicini ai bordi (solo PvP). Che il bot prema o no il grilletto davanti a un'opportunità valida è un testa o croce basato sull'abilità:

Abilità Probabilità di innescare l'airblast
Facile 0%
Normale 50%
Difficile 90%
Esperto 100%

I bot Pyro Facili non possono letteralmente fare airblast: il tiro è hardcodato per non riuscire mai, non solo "raramente."

Spy: efficacia del travestimento

Due assi distinti evolvono con l'abilità. Scelta del travestimento:

Abilità Metodo di travestimento
Facile/Normale Classe casuale, ignorando ciò che la squadra nemica gioca davvero
Difficile/Esperto Sceglie un vero giocatore nemico e copia la sua classe esatta

Comportamento in travestimento:

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

Spy: aggressività del backstab

A lunga portata (fino a 300 HU, tf_bot_spy_knife_range), un bot Spy si impegna in un backstab solo se può vedere la vittima e la schiena della vittima è almeno parzialmente girata. L'abilità determina quanto questo angolo di schiena può essere decentrato:

Abilità Tolleranza di angolo
Facile Prova anche se gli fai fronte direttamente
Normale ±45° dalla tua schiena
Difficile ±78° dalla tua schiena
Esperto ±90° dalla tua schiena (arco posteriore completo di 180°)

I bot Spy Facili sono funzionalmente suicidi: proveranno un colpo di coltello su qualcuno che li guarda dritto negli occhi. Eccezione: in Mann vs. Machine, ogni bot Spy è forzato al vincolo di angolo Normale qualsiasi sia il suo reale livello di abilità.

Tattiche: selezione di armi

Questa logica riguarda solo i livelli sopra Facile, con interesse ridotto in MvM dato che i bot lì hanno generalmente restrizioni di armi strette:

  • Scout: passa all'arma secondaria quando il caricatore del primario è vuoto.
  • Soldier: passa all'arma secondaria quando il caricatore è vuoto e il bersaglio è a meno di 500 HU.
  • Sniper: passa all'arma secondaria per bersagli a meno di 750 HU.
  • Pyro: passa all'arma secondaria per bersagli a oltre 750 HU, a meno che questo bersaglio sia un Soldier o un Demoman.

Tattiche: ricarica al coperto

Logica assente dal MvM. Se il comportamento attuale del bot non gli dice di ritirarsi, il suo caricatore principale è vuoto e resta vulnerabile senza uber, i bot di livello superiore si ritirano temporaneamente al coperto per ricaricare invece di cliccare su un'arma vuota davanti a te:

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

Modalità CP: vagabondaggio del difensore

Logica assente dal MvM. Difendendo un punto di controllo, i bot di livello superiore sono più propensi a lasciare il punto per cacciare kill ("search and destroy"), ma solo con tempo decente restante su tf_bot_defense_must_defend_time:

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

Modalità CP: blocco di cattura

Logica assente dal MvM. I bot difensori che contestano un tentativo di cattura nemico:

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

Il quadro riepilogativo completo

Aspetto Facile Normale Difficile Esperto Note
Visione: tempo di riconoscimento 1,00s 0,50s 0,30s 0,20s
Mira: tasso di inseguimento 1x/s 4x/s 10x/s 20x/s Gli Spy usano sempre Normale
Compensazione arco granata/sticky Sì Sì Sì Sì Loose Cannon esente
Compensazione verticale Huntsman No Sì Sì Sì
Headshot Huntsman No <150 HU Sì Sì
Tiro ai piedi Lanciarazzi No Sì Sì Sì Direct Hit e Cow Mangler esenti
Punto di mira Fucile da cecchino Corpo circa 33% verso testa Testa Testa
Probabilità di notare colpi discreti 10% 30% 60% 90% Dimezzata se mascherata da colpi rumorosi
Mira al curatore No 50% Sì Sì
Medic/Engineer/Sniper lontani = minaccia No No Sì Sì
Schivata No Sì Sì Sì Lunga lista di eccezioni
Evita di urtare i nemici No No Sì Sì Soprattutto importante per Spy
Probabilità di innescare l'airblast 0% 50% 90% 100%
Scelta classe travestimento Spy Casuale Casuale Corrisponde a un vero nemico Corrisponde a un vero nemico
Contatto visivo Spy in travestimento Fissa (evidente) Fissa Evita (convincente) Evita
Angolo di backstab Spy circa 0° ±45° ±78° ±90° MvM forza Normale
Logica di 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

Heavy bot TF2 visant avec un minigun

Tutto questo riflette un sistema deliberato di Valve: punteggi e probabilità interamente deterministici, semplicemente mai documentati ufficialmente. Ecco i punti che trattengo dopo questa immersione:

  1. L'"abilità" è un insieme di cursori indipendenti, non un moltiplicatore globale. Il tempo di reazione, la cadenza di mira e ogni comportamento tattico evolvono separatamente, e alcuni (tasso di inseguimento Spy, angolo di backstab MvM) hanno override hardcodati qualsiasi sia il livello.
  2. Una parte è davvero buggata, non solo vecchia. La lista delle armi discrete congelata dal 2010, il Cow Mangler senza logica di tiro ai piedi senza buona ragione, la verifica del prodotto scalare dello Sniper che ha preso anni per essere decompilata correttamente: il codice IA di Valve ha cicatrici come qualsiasi codebase di 17 anni.
  3. Potete usare tutto questo. Sappiate che un bot Sniper non vi farà headshot in Normale, che un Pyro Facile non può letteralmente riflettere il vostro razzo, che uno Spy Facile proverà a pugnalarvi faccia a faccia. Non è fortuna. È una scheda tecnica.

Un immenso grazie a sigsegv per l'immersione nel codice originale che ha reso possibile gran parte di questo, al wiki TF2 per la documentazione di base sui comandi di bot e il supporto delle mappe, e a tutti quelli nella community che continuano a trafficare un'IA di bot vecchia di 17 anni per capire esattamente perché fa ciò che fa.

TF2-Bots sind nicht zufällig: Ich habe jeden Schwierigkeitsparameter neu entdeckt

Sicht, Zielen, Backstab-Winkel, Headshot-Logik, jeder bekannte Bug, Valve hat nie etwas dokumentiert. Also haben wir den Code durchwühlt und alles in ein komplettes Datenblatt verwandelt.

Einleitung

TF2-Bot-Soldat zielt mit Raketenwerfer

Jeder TF2-Spieler hat es mindestens einmal gesagt: "Dieser Bot cheatet." Oder umgekehrt: "Warum steht dieser Easy-Bot herum und frisst Raketen." Niemand weiß wirklich, was "Easy", "Normal", "Hard" und "Expert" unter der Haube bedeuten: Valve lieferte vier Schwierigkeitslabels und exakt null Dokumentation.

Also hat eine Gruppe von uns (ich, awimii, Mush The Possum, mit einem riesigen Teil der Basisarbeit von sigsegv, der wirklich den dekompilierten Spielcode durchwühlt hat) ein komplettes Forschungsdokument über TFBot-Verhalten zusammengestellt. Jede Mechanik, jeder bekannte Bug, jede hardcodierte Wahrscheinlichkeit. Dieser Artikel ist der integrale Bericht, nicht die gekürzte Version. Nehmt euch einen Bonk, es wird lang.


Kapitel I: Die Basics

Bot vs. Puppen-Bot

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

  • KI-Bots (TFBots): Echte KI, gebaut auf demselben PlayerBot/Infected-Framework, das Valve für die Left-4-Dead-Serie nutzte. Sie wählen eine zufällige Klasse, spielen das Objective, funktionieren ohne sv_cheats und triggern Achievements wie ein echter Spieler.
  • Puppen-Bots: Null KI, unfähig sich zu bewegen oder selbst zu handeln. Sie existieren nur, um manuell kontrolliert zu werden, ein Spieler kann sie zum Folgen, Zielen und Schießen zwingen. Hauptsächlich für Tests oder filmische Screenshots und Videos genutzt. Sie zu spawnen braucht sv_cheats 1, was auch Achievements für die Session deaktiviert.

Dieser Artikel handelt vollständig vom ersten Typ.

Was man KI-Bots (mehr oder weniger) sagen kann

TFBots sind nicht direkt kontrollierbar, aber man kann sie zu manchen Dingen anstiften:

  • Ziele einen beliebigen Bot (Verbündeter oder Gegner) mit deinem Crosshair an und er verspottet dich, wenn du die richtigen Voice-Commands nutzt.
  • Ein verbündeter Medic-Bot heilt dich, wenn du den "Medic!"-Voice-Command nutzt.
  • Wenn dich ein Medic-Bot heilt und eine bereite UberCharge hat, lässt "Go go go!" oder "Charge aktivieren!" ihn die Charge sofort auslösen.
  • Ein Medic-Bot mit bereiter Charge aktiviert sie automatisch, sobald er selbst oder sein Heilziel ernsten Schaden nimmt, ohne nötigen Voice-Command.
  • Bots führen spontan Duo-Verspottungen (High Five) oder Gruppenverspottungen (Conga) mit nahen Teamkameraden aus.

Bots auf nicht supporteten Maps zum Laufen bringen

Bots hängen von einem Navigations-Mesh ab, um zu wissen, wo sie laufen dürfen, und die meisten Community-Maps liefern keins. Zum Forcen:

  1. sv_cheats 1
  2. nav_generate, baut das initiale Navmesh, Fortschritt in der Konsole angezeigt
  3. Warten, bis das Spiel mit Weggenerierung fertig ist
  4. Optional schlechte Navigationsdaten manuell mit nav_edit 1 korrigieren
  5. Server neu laden oder neustarten (diesen Schritt überspringen deaktiviert Achievements)
  6. tf_bot_add <Anzahl> um Bots zu spawnen

Warnung : Das Navmesh zu modifizieren, während Bots auf dem Server aktiv sind, kann das Spiel crashen. Sobald das Mesh existiert, musst du es für künftige Sessions nicht regenerieren: Füge Bots einfach mit tf_bot_add hinzu.

Autogenerierte Meshes funktionieren am besten auf Control-Point-, King-of-the-Hill-, Payload- und CTF-Maps. Auf Mannpower-Maps nehmen Bots standardmäßig CTF-artiges Verhalten an, nutzen aber kaum Grapples oder Powerups. Wenn eine Map kein Objective hat, das die Bot-KI erkennt, aber eine Spawnroom-Entity besitzt, lässt tf_bot_offense_must_push_time 0 die Bots trotzdem kämpfen.

(Quelle für diesen Abschnitt: Die Bots-Seite des offiziellen TF2-Wiki.)

Aktueller Status, Map für Map

Dank dem Hatless-Update funktioniert jetzt jede Klasse korrekt, inklusive dem historisch verbuggten Spy. Bots verhalten sich korrekt auf den meisten offiziellen KOTH-Maps, manchen Payload-Maps, Dustbowl/Gorge Attack-Defense und den CTF/Mann-Manor-Maps. Auf letzteren zwei kannst du sie nicht direkt mit tf_bot_add spawnen. Auf nicht supporteten Maps (via obigem nav_generate-Prozess) funktionieren sie, sind aber deutlich schlechter darin, einen echten Spieler zu imitieren.

PLR-Maps sind ein verlorener Fall: Bots können die Barrieren auf Hightower nicht überwinden und klemmen in Ecken fest, und auf allen anderen PLR-Maps machen sie nur... eine Tanzparty statt zu spielen. Vielleicht wird das eines Tages gefixt, vielleicht bleibt es so.

Generelles Bot-Verhalten

Ein Sammelsurium von Dingen, die jeder Bot unabhängig vom Level tut:

  • Bots nutzen nur Basis-Loadouts (ein Plugin kann ihnen nicht-standard Waffen aufzwingen, aber Vanilla-Bots wählen nie ihre eigenen).
  • Easy-Bots nutzen kaum ihre Sekundärwaffe. Höhere Schwierigkeiten wechseln zur Sekundärwaffe, sobald das Hauptmagazin leer ist, oder um Distanz zu kompensieren.
  • Bots ignorieren fortgeschrittene Bewegungstechniken: Kein Rocket Jump, keine Gebäude-Relokation.
  • Nach einem Kill kann ein Bot verspotten, selbst unter Feuer, außer er trägt die gegnerische Intel, und diese Regel gilt auch in MvM.
  • Getarnte Spy-Bots (Spieler oder KI) werden von anderen Bots korrekt ignoriert: Bis sie einen Gegner berühren, etwas sabotieren, schießen oder nahe einem unsichtbar werden. Einmal "entdeckt", wird dieser spezifische Bot/Spieler als Spy gemerkt, bis er das Kostüm wechselt und dabei unsichtbar bleibt, stirbt oder mit dem Dead Ringer den Tod vortäuscht.
  • Pyro-Bots nutzen Compression Blast liberal ab Normal-Level.
  • Medic-Bots priorisieren Heilung über alle außer Sniper (und in geringerem Maß Engineers), selbst wenn du als solcher "Medic!" spammst.
  • Medic-Bots gravitieren zu Heavies, Soldiers, Demomen und Pyros: Spezifisch wenn ein Mensch diese Klassen spielt. Diese Aufmerksamkeit folgt der Präsenz eines Menschen in diesen Rollen.
  • Bots bleiben während Prep-Time auf Attack/Defense- und Payload-Maps in Position, außer Engineers, Snipers und Spies, die sich frei bewegen (Demoman-Bots dürfen auch Stickybomben vorplatzieren).
  • Engineer-Bots verbessern oder deaktivieren nie Bauten eines anderen verbündeten Engineers, außer die Bauten steht auf ihrem Zielweg. Sie reparieren manchmal einfach ihr eigenes Geschütz nicht, selbst wenn es offensichtlich scheint.
  • Entdeckte Spy-Bots wechseln zum Revolver und weichen zurück, statt einen Messerstich zu forcen.
  • Demoman-Bots, die ein Geschütz lokalisiert haben (generell indem sie einmal daran sterben), können perfekt Stickybomben von außerhalb seiner Reichweite darauf werfen, im Bogen durch Wände und Decken, wenn die Geometrie es erlaubt.
  • Sniper-Bots, die nach Zielen kein Ziel finden, nutzen eine der "Negatives."-Voicelines.
  • Verbündete Medics heilen einen getarnten Spy ohne Zögern.

Bekannte Probleme / Bugs

Das Dokument listet eine gute Zahl langjähriger Seltsamkeiten:

  • Bots können versuchen, durch manche statische Props zu laufen oder zu schießen.
  • Jedes Mal, wenn ein Spieler/Bot enttarnt, tarnt oder sich offenbart, "sehen" nahe Bots es und drehen sich um zu reagieren: Selbst wenn das Event außerhalb ihres echten Sichtfelds passierte. Das basiert nicht auf Sound; es ist eine Umgehung des Sicht-Tests.
  • Selten können Bots physisch zusammenklemmen, wenn sie einen Engineer-Teleporter nutzen.
  • Bot-Voice-Commands (z. B. "Spy!", "Vorwärts!") erscheinen nicht als Text im Chat wie die von Spielern.
  • Ein aktiv heilender Medic-Bot weicht weder eingehenden Schüssen aus noch nimmt Heil-Kits, selbst bei kritischen HP.
  • Bots können während einer Duo-Verspottung weiterlaufen, was den vorgesehenen Festive-Critical-Strike-Effekt bricht.
  • Kürzlich verletzte Medic-Bots weigern sich oft, die Syringe Gun auf Distanz zu nutzen, und bevorzugen Nahkampf (oder in sehr seltenen Fällen versuchen, dich mit dem Medi-Gun-Strahl selbst zu berühren).
  • Medic-Bots kompensieren keine Gravitation für Syringe-Gun-Schüsse: Wahrscheinlich weil die Waffe im KI-Code nicht korrekt als nicht-hitscan markiert ist.
  • Spy-Bots können einen unsichtbaren Spy (Spieler oder KI) sehen und verfolgen, wenn dieser Spy schon einmal entdeckt wurde, unabhängig vom Skill-Level des verfolgenden Bots.
  • Selbst wenn sich ein Spieler-Spy als Klasse seines eigenen Teams tarnt, demaskiert ihn Feindberührung trotzdem (Bots tun das sich selbst nie an, da sich Bots nie als eigenes Team tarnen).
  • Bots respektieren Team-Autobalance: Wenn du Bots auf einer Seite stapeln willst, musst du zuerst mp_teams_unbalance_limit 0 nutzen.
  • Engineer-Bots können ihre eigenen Bauten komplett ignorieren, bis sie zerstört werden.
  • Heavy-Bots versuchen manchmal, mit leerer Minigun zu schießen, besonders unter Hard-Level.
  • Verliererteam-Medic-Bots bringen sich während der Humiliation-Phase gelegentlich um, wenn kein Gegner nahe ist, etwas, das ein menschlicher Spieler nicht reproduzieren kann, selbst wenn er es versucht.
  • Deinen Team-Preview auf BLU im Ladebildschirm zu stellen lässt RED-Bots für dich visuell in BLU gerendert erscheinen.
  • Bots mit gezogener Nahkampfwaffe weigern sich manchmal, die Waffe zu wechseln, selbst nach Munitionsaufsammeln.
  • Nach Jungle Inferno können mit expliziten Parametern gespawnte Bots (z. B. tf_bot_add 5 pyro blau normal) instantan in ihrem eigenen Spawnroom sterben. Fix: tf_bot_reevaluate_class_in_spawnroom 0 (braucht sv_cheats 1).

KI-Namen

Bot-Namen stammen aus einem großen Reservoir von TF2-, anderen Valve-Spiel- und Programmierkultur-Referenzen, großenteils weil die Community auf Steam-Foren ständig spezifische verlangte. Ein Sample 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 mehr derselben Art.

Es gibt auch einen Batch Namen in einem geleakten Source-Build gefunden, der nie in Produktion ging, aus unklaren Gründen: Hauptsächlich Last-Dragon- und Fifth-Element-Referenzen wie John Spartan, Leeloo Dallas Multipass, Sho'nuff, Bruce Leroy, Big Gulp Huh? und I'm your huckleberry.

Du kannst das alles selbst ersetzen: tf_bot_add heavyweapons blue "Blu Hoovy" spawnt einen BLU-Heavy namens "Blu Hoovy."


Kapitel II: Die Original-Bots / TFBots, Skill-Level-Deep-Dive

Sigsegvs ursprünglicher Rahmen hält immer noch: Es ist offensichtlich, dass Expert-Bots Easy-Bots übertreffen, aber Valve erklärte nie wie viel noch warum. Also ist Code-Lesen der einzige Weg zu wissen. Hier jede Mechanik, die mit Skill skaliert.

Schwierigkeit einstellen

Außerhalb von MvM wird Schwierigkeit von einer Cvar kontrolliert:

tf_bot_difficulty Schwierigkeitslevel
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-Spawnblock im Popfile einen optionalen Skill-Schlüssel. Fehlender Schlüssel entspricht Easy-Level. In Valves Missionen: Giants sind fast immer Expert, Engineers und Spies fast immer Expert, und Snipers generell Hard (gelegentlich Expert). Wenn du EventChangeAttributes nutzt (im Two-Cities-Update hinzugefügt), um Bots mid-Wave dynamisch nach Map-Events zu modifizieren, ist Bot-Skill eine der Eigenschaften, die du on the fly ändern kannst.

Endless-MvM-Modus

Der Endless-Modus wurde nie offiziell shipped, aber darin geben Bots ihr Geld wie Spieler für Upgrades aus, inklusive einem bot-exklusiven Upgrade, das ihr KI-Skill-Level mid-Game erhöht.

Die bot_generator-Entity

Eine obskure, weitgehend undokumentierte Entity, vermutlich im Trainingsmodus und vielleicht in früher MvM-Entwicklung genutzt. Sie exponiert einen SetDifficulty-Input zur Skill-Level-Kontrolle. Darüber hinaus kühlt die Spur ab: Valve dokumentierte sie nie und niemand kartierte ihr Verhalten vollständig.

Augenleuchtfarbe

MvM-Roboter haben ein Augenleuchtpartikel, das mit Skill-Level die Farbe wechselt, ein visueller Indikator, den niemand außerhalb der Community je erklärte:

Skill Augenfarbe RGB
Easy/Normal Blau #24b4ff
Hard/Expert Gelb #fff000

TF2-Heavy-Bot in Warteposition

Sicht: Erkennungszeit

Ein Bot reagiert nicht instantan, wenn etwas in sein Sichtfeld kommt: Es gibt eine hardcodierte Verzögerung, bevor der Rest der KI die Bedrohung überhaupt erkennen darf:

Skill Minimale Erkennungszeit
Easy 1,00 s
Normal 0,50 s
Hard 0,30 s
Expert 0,20 s

Das ist im Wesentlichen der "Easy-Bots-wirken-dumm"-Effekt in einer einzigen Zahl: Ein Easy-Bot zielt nicht schlechter, sobald er dich bemerkt hat, er braucht nur fünfmal länger, deine Existenz zu bemerken.

Zielen: Tracking-Rate

Bots tracken dich nicht kontinuierlich. Sie sampeln deine Position und Geschwindigkeit in festem Intervall und prognostizieren eine Gerade von dort:

Skill Neuberechnungsintervall Äquivalente 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 hardcoded mit Normal-Tracking-Rate, egal ihr echtes Skill-Level: Ein Expert-Spy zielt immer wie ein Normal-Bot. Es gibt auch ein öffentliches Demo-Video, das Tracking-Raten nebeneinander vergleicht, wenn du den 1x-vs-20x-Gap in Bewegung sehen willst.

Zielen: waffenspezifischer Skill

Bots zielen nicht nur auf deinen Masseschwerpunkt: Sie haben Waffenlogik, manchmal wirklich verbuggt:

Granat- & Stickybombenwerfer. Alle Skill-Level kompensieren den vertikalen Bogen mit einem fixen Wert der Cvar tf_bot_ballistic_elevation_rate. Weil diese Kompensation nur für die Basis-Waffen-ID aktiviert, haben schnellere Projektilvarianten (Loch-n-Load, alles mit Projektilgeschwindigkeitsmodifier) keinen korrekt justierten Bogen. Und weil es spezifisch an Waffen-ID gebunden ist, bekommt der Loose Cannon (eine andere ID) keine Bogenkompensation.

Huntsman. Easy-Bots kompensieren keinen Pfeilfall und suchen nie Headshots. Normal-Level-Bots kompensieren den Bogen, zielen aber nur unter 150 HU auf den Kopf. Hard/Expert-Bots zielen immer auf den Kopf.

Raketenwerfer. Über 150 HU zielen Nicht-Easy-Bots auf deine Füße statt Masseschwerpunkt und maximieren Splash-Schaden- und Knockback-Chancen. Unter 150 HU wechseln sie zu Headshots. Easy-Bots zielen immer auf Masseschwerpunkt, egal Distanz. Auch per Waffen-ID verriegelt: Direct Hit und Cow Mangler erben dieses Verhalten nicht. Logisch für Direct Hit (kein Splash zum Ausnutzen); null Sinn für Cow Mangler: Dieser KI-Teil predatiert die Waffenexistenz und wurde schlicht nie überarbeitet.

Sniper-Gewehre. Easy zielt auf Körper. Normal zielt etwa 33% vom Körper zum Kopf. Hard/Expert zielen direkt auf den Kopf. Weniger wichtig in MvM, wo Bot-Headshots ohnehin keinen Schadensbonus bekommen.

Gehör: Sensitivität für diskrete Schüsse

Jeder Schuss alarmiert nahe Bots auf die Schützenposition, selbst durch Wände, bis 3000 HU mit 100% Bemerkchance (tf_bot_notice_gunfire_range). Aber eine Teilmenge Waffen ist als "diskret" markiert: Nur in 500 HU hörbar (tf_bot_notice_quiet_gunfire_range), und selbst dann mit skillabhängiger Chance:

Skill Chance diskreten 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 Sounds maskieren leise Sounds.

Die diskrete Waffen-ID-Liste wurde seit Dezember 2010 nicht aktualisiert. Jeder spätere Zusatz mit neuer Waffen-ID wird standardmäßig als laut behandelt, egal wie logisch diskret er sein sollte, außer er wiederverwendet eine ältere ID. Konkret:

Waffen-ID Deckt ab
TF_WEAPON_KNIFE Alle Spy-Messer
TF_WEAPON_FISTS Heavy-spezifische Faustschläge (sein Multi-Class-Faustschlag ist tatsächlich TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Vermutlich direkt ungenutzt
TF_WEAPON_PDA_ENGINEER_BUILD Engineer-Bau-PDA
TF_WEAPON_PDA_ENGINEER_DESTROY Engineer-Zerstörungs-PDA
TF_WEAPON_PDA_SPY Spy-Tarnkit
TF_WEAPON_BUILDER Spy/Engineer/Saboteur-Toolkits
TF_WEAPON_MEDIGUN Alle Medi Guns
TF_WEAPON_DISPENSER Wahrscheinlich ungenutzt (Dispenser sind Objekte, keine Waffen)
TF_WEAPON_INVIS Alle Spy-Unsichtbarkeitsuhren
TF_WEAPON_FLAREGUN Alle Pyro-Leuchtpistolen außer Manmelter
TF_WEAPON_LUNCHBOX Sandwich, Dalokohs Bar, Buffalo Steak Sandvich, Bonk!, Crit-a-Cola
TF_WEAPON_JAR Jarate (nicht Mad Milk, separate ID, nicht-diskret)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Das klassische Beispiel verrottender Liste: Der Manmelter bekam seine eigene ID (TF_WEAPON_RAYGUN_REVENGE), hinzugefügt nachdem die Diskret-Waffenliste eingefroren wurde, also wird er als laut behandelt, obwohl er in jedem praktischen Sinn eine Leuchtpistole ist. Der noch später erschienene Scorch Shot wiederverwendet die Basis-TF_WEAPON_FLAREGUN-ID und gilt daher immer noch als diskret. Wahnsinnig, aber das ist der Code.

Strategie: Bedrohungspriorisierung

Wenn mehrere Gegner gleichzeitig sichtbar sind, gewichten Bots Distanz, ob auf sie geschossen wird und über Easy, ob die Hauptbedrohung gerade geheilt wird:

Skill Zielt stattdessen auf Heiler?
Easy Nein
Normal 50% Chance
Hard Ja
Expert Ja

Gegner über 500 HU werden normal als nicht-unmittelbar depriorisiert. Ausnahmen: Hard/Expert-Bots behandeln entfernte Medics und Engineers immer als unmittelbare Bedrohungen, und jeder gegnerische Sniper, der ungefähr in deine Richtung zielt, wird immer als unmittelbar behandelt, egal Distanz und Skill.

Skill Entfernte Medics/Engineers/zielende Snipers = unmittelbare Bedrohung?
Easy/Normal Nein
Hard/Expert Ja

Dieser Sniper-Check hat eine erstaunliche Geschichte, die ich immer gerne erzähle. Sigsegvs Originalschrift nahm an, das Spiel verlange, dass das Skalarprodukt zwischen Sniper-Zielvektor und relativer Bot-Position exakt null sei: Ein so präziser Vergleich, dass er in Fließkomma fast nie triggern würde und die ganze Funktion effektiv toter Code wäre. Eine später publizierte Korrektur (Credit an eine sauberere Hex-Rays-Dekompilierung) zeigte, dass der echte Check Skalarprodukt > 0 ist: Jeder Sniper, der von direkt auf dich bis senkrecht zu dir schaut, gilt als unmittelbare Bedrohung; alles von senkrecht bis Rücken-zu-dir nicht. Die ursprüngliche Fehllesart kam aus einer Fehldekompilierung eines SSE-Fließkommavergleichs. Reverse Engineering an einer AAA-Binary bleibt eine approximative Übung.

Bewegung: Ausweichen

Easy-Bots weichen nie aus, Punkt. Normal- und höhere Bots weichen links/rechts aus (33% links, 33% rechts, 33% nichts tun, gewichtet gegen erkannte Löcher), wenn sie eine Kampfwaffe halten, in den letzten 3 Sekunden einen Gegner sahen und dieser Gegner Sichtlinie auf sie hat.

Sie weichen nicht aus, wenn einer dieser Fälle zutrifft: DisableDodge-Attribut gesetzt, aktuelles Verhalten sagt beeilen, gerade invulnerabel (irgendein Uber), mitten in Verspottung/Provokation, spielt Engineer, unsichtbar oder getarnt als Spy, zielt als Sniper oder rotiert als Heavy, oder spannt den Huntsman.

Bewegung: Feind-Anrempeln vermeiden

Über Normal versuchen Bots spezifisch, beim Bewegen nicht in Gegner zu rennen:

Skill Vermeidet Feind-Anrempeln?
Easy Nein
Normal Nein
Hard Ja
Expert Ja

In der Praxis zählt das nur für Spy-Bots: Eine peinliche Kollision mit einem gegnerischen Spieler zu vermeiden ist genau die Art Ding, die eine Tarnung kompromittiert.

Pyro: Airblast-Beherrschung

Airblast dient zwei Dingen: Projektile reflektieren (PvP und MvM) und nahe Gegner von Kanten pushen (nur PvP). Ob der Bot bei gültiger Gelegenheit auf den Trigger drückt, ist ein skillbasierter Münzwurf:

Skill Chance Airblast auszulösen
Easy 0%
Normal 50%
Hard 90%
Expert 100%

Easy-Pyro-Bots können buchstäblich keinen Airblast: Der Wurf ist hardcoded nie erfolgreich, nicht nur "selten."

Spy: Tarnungseffektivität

Zwei separate Achsen skalieren mit Skill. Tarnungs-Wahl:

Skill Tarnmethode
Easy/Normal Zufällige Klasse, ignoriert was das Gegnerteam wirklich spielt
Hard/Expert Wählt einen echten gegnerischen Spieler und kopiert seine exakte Klasse

Verhalten in Tarnung:

Skill Verhalten in Tarnung/Unsichtbarkeit
Easy/Normal Starrt gegnerische Spieler an, wenn er sie sieht (verdächtig)
Hard/Expert Vermeidet bewusst Augenkontakt (überzeugender)

Spy: Backstab-Aggressivität

Auf lange Distanz (bis 300 HU, tf_bot_spy_knife_range) engaged ein Spy-Bot einen Backstab nur, wenn er das Opfer sehen kann und der Opferrücken mindestens teilweise abgewandt ist. Skill bestimmt, wie dezentriert dieser Rückenwinkel sein darf:

Skill Winkeltoleranz
Easy Versucht selbst wenn du ihn direkt anschaust
Normal ±45° von deinem Rücken
Hard ±78° von deinem Rücken
Expert ±90° von deinem Rücken (kompletter 180°-Hinterbogen)

Easy-Spy-Bots sind funktional suizidal: Sie versuchen einen Messerstich auf jemanden, der ihnen direkt in die Augen schaut. Ausnahme : In Mann vs. Machine wird jeder Spy-Bot auf die Normal-Winkelbedingung gezwungen, egal sein echtes Skill-Level.

Taktiken: Waffenauswahl

Diese Logik betrifft nur Level über Easy, mit reduziertem MvM-Interesse, da Bots dort generell strikte Waffenrestriktionen haben:

  • Scout: Wechselt zur Sekundärwaffe, wenn das Primärmagazin leer ist.
  • Soldier: Wechselt zur Sekundärwaffe, wenn das Magazin leer ist und das Ziel unter 500 HU hat.
  • Sniper: Wechselt zur Sekundärwaffe für Ziele unter 750 HU.
  • Pyro: Wechselt zur Sekundärwaffe für Ziele über 750 HU, außer das Ziel ist ein Soldier oder Demoman.

Taktiken: Nachladen in Deckung

In MvM fehlende Logik. Wenn das aktuelle Bot-Verhalten ihm nicht sagt zurückzuweichen, sein Hauptmagazin leer ist und er ohne Uber verwundbar bleibt, ziehen sich höhere Bots temporär in Deckung zurück, um nachzuladen, statt dir ins Gesicht auf eine leere Waffe zu klicken:

Skill Zieht sich zum Nachladen zurück?
Easy Nein
Normal Nein
Hard Ja
Expert Ja

CP-Modus: Verteidiger-Umherstreifen

In MvM fehlende Logik. Beim Verteidigen eines Control Points verlassen höhere Bots eher den Punkt, um Kills zu jagen ("Search and Destroy"), aber nur mit decent verbleibender Zeit auf tf_bot_defense_must_defend_time:

Skill Streifchance
Easy 10%
Normal 50%
Hard 75%
Expert 90%

CP-Modus: Capture-Blocken

In MvM fehlende Logik. Verteidigende Bots, die einen gegnerischen Capture-Versuch contesten:

Skill Versucht Capture zu blocken?
Easy Nein
Normal 50% Chance
Hard Ja
Expert Ja

Die komplette Übersichtstabelle

Aspekt Easy Normal Hard Expert Notizen
Sicht: Erkennungszeit 1,00s 0,50s 0,30s 0,20s
Zielen: Tracking-Rate 1x/s 4x/s 10x/s 20x/s Spies nutzen immer Normal
Granaten/Sticky-Bogenkompensation Ja Ja Ja Ja Loose Cannon ausgenommen
Huntsman-Vertikalkompensation Nein Ja Ja Ja
Huntsman-Headshots Nein <150 HU Ja Ja
Raketenwerfer-Fußschuss Nein Ja Ja Ja Direct Hit und Cow Mangler ausgenommen
Sniper-Gewehr-Zielpunkt Körper ~33% zum Kopf Kopf Kopf
Chance diskrete Schüsse zu bemerken 10% 30% 60% 90% Halbiert wenn von lauten Schüssen maskiert
Zielt auf Heiler Nein 50% Ja Ja
Entfernter Medic/Engineer/zielender Sniper = Bedrohung Nein Nein Ja Ja
Ausweichen Nein Ja Ja Ja Lange Ausnahmeliste
Vermeidet Feind-Anrempeln Nein Nein Ja Ja Vor allem wichtig für Spy
Chance Airblast auszulösen 0% 50% 90% 100%
Spy-Tarnklassenwahl Zufällig Zufällig Entspricht echtem Gegner Entspricht echtem Gegner
Spy-Augenkontakt in Tarnung Starrt (offensichtlich) Starrt Meidet (überzeugend) Meidet
Spy-Backstab-Winkel ~0° ±45° ±78° ±90° MvM forct Normal
Waffenauswahllogik Nein Ja Ja Ja Weniger relevant in MvM
Nachladen in Deckung Nein Nein Ja Ja Nicht in MvM
CP-Verteidiger-Streifen 10% 50% 75% 90% Nicht in MvM
CP-Capture-Blocken Nein 50% Ja Ja Nicht in MvM

Fazit

TF2-Heavy-Bot zielt mit Minigun

All das spiegelt ein deliberates Valve-System: Vollständig deterministische Scores und Wahrscheinlichkeiten, nur nie offiziell dokumentiert. Hier die Punkte, die ich nach diesem Tiefgang mitnehme:

  1. "Skill" ist ein Set unabhängiger Slider, kein globaler Multiplikator. Reaktionszeit, Zielkadenz und jedes taktische Verhalten skalieren separat, und manche (Spy-Tracking-Rate, MvM-Backstab-Winkel) haben hardcodierte Overrides egal Level.
  2. Ein Teil ist wirklich verbuggt, nicht nur alt. Die seit 2010 eingefrorene Diskret-Waffenliste, der Cow Mangler ohne Fußschusslogik aus keinem guten Grund, der Sniper-Skalarprodukt-Check, der Jahre brauchte, um korrekt dekompiliert zu werden: Valves KI-Code hat Narben wie jede 17 Jahre alte Codebase.
  3. Du kannst das alles nutzen. Wissen, dass dich ein Normal-Sniper-Bot nicht headshotten wird, dass ein Easy-Pyro deine Rakete buchstäblich nicht reflektieren kann, dass ein Easy-Spy versuchen wird, dich frontal zu erstechen. Das ist kein Glück. Das ist ein Datenblatt.

Riesiges Danke an sigsegv für den Original-Code-Deep-Dive, der das meiste davon erst möglich machte, ans TF2-Wiki für Basisdokumentation zu Bot-Commands und Map-Support, und an alle in der Community, die weiter eine 17 Jahre alte Bot-KI auseinandernehmen, um exakt zu verstehen, warum sie tut, was sie tut.

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

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

Введение

Бот-солдат TF2, целящийся из ракетницы

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

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


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

Бот против бота-марионетки

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

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

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

Что можно (более-менее) приказать ИИ-ботам

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

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

Запуск ботов на неподдерживаемых картах

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

  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-подобное поведение, но едва используют крюки или пауэрапы. Если у карты нет цели, узнаваемой ИИ ботов, но есть энтити комнаты спавна, установка tf_bot_offense_must_push_time 0 позволяет им всё равно сражаться.

(Источник для этой секции : страница Bots официальной вики TF2.)

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

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

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

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

Свалка вещей, которые делает каждый бот независимо от уровня :

  • Боты используют только базовые лоадауты (плагин может форсить им нестандартные оружия, но ванильные боты никогда не выбирают свои).
  • Лёгкие боты едва используют вторичное оружие. Более высокие сложности переключаются на вторичку, как только основной магазин пуст, или чтобы компенсировать дистанцию.
  • Боты игнорируют продвинутые техники движения : никаких rocket jump, никакого переноса построек.
  • После килла бот может насмехаться, даже под огнём, если только не несёт вражеские разведданные, и это правило действует и в MvM.
  • Переодетые боты-спаи (игрок или ИИ) корректно игнорируются другими ботами : пока они не тронут врага, не саботируют что-то, не выстрелят или не станут невидимыми рядом с кем-то. Будучи «раскрытым», этот конкретный бот/игрок запоминается как Спай, пока не сменит переодевание, оставаясь невидимым, не умрёт или не симулирует смерть через Dead Ringer.
  • Боты-поджигатели используют сжатый воздух щедро начиная с уровня Нормальный.
  • Боты-медики приоритизируют лечение всех, кроме Снайперов (и, в меньшей мере, Инженеров), даже если спамишь «Medic!», будучи таким.
  • Боты-медики тяготеют к Хэви, Солдатам, Демоменам и Поджигателям : конкретно когда человек играет эти классы. Это внимание следует присутствию человека в этих ролях.
  • Боты стоят на месте во время времени подготовки на картах Attack/Defense и Payload, кроме Инженеров, Снайперов и Спаев, двигающихся свободно (ботам-Демоменам также разрешено предустанавливать липучки).
  • Боты-инженеры никогда не улучшают и не отключают постройки другого союзного Инженера, если только эта постройка не на пути их цели. Иногда они просто вообще не чинят собственную турель, даже когда это кажется очевидным.
  • Замеченные боты-спаи переключаются на револьвер и отступают вместо того, чтобы форсировать удар ножом.
  • Боты-демомены, локализовавшие турель (обычно раз умерев на ней), могут идеально закидывать липучки на неё из-за её радиуса, дугой сквозь стены и потолки, когда геометрия позволяет.
  • Боты-снайперы, не нашедшие цели после прицеливания, используют одну из голосовых строк «Negatives.»
  • Союзные медики лечат переодетого Спая без колебаний.

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

Документ перечисляет немало давних странностей :

  • Боты могут пытаться ходить или стрелять сквозь отдельные статичные пропсы.
  • Каждый раз, когда игрок/бот раскрывается, переодевается или выявляется, близкие боты это «видят» и оборачиваются реагировать : даже если событие случилось вне их реального поля зрения. Это не на слухе ; это обход проверки зрения.
  • Редко боты могут физически застревать друг с другом на телепорте Инженера.
  • Голосовые команды ботов (напр. «Spy!», «Вперёд!») не показываются текстом в чате, как у игроков.
  • Активно лечащий бот-медик не будет уклоняться от входящих выстрелов и брать аптечки, даже на критических HP.
  • Боты могут продолжать двигаться во время парной насмешки, что ломает задуманный эффект Festive Critical Strike.
  • Недавно раненые боты-медики часто отказываются использовать Syringe Gun на дистанции, предпочитая ближний бой (или, в очень редких случаях, пытаясь дотронуться лучом Medi Gun).
  • Боты-медики не компенсируют гравитацию для выстрелов Syringe Gun : вероятно, потому что оружие некорректно помечено как не-hitscan в коде ИИ.
  • Боты-спаи могут видеть и преследовать невидимого Спая (игрока или ИИ), если этот Спай уже был однажды раскрыт, независимо от уровня навыка преследующего бота.
  • Даже если игрок-спай переодевается в класс собственной команды, задевание врага всё равно его раскрывает (боты сами так никогда не делают, поскольку боты никогда не переодеваются в свою команду).
  • Боты уважают автобаланс команд : если пытаешься напихать ботов на одну сторону, надо сначала использовать mp_teams_unbalance_limit 0.
  • Боты-инженеры могут полностью игнорировать собственные постройки, пока те не уничтожены.
  • Боты-хэви иногда пытаются стрелять из Минигана без патронов, особенно ниже уровня Сложный.
  • Боты-медики проигрывающей команды иногда суицидятся во время фазы Унижения, когда рядом нет врагов -- чего человек-игрок не может воспроизвести, даже стараясь.
  • Установка предпросмотра команды на BLU на экране загрузки делает ботов RED визуально отрендеренными в BLU.
  • Боты с оружием ближнего боя в руках иногда отказываются менять оружие даже после подбора патронов.
  • После Jungle Inferno боты, заспавненные с явными параметрами (напр. tf_bot_add 5 pyro bleu 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 Hoovy.»


Глава II : Оригинальные боты / 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

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

Энтити bot_generator

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

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

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

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

Бот-хэви TF2 в позиции ожидания

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

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

Навык Минимальное время распознавания
Лёгкий 1,00 с
Нормальный 0,50 с
Сложный 0,30 с
Эксперт 0,20 с

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

Наводка : частота сопровождения

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

Навык Интервал пересчёта Эквивалентная частота
Лёгкий 1,00 с 1x/s
Нормальный 0,25 с 4x/s
Сложный 0,10 с 10x/s
Эксперт 0,05 с 20x/s

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

Наводка : оружейная специфика

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

Гранатомёт и липучкомёт. Все уровни навыка компенсируют вертикальную дугу, используя фиксированное значение cvar 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 (нет площади для эксплуатации) ; ноль смысла для Cow Mangler : эта часть ИИ старше существования оружия и просто никогда не пересматривалась.

Снайперские винтовки. Лёгкий целит в тело. Нормальный целит примерно на 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 Строительный КПК Инженера
TF_WEAPON_PDA_ENGINEER_DESTROY КПК сноса Инженера
TF_WEAPON_PDA_SPY Маскировочный набор Спая
TF_WEAPON_BUILDER Набор инструментов Спая/Инженера/Сапёра
TF_WEAPON_MEDIGUN Все Мед-ганы
TF_WEAPON_DISPENSER Вероятно не используется (Диспенсеры это объекты, а не оружия)
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 -- отдельный ID, нетихий)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, 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

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

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

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

Спай : эффективность переодевания

Два отдельных измерения растут с навыком. Выбор переодевания :

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

Поведение в переодевании :

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

Спай : агрессивность бэкстаба

На длинной дистанции (до 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,00s 0,50s 0,30s 0,20s
Наводка : частота сопровождения 1x/s 4x/s 10x/s 20x/s Спаи всегда на Нормальном
Компенсация дуги гранат/липучек Да Да Да Да 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 без логики стрельбы в ноги без веской причины, проверка скалярного произведения Снайпера, годы не декомпилировавшаяся корректно : в коде ИИ Valve шрамы, как в любой 17-летней кодовой базе.
  3. Всё это можно использовать. Знай, что бот-Снайпер не сделает тебе хедшот на Нормальном, что Лёгкий Поджигатель буквально не может отразить твою ракету, что Лёгкий Спай попытается зарезать тебя в лицо. Это не удача. Это техническая карта.

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

Los bots TF2 no son aleatorios: redescubrí cada parámetro de dificultad

Visión, puntería, ángulos de backstab, lógica de headshot, cada bug conocido: Valve nunca documentó nada. Así que escarbamos el código y lo convertimos en una ficha técnica completa.

Introducción

Soldado bot TF2 apuntando con un lanzacohetes

Cada jugador de TF2 lo dijo al menos una vez: «ese bot hace trampas.» O lo inverso: «¿por qué ese bot Fácil se queda plantado comiendo cohetes?» Nadie sabe de verdad qué significan «Fácil», «Normal», «Difícil» y «Experto» bajo el capó: Valve despachó cuatro etiquetas de dificultad y exactamente cero documentación.

Así que un grupo de nosotros (yo, awimii, Mush The Possum, con una enorme parte del trabajo base hecho por sigsegv, que de verdad escarbó el código descompilado del juego) reunió un documento de investigación completo sobre el comportamiento de los TFBot. Cada mecánica, cada bug conocido, cada probabilidad codificada en duro. Este artículo es el informe íntegro, no la versión condensada. Coged un Bonk, va a ser largo.


Capítulo I: Las bases

Bot vs Bot Marioneta

TF2 tiene dos cosas por completo distintas que la gente llama «bots»:

  • Bots IA (TFBots): verdadera IA, construida sobre el mismo framework PlayerBot/Infected que Valve usó para la serie Left 4 Dead. Eligen una clase aleatoria, juegan el objetivo, funcionan sin sv_cheats y disparan los logros como un verdadero jugador.
  • Bots Marioneta: cero IA, incapaces de moverse o actuar por sí mismos. Solo existen para ser controlados manualmente: un jugador puede forzarlos a seguir, apuntar y disparar. Usados principalmente para tests o para hacer capturas de pantalla y vídeos cinemáticos. Hacerlos aparecer necesita sv_cheats 1, lo que también desactiva los logros para la sesión.

Este artículo trata por entero del primer tipo.

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

Los TFBot no son directamente controlables, pero se les puede incitar a hacer ciertas cosas:

  • Apunta a cualquier bot (aliado o enemigo) con tu crosshair y te hará una burla si usas los comandos de voz correctos.
  • Un bot Medic aliado te cura si usas el comando de voz «¡Medic!»
  • Si un bot Medic te cura y tiene una UberCharge lista, decir «¡Vamos vamos vamos!» o «¡Activa la carga!» hace que dispare la carga de inmediato.
  • Un bot Medic con una carga lista la activa automáticamente en cuanto él mismo o su objetivo de cura sufre daños serios, sin comando de voz necesario.
  • Los bots hacen espontáneamente burlas en dúo (High Five) o burlas de grupo (Conga) con compañeros cercanos.

Hacer funcionar los bots en mapas no soportados

Los bots dependen de una malla de navegación para saber dónde tienen derecho a caminar, y la mayoría de los mapas comunitarios no aportan una. Para forzar:

  1. sv_cheats 1
  2. nav_generate: construye el navmesh inicial, progresión mostrada en la consola
  3. Espera a que el juego termine de generar los caminos
  4. Opcionalmente, corrige manualmente los malos datos de navegación con nav_edit 1
  5. Recarga o reinicia el servidor (saltar este paso desactiva los logros)
  6. tf_bot_add <número> para hacer aparecer los bots

Advertencia: modificar el navmesh mientras hay bots activos en el servidor puede colgar el juego. Una vez existe la malla, no necesitas regenerarla para las sesiones futuras: solo añade los bots con tf_bot_add.

Las mallas autogeneradas funcionan mejor en los mapas Punto de Control, King of the Hill, Payload y CTF. En los mapas Mannpower, los bots adoptan por defecto un comportamiento tipo CTF pero apenas usan los ganchos o los powerups. Si un mapa no tiene objetivo que la IA del bot reconozca pero tiene una entidad de sala de aparición, definir tf_bot_offense_must_push_time 0 permite a los bots combatir igualmente.

(Fuente para esta sección: la página Bots del wiki oficial TF2.)

Estado actual, mapa por mapa

Gracias a la actualización Hatless, cada clase funciona correctamente ahora, incluido el Spy históricamente bugueado. Los bots se comportan correctamente en la mayoría de los mapas KOTH oficiales, ciertos mapas Payload, Dustbowl/Gorge Attack-Defense y los mapas CTF/Mann Manor. En esos dos últimos, no puedes hacerlos aparecer directamente con tf_bot_add. En los mapas no soportados (vía el proceso nav_generate de arriba), funcionan, pero son claramente menos buenos imitando un verdadero jugador.

Los mapas PLR son una causa perdida: los bots no pueden franquear las barreras en Hightower y se atascan en las esquinas, y en todos los demás mapas PLR solo hacen... una fiesta de baile en vez de jugar. Quizá se corrija algún día, quizá quede así.

Comportamiento general de los bots

Un cajón de cosas que cada bot hace con independencia de su nivel:

  • Los bots solo usan loadouts base (un plugin puede forzarles armas no estándar, pero los bots vanilla nunca eligen las suyas).
  • Los bots Fáciles apenas usan su arma secundaria. Las dificultades superiores pasan al arma secundaria en cuanto el cargador principal está vacío, o para compensar la distancia.
  • Los bots ignoran las técnicas de movimiento avanzadas: ningún rocket jump, ninguna recolocación de edificio.
  • Tras un kill, un bot puede burlarse, incluso bajo fuego, salvo si lleva la inteligencia enemiga, y esa regla también se aplica en MvM.
  • Los bots Spy disfrazados (jugador o IA) los ignoran correctamente los demás bots: hasta que tocan un enemigo, sabotean algo, disparan o se vuelven invisibles cerca de uno. Una vez «descubiertos», ese bot/jugador específico se memoriza como Spy hasta que cambia de disfraz manteniéndose invisible, muere o finge su muerte con el Dead Ringer.
  • Los bots Pyro usan el Compression Blast liberalmente desde el nivel Normal.
  • Los bots Medic priorizan las curas sobre todo el mundo salvo los Snipers (y, en menor medida, los Engineers), aunque spamees «¡Medic!» siendo uno.
  • Los bots Medic gravitan hacia los Heavies, Soldiers, Demomen y Pyros: específicamente cuando un humano juega esas clases. Esa atención sigue la presencia de un humano en esos roles.
  • Los bots quedan en posición durante el tiempo de preparación en los mapas Attack/Defense y Payload, salvo los Engineers, Snipers y Spies, que se mueven libremente (los bots Demoman también tienen autorizado precolocar bombas lapa).
  • Los bots Engineer nunca mejoran ni desactivan las construcciones de otro Engineer aliado, a menos que esa construcción esté en el camino de su objetivo. A veces simplemente no reparan su propia torreta, aunque parezca evidente.
  • Los bots Spy detectados pasan a su revólver y retroceden en vez de forzar una cuchillada.
  • Los bots Demoman que localizaron una centinela (generalmente muriendo sobre ella una vez) pueden lanzar perfectamente bombas lapa sobre ella desde fuera de su alcance, en arco a través de muros y techos cuando la geometría lo permite.
  • Los bots Sniper que no encuentran objetivo tras apuntar usan una de las líneas de voz «Negatives.»
  • Los Medics aliados curan un Spy disfrazado sin vacilar.

Problemas / bugs conocidos

El documento lista un buen número de rarezas de largo recorrido:

  • Los bots pueden intentar caminar o disparar a través de ciertos props estáticos.
  • Cada vez que un jugador/bot se desenmascara, se disfraza o se revela, los bots cercanos lo «ven» y se giran para reaccionar: aunque el evento ocurriera fuera de su campo de visión real. No se basa en el sonido; es un rodeo del test de visión.
  • Raramente, los bots pueden quedar físicamente atascados juntos usando un teletransportador de Engineer.
  • Los comandos de voz de los bots (ej. «¡Spy!», «¡Adelante!») no se muestran en texto en el chat como los de los jugadores.
  • Un bot Medic curando activamente a alguien no esquivará los disparos entrantes ni cogerá kits de salud, incluso con PV críticos.
  • Los bots pueden seguir moviéndose durante una burla en dúo, lo que rompe el efecto previsto del Festive Critical Strike.
  • Los bots Medic recién heridos a menudo se niegan a usar el Syringe Gun a distancia, prefiriendo el cuerpo a cuerpo (o, en rarísimos casos, intentando tocarte con el propio rayo del Medi Gun).
  • Los bots Medic no compensan la gravedad para los disparos del Syringe Gun: probablemente porque el arma no está correctamente marcada como no-hitscan en el código IA.
  • Los bots Spy pueden ver y seguir un Spy invisible (jugador o IA) si ese Spy ya se descubrió una vez, con independencia del nivel de habilidad del bot que lo sigue.
  • Aunque un jugador-Spy se disfrace de clase de su propio equipo, chocar un enemigo lo desenmascara igualmente (los bots nunca se hacen eso a sí mismos, porque los bots nunca se disfrazan de su propio equipo).
  • Los bots respetan el balanceo automático de equipos: si intentas amontonar bots de un lado, primero tienes que usar mp_teams_unbalance_limit 0.
  • Los bots Engineer pueden ignorar por completo sus propias construcciones hasta que se destruyen.
  • Los bots Heavy a veces intentan disparar el Minigun estando sin munición, sobre todo por debajo del nivel Difícil.
  • Los bots Medic del equipo perdedor se suicidan ocasionalmente durante la fase de Humillación cuando ningún enemigo está cerca: algo que un jugador humano no puede reproducir ni intentándolo.
  • Poner tu vista previa de equipo en BLU en la pantalla de carga hace que los bots RED te parezcan visualmente renderizados en BLU.
  • Los bots con un arma cuerpo a cuerpo fuera a veces se niegan a cambiar de arma incluso tras recoger munición.
  • Tras Jungle Inferno, los bots aparecidos con parámetros explícitos (ej. tf_bot_add 5 pyro azul normal) pueden morir al instante en su propia sala de aparición. Correctivo: tf_bot_reevaluate_class_in_spawnroom 0 (necesita sv_cheats 1).

Nombres de las IA

Los nombres de los bots salen de un gran depósito de referencias a TF2, a otros juegos Valve y a la cultura de programación, en gran parte porque la comunidad no paraba de pedir específicos en los foros 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 decenas de otros del mismo género.

También hay un lote de nombres encontrados en un build fuente filtrado que nunca se envió a 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? e I'm your huckleberry.

Puedes reemplazar todo eso tú mismo: tf_bot_add heavyweapons blue "Blu Hoovy" hace aparecer un Heavy BLU llamado «Blu Hoovy.»


Capítulo II: Los bots originales / TFBots: inmersión en los niveles de habilidad

El marco original de Sigsegv sigue en pie: es evidente que los bots Experto superan los bots Fácil, pero Valve nunca explicó cuánto ni por qué. Así que la única forma de saberlo es leer el código. Aquí cada mecánica que evoluciona con la habilidad.

Ajustar la dificultad

Fuera del MvM, la dificultad la controla una cvar:

tf_bot_difficulty Nivel de dificultad
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 MvM

En Mann vs. Machine, cada bloque de spawn TFBot en el popfile tiene una clave Skill opcional. La ausencia de clave corresponde al nivel Fácil. En las misiones de Valve: los Gigantes son casi siempre Experto, los Engineers y los Spies son casi siempre Experto, y los Snipers son generalmente Difícil (ocasionalmente Experto). Si usas EventChangeAttributes (añadido en la actualización Two Cities) para modificar dinámicamente los bots en curso de oleada según eventos de mapa, la habilidad del bot es una de las propiedades que puedes cambiar al vuelo.

Modo Endless MvM

El modo Endless nunca se envió oficialmente, pero dentro, los bots gastan su dinero en mejoras como los jugadores, incluida una mejora exclusiva de bots que aumenta su nivel de habilidad IA en curso de juego.

La entidad bot_generator

Una entidad oscura, ampliamente indocumentada, presuntamente usada en el modo entrenamiento y quizá en el desarrollo temprano del MvM. Expone una entrada SetDifficulty para controlar el nivel de habilidad. Más allá, la pista se enfría: Valve nunca la documentó y nadie cartografió por entero su comportamiento.

Color del brillo ocular

Los robots MvM tienen una partícula de brillo ocular que cambia de color con el nivel de habilidad, un indicador visual que nadie fuera de la comunidad explicó jamás:

Habilidad Color de los ojos RGB
Fácil/Normal Azul #24b4ff
Difícil/Experto Amarillo #fff000

Heavy bot TF2 en posición de espera

Visión: tiempo de reconocimiento

Un bot no reacciona al instante cuando algo entra en su campo de visión: hay un retardo codificado en duro antes de que el resto de la IA siquiera tenga autorizado reconocer la amenaza:

Habilidad Tiempo de reconocimiento mínimo
Fácil 1,00 s
Normal 0,50 s
Difícil 0,30 s
Experto 0,20 s

Es lo esencial del efecto «los bots Fáciles parecen tontos» en una sola cifra: un bot Fácil no apunta peor una vez que te notó, simplemente tarda cinco veces más en notar tu existencia.

Puntería: tasa de seguimiento

Los bots no te rastrean en continuo. Muestrean tu posición y tu velocidad a un intervalo fijo y prevén una línea recta desde 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 codificados en duro con la tasa de seguimiento Normal sea cual sea su nivel de habilidad real: un Spy Experto siempre apunta como un bot Normal. También existe un vídeo de demostración pública comparando las tasas de seguimiento lado a lado si quieres ver la brecha 1x vs 20x en movimiento.

Puntería: habilidad específica de armas

Los bots no solo apuntan a tu centro de masa: tienen una lógica por arma, a veces realmente bugueada:

Lanzagranadas y Lanzabombas lapa. Todos los niveles dea habilidad compensan el arco vertical, usando un valor fijo de la cvar tf_bot_ballistic_elevation_rate. Como esa compensación solo se activa para el ID de arma base, las variantes de proyectiles más rápidos (Loch-n-Load, todo lo con un modificador de velocidad de proyectil) no tienen el arco correctamente ajustado. Y como va ligado por el ID de arma específicamente, el Loose Cannon (un ID distinto) no recibe ninguna compensación de arco.

Huntsman. Los bots Fáciles no compensan la caída de la flecha y nunca buscan headshots. Los bots de nivel Normal compensan el arco, pero solo apuntan la cabeza a menos de 150 HU. Los bots Difícil/Experto siempre apuntan la cabeza.

Lanzacohetes. Más allá de 150 HU, los bots no Fáciles apuntan a tus pies en vez del centro de masa, maximizando las probabilidades de daño de zona y de empuje. A menos de 150 HU, pasan a los headshots. Los bots Fáciles siempre apuntan el centro de masa sea cual sea la distancia. También va bloqueado por ID de arma: el Direct Hit y el Cow Mangler no heredan ese comportamiento. Lógico para el Direct Hit (sin zona de efecto que explotar); cero sentido para el Cow Mangler: esa parte de la IA es anterior a la existencia del arma y simplemente jamás se revisó.

Fusiles de sniper. Fácil apunta el cuerpo. Normal apunta a un 33% del cuerpo hacia la cabeza. Difícil/Experto apuntan directo la cabeza. Menos importante en MvM, donde los headshots de los bots no obtienen el bonus de daños de todos modos.

Oído: sensibilidad a los disparos discretos

Cada disparo alerta los bots cercanos de la posición del tirador, incluso a través de los muros, hasta 3000 HU con 100% de probabilidad de notarse (tf_bot_notice_gunfire_range). Pero un subconjunto de armas están marcadas «discretas»: audibles solo en 500 HU (tf_bot_notice_quiet_gunfire_range), e incluso entonces con una probabilidad dependiente de la habilidad:

Habilidad Probabilidad de notar un disparo discreto
Fácil 10%
Normal 30%
Difícil 60%
Experto 90%

Esa probabilidad se divide por dos si un disparo ruidoso se oyó en los 3 últimos segundos: los sonidos fuertes enmascaran los sonidos débiles.

La lista de los ID de armas discretas no se actualizó desde diciembre de 2010. Toda adición posterior usando un nuevo ID de arma se trata como ruidosa por defecto, da igual lo discretamente lógica que deba ser, salvo si reutiliza un ID más antiguo. En concreto:

ID de arma Cubre
TF_WEAPON_KNIFE Todos los cuchillos de Spy
TF_WEAPON_FISTS Puñetazos específicos del Heavy (su puñetazo multiclase es de hecho TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Presunto sin uso directo
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 disfraz del Spy
TF_WEAPON_BUILDER Kit de herramientas de Spy/Engineer/Saboteador
TF_WEAPON_MEDIGUN Todos los Medi Guns
TF_WEAPON_DISPENSER Probablemente sin uso (los Dispensers son objetos, no armas)
TF_WEAPON_INVIS Todos los relojes de invisibilidad de Spy
TF_WEAPON_FLAREGUN Todas las pistolas de bengalas Pyro salvo 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 discreto)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

El ejemplo clásico de la lista que se pudre: el Manmelter recibió su propio ID (TF_WEAPON_RAYGUN_REVENGE), añadido después de que la lista de armas discretas quedara congelada, así que se trata como ruidoso, pese a ser una pistola de bengalas en todos los sentidos prácticos. El Scorch Shot, salido aún más tarde, reutiliza el ID base TF_WEAPON_FLAREGUN y por tanto sigue considerándose discreto. Insensato, pero es el código.

Estrategia: priorización de amenazas

Cuando varios enemigos están visibles a la vez, los bots ponderan la distancia, si les disparan y, por encima de Fácil, si la amenaza principal está siendo curada:

Habilidad ¿Apunta al curandero 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 los Medics y Engineers distantes como amenazas inmediatas, y todo Sniper enemigo apuntando aproximadamente en tu dirección siempre se trata como inmediato sea cual sea la distancia y la habilidad.

Habilidad ¿Medics/Engineers distantes/Snipers apuntando = amenaza inmediata?
Fácil/Normal No
Difícil/Experto Sí

Esa comprobación del Sniper tiene una historia sorprendente que siempre me gusta contar. El escrito original de Sigsegv suponía que el juego exigí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 dispararía en cálculo flotante, volviendo toda la función efectivamente código muerto. Una corrección publicada más tarde (crédito a una descompilación Hex-Rays más limpia) mostró que la comprobación real es producto escalar > 0: todo Sniper encarando desde directamente hacia ti hasta perpendicular a ti se considera amenaza inmediata; todo lo que va de perpendicular a dando la espalda no lo es. La mala lectura original venía de una mala descompilación de una comparación SSE de flotantes. Hacer reverse-engineering de un binario AAA sigue siendo un ejercicio aproximado.

Movimiento: esquiva

Los bots Fáciles nunca esquivan, punto final. Los bots Normal y superiores esquivan a izquierda/derecha (33% izquierda, 33% derecha, 33% no hacer nada, ponderado contra los agujeros detectados) cuando sostienen un arma de combate, vieron un enemigo en los 3 últimos segundos y ese enemigo tiene línea de vista sobre ellos.

No esquivarán si se aplica uno de estos casos: atributo DisableDodge definido, comportamiento actual dice darse prisa, actualmente invulnerable (cualquier uber), en plena burla/provocación, juega Engineer, invisible o disfrazado de Spy, apuntando como Sniper o girando como Heavy, o tensando el Huntsman.

Movimiento: evitar empujar enemigos

Por encima de Normal, los bots intentan específicamente no entrar en los enemigos al desplazarse:

Habilidad ¿Evita empujar enemigos?
Fácil No
Normal No
Difícil Sí
Experto Sí

En la práctica, eso solo importa para los bots Spy: evitar una colisión incómoda con un jugador enemigo es justo el tipo de cosa que compromete un disfraz.

Pyro: maestría del airblast

El airblast sirve para dos cosas: reflejar los proyectiles (PvP y MvM) y empujar enemigos cerca de los bordes (solo PvP). Que el bot pulse o no el gatillo ante una oportunidad válida es un cara o cruz basado en la habilidad:

Habilidad Probabilidad de disparar el airblast
Fácil 0%
Normal 50%
Difícil 90%
Experto 100%

Los bots Pyro Fáciles literalmente no pueden hacer airblast: el sorteo está codificado en duro para no acertar nunca, no solo «raramente.»

Spy: eficacia del disfraz

Dos ejes distintos evolucionan con la habilidad. Elección del disfraz:

Habilidad Método de disfraz
Fácil/Normal Clase aleatoria, ignorando lo que el equipo enemigo juega de verdad
Difícil/Experto Elige un verdadero jugador enemigo y copia su clase exacta

Comportamiento disfrazado:

Habilidad Comportamiento disfrazado/invisible
Fácil/Normal Fija los jugadores enemigos cuando los ve (sospechoso)
Difícil/Experto Evita deliberadamente el contacto visual (más convincente)

Spy: agresividad del backstab

A largo alcance (hasta 300 HU, tf_bot_spy_knife_range), un bot Spy solo se mete en un backstab si puede ver la víctima y la espalda de la víctima está al menos parcialmente girada. La habilidad determina cuánto puede descentrarse ese ángulo de espalda:

Habilidad Tolerancia de ángulo
Fácil Intenta aunque le mires directo a la cara
Normal ±45° de tu espalda
Difícil ±78° de tu espalda
Experto ±90° de tu espalda (arco trasero completo de 180°)

Los bots Spy Fáciles son funcionalmente suicidas: intentarán una cuchillada contra alguien que los mira a los ojos. Excepción: en Mann vs. Machine, cada bot Spy queda forzado a la restricción de ángulo Normal sea cual sea su nivel de habilidad real.

Tácticas: selección de armas

Esa lógica solo concierne los niveles por encima de Fácil, con un interés reducido en MvM porque los bots ahí suelen tener restricciones de armas estrictas:

  • Scout: pasa al arma secundaria cuando el cargador del primario está vacío.
  • Soldier: pasa al arma secundaria cuando el cargador está vacío y el objetivo está a menos de 500 HU.
  • Sniper: pasa al arma secundaria para los objetivos a menos de 750 HU.
  • Pyro: pasa al arma secundaria para los objetivos a más de 750 HU, salvo si ese objetivo es un Soldier o un Demoman.

Tácticas: recarga a cubierto

Lógica ausente del MvM. Si el comportamiento actual del bot no le dice batirse en retirada, su cargador principal está vacío y queda vulnerable sin uber, los bots de nivel superior se retiran temporalmente a cubierto para recargar en vez de hacer clic en un arma vacía frente a ti:

Habilidad ¿Se retira para recargar?
Fácil No
Normal No
Difícil Sí
Experto Sí

Modo CP: vagabundeo del defensor

Lógica ausente del MvM. Defendiendo un punto de control, los bots de nivel superior son más susceptibles de dejar el punto para cazar kills («search and destroy»), pero solo con un tiempo decente restante en tf_bot_defense_must_defend_time:

Habilidad Probabilidad de vagar
Fácil 10%
Normal 50%
Difícil 75%
Experto 90%

Modo CP: bloqueo de captura

Lógica ausente del MvM. Los bots defensores contestando un intento de captura enemiga:

Habilidad ¿Intentará bloquear la captura?
Fácil No
Normal 50% de probabilidad
Difícil Sí
Experto Sí

El cuadro resumen completo

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 Los Spies siempre usan Normal
Compensación de arco granada/bomba lapa Sí Sí Sí Sí Loose Cannon exento
Compensación vertical Huntsman No Sí Sí Sí
Headshots Huntsman No <150 HU Sí Sí
Disparo a los pies Lanzacohetes No Sí Sí Sí Direct Hit y Cow Mangler exentos
Punto de puntería Fusil de sniper Cuerpo ~33% hacia cabeza Cabeza Cabeza
Probabilidad de notar disparos discretos 10% 30% 60% 90% Dividida por 2 si enmascarada por disparos ruidosos
Apunta al curandero No 50% Sí Sí
Medic/Engineer/Sniper distante = amenaza No No Sí Sí
Esquiva No Sí Sí Sí Larga lista de excepciones
Evita empujar enemigos No No Sí Sí Sobre todo importante para Spy
Probabilidad de disparar el airblast 0% 50% 90% 100%
Elección de clase del disfraz Spy Aleatoria Aleatoria Corresponde a un verdadero enemigo Corresponde a un verdadero enemigo
Contacto visual Spy disfrazado Fija (evidente) Fija Evita (convincente) Evita
Ángulo de backstab Spy ~0° ±45° ±78° ±90° MvM fuerza Normal
Lógica de selección de armas No Sí Sí Sí Menos pertinente en MvM
Recarga a cubierto No No Sí Sí No en MvM
Vagabundeo defensor CP 10% 50% 75% 90% No en MvM
Bloqueo de captura CP No 50% Sí Sí No en MvM

Conclusión

Heavy bot TF2 apuntando con un minigun

Todo eso refleja un sistema deliberado de Valve: puntuaciones y probabilidades por entero deterministas, simplemente jamás documentados oficialmente. Aquí los puntos que retengo tras esa inmersión:

  1. La «habilidad» es un conjunto de cursores independientes, no un multiplicador global. El tiempo de reacción, la cadencia de puntería y cada comportamiento táctico evolucionan por separado, y algunos (tasa de seguimiento Spy, ángulo de backstab MvM) tienen machaques codificados en duro sea cual sea el nivel.
  2. Una parte está realmente bugueada, no solo vieja. La lista de armas discretas congelada desde 2010, el Cow Mangler sin lógica de disparo a los pies sin ninguna buena razón, la comprobación del producto escalar del Sniper que tardó años en descompilarse correctamente: el código IA de Valve tiene cicatrices como cualquier base de código de 17 años.
  3. Puedes usar todo eso. Sabe que un bot Sniper no te hará headshot en Normal, que un Pyro Fácil literalmente no puede reflejar tu cohete, que un Spy Fácil intentará acuchillarte de frente. No es suerte. Es una ficha técnica.

Un inmenso gracias a sigsegv por la inmersión en el código original que hizo posible la mayor parte de eso, al wiki TF2 por la documentación base sobre los comandos de bots y el soporte de los mapas, y a todos los de la comunidad que siguen escarbando una IA de bot vieja de 17 años para entender justo 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 menemukan ulang setiap parameter kesulitan

Penglihatan, bidikan, sudut backstab, logika headshot, setiap bug yang diketahui -- Valve tidak pernah mendokumentasikan apa pun. Jadi kami menggali kode dan mengubah semuanya menjadi lembar teknis lengkap.

Pendahuluan

Bot Soldier TF2 membidik dengan peluncur roket

Setiap pemain TF2 mengatakannya minimal sekali : "bot ini curang." Atau sebaliknya : "kenapa bot Mudah ini diam saja makan roket." Tidak ada yang benar-benar tahu apa arti "Mudah", "Normal", "Sulit" dan "Expert" di balik kapnya : Valve mengirim empat label kesulitan dan tepat nol dokumentasi.

Jadi sekelompok dari kami (saya, awimii, Mush The Possum, dengan sebagian besar pekerjaan dasar dilakukan sigsegv, yang benar-benar menggali kode yang didekompilasi permainan) mengumpulkan dokumen riset lengkap soal perilaku TFBot. Setiap mekanik, setiap bug yang diketahui, setiap probabilitas yang di hardcode. Artikel ini adalah laporan utuh, bukan versi ringkas. Ambil Bonk, ini akan panjang.


Bab I : Dasar

Bot vs Bot Boneka

TF2 punya dua hal yang sama sekali berbeda yang disebut orang "bot" :

  • Bot AI (TFBot) : AI sungguhan, dibangun di atas framework PlayerBot/Infected yang sama yang dipakai Valve untuk seri Left 4 Dead. Mereka memilih kelas acak, memainkan objektif, berfungsi tanpa sv_cheats dan memicu achievement seperti pemain sungguhan.
  • Bot Boneka : nol AI, tidak bisa bergerak atau bertindak sendiri. Mereka ada hanya untuk dikendalikan manual -- pemain bisa memaksa mereka mengikuti, membidik dan menembak. Terutama dipakai untuk pengujian atau untuk membuat tangkapan layar dan video sinematik. Memunculkannya membutuhkan sv_cheats 1, yang juga menonaktifkan achievement untuk sesi itu.

Artikel ini sepenuhnya soal tipe pertama.

Apa yang (kurang-lebih) bisa kita suruh bot AI lakukan

TFBot tidak bisa dikendalikan langsung, tapi kita bisa mendorong mereka melakukan hal tertentu :

  • Bidik bot mana pun (sekutu atau musuh) dengan crosshair-mu dan ia akan mengejekmu kalau kamu memakai perintah suara yang benar.
  • Bot Medic sekutu menyembuhkanmu kalau kamu memakai perintah suara "Medic!"
  • Kalau bot Medic menyembuhkanmu dan punya UberCharge siap, bilang "Go go go!" atau "Aktifkan charge!" membuatnya memicu charge segera.
  • Bot Medic dengan charge siap mengaktifkannya otomatis begitu dirinya atau target sembuhannya menerima damage serius, tanpa perintah suara perlu.
  • Bot spontan melakukan ejekan duo (High Five) atau ejekan grup (Conga) dengan rekan setim dekat.

Membuat bot bekerja di peta yang tidak didukung

Bot bergantung pada mesh navigasi untuk tahu di mana mereka boleh berjalan, dan sebagian besar peta komunitas tidak menyediakannya. Untuk memaksa :

  1. sv_cheats 1
  2. nav_generate -- membangun navmesh awal, progresi ditampilkan di konsol
  3. Tunggu permainan selesai membangkitkan jalur
  4. Opsional, perbaiki manual data navigasi yang buruk dengan nav_edit 1
  5. Muat ulang atau restart server (melewatkan langkah ini menonaktifkan achievement)
  6. tf_bot_add <jumlah> untuk memunculkan bot

Peringatan : mengubah navmesh sementara bot aktif di server bisa men crash permainan. Begitu mesh ada, kamu tidak perlu membangkitkannya ulang untuk sesi mendatang : cukup tambahkan bot dengan tf_bot_add.

Mesh yang dibangkitkan otomatis bekerja paling baik di peta Point Kontrol, King of the Hill, Payload dan CTF. Di peta Mannpower, bot bawaan berperilaku ala CTF tapi nyaris tidak memakai grapple atau powerup. Kalau peta tidak punya objektif yang dikenali AI bot tapi punya entitas ruang spawn, menyetel tf_bot_offense_must_push_time 0 memungkinkan bot tetap bertarung.

(Sumber untuk bagian ini : halaman Bots di wiki resmi TF2.)

Status saat ini, peta per peta

Berkat pembaruan Hatless, setiap kelas berfungsi benar sekarang, termasuk Spy yang historisnya bug. Bot berperilaku benar di sebagian besar peta KOTH resmi, beberapa peta Payload, Dustbowl/Gorge Attack-Defense dan peta CTF/Mann Manor. Pada dua yang terakhir, kamu tidak bisa memunculkannya langsung dengan tf_bot_add. Pada peta yang tidak didukung (lewat proses nav_generate di atas), mereka berfungsi, tapi jelas kurang bagus meniru pemain sungguhan.

Peta PLR adalah kasus hilang : bot tidak bisa melewati penghalang di Hightower dan terjebak di sudut, dan di semua peta PLR lain mereka hanya... mengadakan pesta dansa alih-alih bermain. Mungkin akan diperbaiki suatu hari, mungkin tetap begitu.

Perilaku umum bot

Campuran hal yang dilakukan setiap bot terlepas dari levelnya :

  • Bot hanya memakai loadout dasar (plugin bisa memaksa mereka memakai senjata non-standar, tapi bot vanilla tidak pernah memilih sendiri).
  • Bot Mudah nyaris tidak memakai senjata sekunder. Kesulitan di atasnya beralih ke senjata sekunder begitu magazen utama kosong, atau untuk mengkompensasi jarak.
  • Bot mengabaikan teknik gerakan lanjutan : tanpa rocket jump, tanpa relokasi bangunan.
  • Setelah kill, bot bisa mengejek, bahkan di bawah tembakan, kecuali ia membawa intelijen musuh, dan aturan ini berlaku juga di MvM.
  • Bot Spy yang menyamar (pemain atau AI) benar-benar diabaikan bot lain : sampai mereka menyentuh musuh, menyabot sesuatu, menembak atau menjadi tak terlihat di dekat musuh. Begitu "ketahuan", bot/pemain spesifik itu diingat sebagai Spy sampai ia berganti samaran sambil tetap tak terlihat, mati atau memalsukan kematiannya dengan Dead Ringer.
  • Bot Pyro memakai Compression Blast bebas mulai level Normal.
  • Bot Medic memprioritaskan penyembuhan atas semua orang kecuali Sniper (dan, dalam kadar lebih kecil, Engineer), bahkan kalau kamu spam "Medic!" sebagai mereka.
  • Bot Medic tertarik ke Heavy, Soldier, Demoman dan Pyro : khususnya ketika manusia memainkan kelas itu. Perhatian ini mengikuti kehadiran manusia dalam peran itu.
  • Bot tetap di posisi selama waktu persiapan di peta Attack/Defense dan Payload, kecuali Engineer, Sniper dan Spy, yang bergerak bebas (bot Demoman juga diizinkan menaruh bom lengket sebelumnya).
  • Bot Engineer tidak pernah meningkatkan maupun menonaktifkan bangunan Engineer sekutu lain, kecuali bangunan itu ada di jalan target mereka. Mereka kadang tidak memperbaiki turret sendiri, bahkan ketika tampaknya jelas.
  • Bot Spy yang ketahuan beralih ke revolvernya dan mundur alih-alih memaksakan tikaman pisau.
  • Bot Demoman yang telah menemukan sentry (umumnya dengan mati di atasnya sekali) bisa sempurna melempar bom lengket ke atasnya dari luar jangkauannya, melengkung melewati dinding dan langit-langit ketika geometrinya memungkinkan.
  • Bot Sniper yang tidak menemukan target setelah membidik memakai salah satu baris suara "Negatives."
  • Medic sekutu menyembuhkan Spy yang menyamar tanpa ragu.

Masalah / bug yang diketahui

Dokumen mendaftar cukup banyak keanehan lama :

  • Bot bisa mencoba berjalan atau menembak menembus prop statis tertentu.
  • Setiap kali pemain/bot membuka samaran, menyamar atau terungkap, bot dekat "melihatnya" dan berbalik bereaksi : bahkan kalau kejadiannya di luar bidang penglihatan nyata mereka. Ini tidak berdasarkan suara ; ini jalan memutar dari tes penglihatan.
  • Jarang, bot bisa terjebak bersama secara fisik memakai teleporter Engineer.
  • Perintah suara bot (mis. "Spy!", "Maju!") tidak muncul sebagai teks di chat seperti milik pemain.
  • Bot Medic yang aktif menyembuhkan seseorang tidak akan menghindari tembakan masuk maupun mengambil kit penyembuh, bahkan pada HP kritis.
  • Bot bisa terus bergerak selama ejekan duo, yang merusak efek yang dimaksud dari Festive Critical Strike.
  • Bot Medic yang baru terluka sering menolak memakai Syringe Gun dari jauh, lebih memilih jarak dekat (atau, dalam kasus sangat jarang, mencoba menyentuhmu dengan sinar Medi Gun itu sendiri).
  • Bot Medic tidak mengkompensasi gravitasi untuk tembakan Syringe Gun : mungkin karena senjata tidak ditandai benar sebagai non-hitscan dalam kode AI.
  • Bot Spy bisa melihat dan mengikuti Spy tak terlihat (pemain atau AI) kalau Spy itu sudah pernah ketahuan sekali, terlepas dari tingkat keterampilan bot yang mengikuti.
  • Meski pemain-Spy menyamar sebagai kelas timnya sendiri, menyentuh musuh tetap membuka samarannya (bot tidak pernah melakukan itu pada diri sendiri, karena bot tidak pernah menyamar sebagai timnya sendiri).
  • Bot menghormati penyeimbangan tim otomatis : kalau kamu mencoba menumpuk bot di satu sisi, kamu harus dulu memakai mp_teams_unbalance_limit 0.
  • Bot Engineer bisa sepenuhnya mengabaikan bangunannya sendiri sampai dihancurkan.
  • Bot Heavy kadang mencoba menembak Minigun padahal kehabisan amunisi, terutama di bawah level Sulit.
  • Bot Medic tim yang kalah kadang bunuh diri selama fase Penghinaan ketika tidak ada musuh dekat -- sesuatu yang tidak bisa direproduksi pemain manusia bahkan dengan mencoba.
  • Menyetel pratinjau timmu ke BLU di layar pemuatan membuat bot RED tampak ter render BLU secara visual.
  • Bot dengan senjata jarak dekat keluar kadang menolak ganti senjata bahkan setelah mengambil amunisi.
  • Setelah Jungle Inferno, bot yang dimunculkan dengan parameter eksplisit (mis. tf_bot_add 5 pyro bleu normal) bisa langsung mati di ruang spawn mereka sendiri. Perbaikan : tf_bot_reevaluate_class_in_spawnroom 0 (membutuhkan sv_cheats 1).

Nama AI

Nama bot diambil dari waduk besar referensi TF2, permainan Valve lain, dan budaya pemrograman, sebagian besar karena komunitas terus meminta yang spesifik di forum Steam. Sampel 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 sejenis.

Ada juga setumpuk nama yang ditemukan dalam build sumber bocor yang tidak pernah dikirim ke produksi, karena alasan yang tidak jelas : terutama 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.

Kamu bisa mengganti semuanya sendiri : tf_bot_add heavyweapons blue "Blu Hoovy" memunculkan Heavy BLU bernama "Blu Hoovy."


Bab II : Bot Asli / TFBot -- Menyelami Tingkat Keterampilan

Kerangka asli Sigsegv tetap bertahan : jelas bot Expert melampaui bot Mudah, tapi Valve tidak pernah menjelaskan berapa maupun kenapa. Jadi satu-satunya cara tahu adalah membaca kode. Berikut setiap mekanik yang berkembang dengan keterampilan.

Menyetel kesulitan

Di luar MvM, kesulitan dikendalikan oleh cvar :

tf_bot_difficulty Tingkat kesulitan
0 Mudah
1 Normal (bawaan)
2 Sulit
3 Expert

tf_bot_add juga menerima argumen kesulitan langsung (easy/normal/hard/expert).

Popfile MvM

Di Mann vs. Machine, setiap blok spawn TFBot dalam popfile punya kunci Skill opsional. Ketiadaan kunci cocok dengan level Mudah. Di misi Valve : Giant nyaris selalu Expert, Engineer dan Spy nyaris selalu Expert, dan Sniper umumnya Sulit (kadang Expert). Kalau kamu memakai EventChangeAttributes (ditambahkan dalam pembaruan Two Cities) untuk mengubah dinamis bot di tengah gelombang menurut event peta, keterampilan bot adalah salah satu properti yang bisa kamu ubah langsung.

Mode Endless MvM

Mode Endless tidak pernah resmi dikirim, tapi di dalamnya, bot membelanjakan uang mereka untuk peningkatan seperti pemain, termasuk peningkatan eksklusif bot yang menaikkan tingkat keterampilan AI mereka di tengah permainan.

Entitas bot_generator

Entitas yang tidak jelas, sebagian besar tidak didokumentasikan, diduga dipakai dalam mode pelatihan dan mungkin dalam pengembangan awal MvM. Ia mengekspos masukan SetDifficulty untuk mengendalikan tingkat keterampilan. Selebihnya, jejaknya dingin : Valve tidak pernah mendokumentasikannya dan tidak ada yang sepenuhnya memetakan perilakunya.

Warna kilau mata

Robot MvM punya partikel kilau mata yang berubah warna dengan tingkat keterampilan, indikator visual yang tidak pernah dijelaskan siapa pun di luar komunitas :

Keterampilan Warna mata RGB
Mudah/Normal Biru #24b4ff
Sulit/Expert Kuning #fff000

Heavy bot TF2 en position d'attente

Penglihatan : waktu pengenalan

Bot tidak bereaksi seketika ketika sesuatu masuk bidang penglihatannya : ada penundaan yang di hardcode sebelum sisa AI bahkan diizinkan mengenali ancaman :

Keterampilan Waktu pengenalan minimum
Mudah 1,00 dtk
Normal 0,50 dtk
Sulit 0,30 dtk
Expert 0,20 dtk

Ini inti dari efek "bot Mudah tampak bodoh" dalam satu angka : bot Mudah tidak membidik lebih buruk begitu ia memperhatikanmu, ia hanya butuh lima kali lebih lama untuk memperhatikan keberadaanmu.

Bidikan : laju pelacakan

Bot tidak melacakmu terus-menerus. Mereka mencuplik posisimu dan kecepatanmu pada interval tetap dan memprakirakan garis lurus dari sana :

Keterampilan Interval hitung ulang Laju setara
Mudah 1,00 dtk 1x/dtk
Normal 0,25 dtk 4x/dtk
Sulit 0,10 dtk 10x/dtk
Expert 0,05 dtk 20x/dtk

Pengecualian : bot Spy di hardcode dengan laju pelacakan Normal apa pun tingkat keterampilan nyatanya : Spy Expert selalu membidik seperti bot Normal. Ada juga video demonstrasi publik yang membandingkan laju pelacakan berdampingan kalau kamu ingin melihat kesenjangan 1x vs 20x bergerak.

Bidikan : keterampilan khusus senjata

Bot tidak hanya membidik pusat massamu : mereka punya logika per senjata, kadang benar-benar bug :

Peluncur granat dan Peluncur bom lengket. Semua tingkat keterampilan mengkompensasi busur vertikal, memakai nilai tetap dari cvar tf_bot_ballistic_elevation_rate. Karena kompensasi ini hanya aktif untuk ID senjata dasar, varian proyektil lebih cepat (Loch-n-Load, apa pun yang punya pengubah kecepatan proyektil) tidak punya busur yang disesuaikan benar. Dan karena terikat oleh ID senjata spesifik, Loose Cannon (ID berbeda) tidak menerima kompensasi busur apa pun.

Huntsman. Bot Mudah tidak mengkompensasi jatuhnya panah dan tidak pernah mencari headshot. Bot level Normal mengkompensasi busur, tapi hanya membidik kepala pada kurang dari 150 HU. Bot Sulit/Expert selalu membidik kepala.

Peluncur roket. Di atas 150 HU, bot non-Mudah membidik kakimu alih-alih pusat massa, memaksimalkan peluang damage area dan dorongan. Di bawah 150 HU, mereka beralih ke headshot. Bot Mudah selalu membidik pusat massa apa pun jaraknya. Ini juga terkunci oleh ID senjata : Direct Hit dan Cow Mangler tidak mewarisi perilaku ini. Logis untuk Direct Hit (tanpa efek area yang bisa dieksploitasi) ; nol makna untuk Cow Mangler : bagian AI ini mendahului keberadaan senjata dan tidak pernah ditinjau ulang.

Senapan sniper. Mudah membidik badan. Normal membidik sekitar 33% dari badan ke kepala. Sulit/Expert langsung membidik kepala. Kurang penting di MvM, di mana headshot bot tidak mendapatkan bonus damage.

Pendengaran : sensitivitas pada tembakan diam

Setiap tembakan memperingatkan bot dekat tentang posisi penembak, bahkan menembus dinding, hingga 3000 HU dengan peluang 100% diperhatikan (tf_bot_notice_gunfire_range). Tapi subset senjata ditandai "diam" : hanya terdengar dalam 500 HU (tf_bot_notice_quiet_gunfire_range), dan bahkan itu pun dengan peluang tergantung keterampilan :

Keterampilan Peluang memperhatikan tembakan diam
Mudah 10%
Normal 30%
Sulit 60%
Expert 90%

Probabilitas ini dibagi dua kalau tembakan berisik terdengar dalam 3 detik terakhir : suara keras menutupi suara lemah.

Daftar ID senjata diam tidak diperbarui sejak Desember 2010. Semua tambahan berikutnya yang memakai ID senjata baru diperlakukan sebagai berisik secara bawaan, tidak peduli seberapa logis seharusnya diam, kecuali ia memakai ulang ID lama. Konkretnya :

ID senjata Mencakup
TF_WEAPON_KNIFE Semua pisau Spy
TF_WEAPON_FISTS Pukulan spesifik Heavy (pukulannya multi-kelas sebenarnya TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Diduga tidak dipakai langsung
TF_WEAPON_PDA_ENGINEER_BUILD PDA pembangunan Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA penghancuran Engineer
TF_WEAPON_PDA_SPY Kit samaran Spy
TF_WEAPON_BUILDER Kit alat Spy/Engineer/Saboteur
TF_WEAPON_MEDIGUN Semua Medi Gun
TF_WEAPON_DISPENSER Mungkin tidak dipakai (Dispenser adalah objek, bukan senjata)
TF_WEAPON_INVIS Semua jam tak terlihat Spy
TF_WEAPON_FLAREGUN Semua pistol suar 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, tidak-diam)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Contoh klasik daftar yang membusuk : Manmelter menerima ID sendiri (TF_WEAPON_RAYGUN_REVENGE), ditambahkan setelah daftar senjata diam dibekukan, jadi diperlakukan sebagai berisik, meski pistol suar dalam semua arti praktis. Scorch Shot, keluar lebih belakangan, memakai ulang ID dasar TF_WEAPON_FLAREGUN sehingga tetap dianggap diam. Gila, tapi itulah kodenya.

Strategi : prioritas ancaman

Ketika banyak musuh terlihat bersamaan, bot membobot jarak, apakah mereka ditembaki dan, di atas Mudah, apakah ancaman utama sedang disembuhkan :

Keterampilan Membidik penyembuh sebagai gantinya?
Mudah Tidak
Normal Peluang 50%
Sulit Ya
Expert Ya

Musuh pada lebih dari 500 HU normalnya dideprioritas sebagai tidak-segera. Pengecualian : bot Sulit/Expert selalu memperlakukan Medic dan Engineer jauh sebagai ancaman segera, dan Sniper musuh mana pun yang membidik kira-kira ke arahmu selalu diperlakukan sebagai segera apa pun jarak dan keterampilannya.

Keterampilan Medic/Engineer/Sniper jauh yang membidik = ancaman segera?
Mudah/Normal Tidak
Sulit/Expert Ya

Pemeriksaan Sniper ini punya riwayat mengejutkan yang selalu saya suka ceritakan. Tulisan asli Sigsegv mengasumsikan permainan menuntut dot product antara vektor bidikan sniper dan posisi relatif bot tepat nol : perbandingan sepresisi itu hampir tidak pernah terpicu dalam komputasi float, membuat seluruh fungsionalitas efektif kode mati. Koreksi yang diterbitkan belakangan (kredit pada dekompilasi Hex-Rays yang lebih bersih) menunjukkan pemeriksaan nyatanya adalah dot product > 0 : Sniper mana pun yang menghadap dari langsung ke arahmu hingga tegak lurus denganmu dianggap ancaman segera ; apa pun dari tegak lurus hingga membelakangi tidak. Salah baca aslinya berasal dari dekompilasi buruk atas perbandingan SSE float. Melakukan rekayasa balik pada biner AAA tetap latihan perkiraan.

Gerakan : menghindar

Bot Mudah tidak pernah menghindar, titik. Bot Normal ke atas menghindar ke kiri/kanan (33% kiri, 33% kanan, 33% tidak melakukan apa-apa, dibobot melawan lubang yang terdeteksi) ketika memegang senjata tempur, telah melihat musuh dalam 3 detik terakhir dan musuh itu punya garis pandang atas mereka.

Mereka tidak akan menghindar kalau salah satu kasus ini berlaku : atribut DisableDodge disetel, perilaku saat ini bilang bergegas, sedang tak terkalahkan (uber apa pun), sedang mengejek/provokasi, memainkan Engineer, tak terlihat atau menyamar sebagai Spy, sedang membidik sebagai Sniper atau memutar sebagai Heavy, atau sedang menarik Huntsman.

Gerakan : menghindari menabrak musuh

Di atas Normal, bot secara spesifik mencoba tidak masuk ke musuh saat bergerak :

Keterampilan Menghindari menabrak musuh?
Mudah Tidak
Normal Tidak
Sulit Ya
Expert Ya

Dalam praktik, ini hanya penting bagi bot Spy : menghindari tabrakan canggung dengan pemain musuh tepat hal yang membongkar samaran.

Pyro : penguasaan airblast

Airblast berfungsi untuk dua hal : memantulkan proyektil (PvP dan MvM) dan mendorong musuh di dekat tepi (hanya PvP). Apakah bot menekan pemicu menghadapi peluang valid adalah lemparan koin berdasarkan keterampilan :

Keterampilan Peluang memicu airblast
Mudah 0%
Normal 50%
Sulit 90%
Expert 100%

Bot Pyro Mudah secara harfiah tidak bisa airblast : undiannya di hardcode untuk tidak pernah berhasil, bukan sekadar "jarang."

Spy : efektivitas samaran

Dua sumbu berbeda berkembang dengan keterampilan. Pilihan samaran :

Keterampilan Metode samaran
Mudah/Normal Kelas acak, mengabaikan apa yang benar-benar dimainkan tim musuh
Sulit/Expert Memilih pemain musuh sungguhan dan menyalin tepat kelasnya

Perilaku dalam samaran :

Keterampilan Perilaku dalam samaran/ketidaknampakan
Mudah/Normal Menatap pemain musuh ketika melihat mereka (mencurigakan)
Sulit/Expert Sengaja menghindari kontak mata (lebih meyakinkan)

Spy : agresivitas backstab

Pada jarak jauh (hingga 300 HU, tf_bot_spy_knife_range), bot Spy hanya terlibat backstab kalau ia bisa melihat korban dan punggung korban setidaknya sebagian menghadap. Keterampilan menentukan seberapa melenceng sudut punggung ini boleh :

Keterampilan Toleransi sudut
Mudah Mencoba bahkan kalau kamu menghadapnya langsung
Normal ±45° dari punggungmu
Sulit ±78° dari punggungmu
Expert ±90° dari punggungmu (busur belakang penuh 180°)

Bot Spy Mudah fungsionalnya bunuh diri : mereka akan mencoba tikaman pisau pada seseorang yang menatap mereka tepat di mata. Pengecualian : di Mann vs. Machine, setiap bot Spy dipaksa ke batasan sudut Normal apa pun tingkat keterampilan nyatanya.

Taktik : pemilihan senjata

Logika ini hanya menyangkut level di atas Mudah, dengan kepentingan berkurang di MvM karena bot di sana umumnya punya pembatasan senjata ketat :

  • Scout : beralih ke senjata sekunder ketika magazen primer kosong.
  • Soldier : beralih ke senjata sekunder ketika magazen kosong dan target kurang dari 500 HU.
  • Sniper : beralih ke senjata sekunder untuk target kurang dari 750 HU.
  • Pyro : beralih ke senjata sekunder untuk target lebih dari 750 HU, kecuali target itu Soldier atau Demoman.

Taktik : mengisi ulang di balik perlindungan

Logika absen dari MvM. Kalau perilaku bot saat ini tidak menyuruhnya mundur, magazen utamanya kosong dan ia tetap rentan tanpa uber, bot level atas mundur sementara ke perlindungan untuk mengisi ulang alih-alih mengklik senjata kosong menghadapimu :

Keterampilan Mundur untuk mengisi ulang?
Mudah Tidak
Normal Tidak
Sulit Ya
Expert Ya

Mode CP : pengembaraan pembela

Logika absen dari MvM. Saat membela point kontrol, bot level atas lebih mungkin meninggalkan point untuk memburu kill ("search and destroy"), tapi hanya dengan waktu tersisa yang layak di tf_bot_defense_must_defend_time :

Keterampilan Peluang mengembara
Mudah 10%
Normal 50%
Sulit 75%
Expert 90%

Mode CP : pemblokiran capture

Logika absen dari MvM. Bot pembela yang memperebutkan upaya capture musuh :

Keterampilan Akan mencoba memblokir capture?
Mudah Tidak
Normal Peluang 50%
Sulit Ya
Expert Ya

Tabel rekap lengkap

Aspek Mudah Normal Sulit Expert Catatan
Penglihatan : waktu pengenalan 1,00 dtk 0,50 dtk 0,30 dtk 0,20 dtk
Bidikan : laju pelacakan 1x/dtk 4x/dtk 10x/dtk 20x/dtk Spy selalu memakai Normal
Kompensasi busur granat/bom lengket 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 dan Cow Mangler dikecualikan
Titik bidik Senapan sniper Badan ~33% ke kepala Kepala Kepala
Peluang memperhatikan tembakan diam 10% 30% 60% 90% Dibagi dua kalau tertutup tembakan berisik
Membidik penyembuh Tidak 50% Ya Ya
Medic/Engineer/Sniper jauh = ancaman Tidak Tidak Ya Ya
Menghindar Tidak Ya Ya Ya Daftar pengecualian panjang
Menghindari menabrak musuh Tidak Tidak Ya Ya Terutama penting untuk Spy
Peluang memicu airblast 0% 50% 90% 100%
Pilihan kelas samaran Spy Acak Acak Cocok musuh sungguhan Cocok musuh sungguhan
Kontak mata Spy dalam samaran 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
Mengisi ulang di balik perlindungan Tidak Tidak Ya Ya Tidak di MvM
Pengembaraan pembela CP 10% 50% 75% 90% Tidak di MvM
Pemblokiran capture CP Tidak 50% Ya Ya Tidak di MvM

Kesimpulan

Bot Heavy TF2 membidik dengan minigun

Semua ini mencerminkan sistem Valve yang disengaja : skor dan probabilitas yang sepenuhnya deterministik, hanya tidak pernah didokumentasikan resmi. Berikut poin yang saya ingat setelah penyelaman ini :

  1. "Keterampilan" adalah himpunan slider independen, bukan pengali global. Waktu reaksi, irama bidikan dan setiap perilaku taktis berkembang terpisah, dan sebagian (laju pelacakan Spy, sudut backstab MvM) punya timpaan yang di hardcode apa pun levelnya.
  2. Sebagian benar-benar bug, bukan sekadar tua. Daftar senjata diam yang beku sejak 2010, Cow Mangler tanpa logika tembakan kaki tanpa alasan bagus, pemeriksaan dot product Sniper yang butuh bertahun-tahun untuk didekompilasi benar : kode AI Valve punya bekas luka seperti basis kode 17 tahun mana pun.
  3. Kamu bisa memakai semua ini. Ketahuilah bahwa bot Sniper tidak akan meng headshotmu di Normal, bahwa Pyro Mudah secara harfiah tidak bisa memantulkan roketmu, bahwa Spy Mudah akan mencoba menikammu tatap muka. Ini bukan keberuntungan. Ini lembar teknis.

Terima kasih besar untuk sigsegv atas penyelaman kode asli yang membuat sebagian besar ini mungkin, untuk wiki TF2 atas dokumentasi dasar perintah bot dan dukungan peta, dan untuk semua orang di komunitas yang terus mengutak-atik AI bot berusia 17 tahun untuk memahami tepat kenapa ia melakukan apa yang dilakukannya.

TF2 बॉट बेतरतीब नहीं हैं : मैंने कठिनाई का हर पैरामीटर फिर से खोजा

दृष्टि, निशाना, backstab कोण, headshot तर्क, हर ज्ञात bug, Valve ने कभी कुछ प्रलेखित नहीं किया। इसलिए हमने कोड खँगाला और सब कुछ पूर्ण तकनीकी शीट में बदला।

परिचय

रॉकेट launcher से निशाना लगाता TF2 बॉट Soldier

हर TF2 खिलाड़ी ने कम से कम एक बार कहा है : "यह बॉट धोखा देता है।" या उल्टा : "यह आसान बॉट रॉकेट खाते क्यों खड़ा है।" कोई नहीं जानता कि हुड के नीचे "आसान", "सामान्य", "कठिन" और "विशेषज्ञ" का क्या मतलब है : Valve ने कठिनाई के चार लेबल भेजे और बिल्कुल शून्य दस्तावेज।

तो हम में से एक समूह (मैं, awimii, Mush The Possum, बुनियादी काम का बड़ा हिस्सा sigsegv ने किया, जिसने सच में खेल के डीकंपाइल कोड को खँगाला) ने TFBot व्यवहार पर पूर्ण शोध दस्तावेज एकत्र किया। हर तंत्र, हर ज्ञात bug, हर hardcoded संभावना। यह लेख पूर्ण विवरण है, संक्षिप्त संस्करण नहीं। Bonk लो, लंबा होगा।


अध्याय I : आधार

बॉट बनाम कठपुतली बॉट

TF2 में दो पूरी तरह अलग चीजें हैं जिन्हें लोग "बॉट" कहते हैं :

  • AI बॉट (TFBot) : असली AI, उसी PlayerBot/Infected framework पर बना जिसे Valve ने Left 4 Dead शृंखला के लिए इस्तेमाल किया। वे बेतरतीब वर्ग चुनते हैं, उद्देश्य खेलते हैं, sv_cheats के बिना काम करते हैं और असली खिलाड़ी की तरह उपलब्धियाँ trigger करते हैं।
  • कठपुतली बॉट : शून्य AI, खुद हिलने या काम करने में असमर्थ। वे सिर्फ मैन्युअल नियंत्रित होने के लिए मौजूद हैं, कोई खिलाड़ी उन्हें अनुसरण, निशाना, गोली चलाने को मजबूर कर सकता है। मुख्यतः परीक्षण या सिनेमाई screenshot और वीडियो बनाने के लिए इस्तेमाल। उन्हें प्रकट करने के लिए sv_cheats 1 चाहिए, जो सत्र के लिए उपलब्धियाँ भी निष्क्रिय करता है।

यह लेख पूरी तरह पहले प्रकार पर है।

AI बॉट को हम (कमोबेश) क्या करने को कह सकते हैं

TFBot सीधे नियंत्रण योग्य नहीं हैं, लेकिन उन्हें कुछ चीजें करने के लिए उकसाया जा सकता है :

  • किसी भी बॉट (मित्र या शत्रु) पर अपने crosshair से निशाना लगाओ और वह तुम्हें चिढ़ाएगा अगर तुम सही ध्वनि कमांड इस्तेमाल करते हो।
  • मित्र Medic बॉट तुम्हें ठीक करेगा अगर तुम "Medic!" ध्वनि कमांड इस्तेमाल करते हो
  • अगर Medic बॉट तुम्हें ठीक करता है और तैयार UberCharge रखता है, तो "Go go go!" या "चार्ज सक्रिय करो!" कहना उसे तुरंत चार्ज trigger कराता है।
  • तैयार चार्ज वाला Medic बॉट उसे अपने आप सक्रिय करता है जैसे ही वह खुद या उसका उपचार लक्ष्य गंभीर नुकसान लेता है, बिना ध्वनि कमांड जरूरत।
  • बॉट करीबी साथियों के साथ स्वतः जोड़ी चिढ़ (High Five) या समूह चिढ़ (Conga) करते हैं।

असमर्थित नक्शों पर बॉट चलाना

बॉट यह जानने के लिए navigation जाल पर निर्भर हैं कि उन्हें कहाँ चलने का अधिकार है, और ज्यादातर सामुदायिक नक्शे इसे नहीं देते। बाध्य करने के लिए :

  1. sv_cheats 1
  2. nav_generate , प्रारंभिक navmesh बनाता है, प्रगति console में दिखती है
  3. खेल के रास्ते बनाना खत्म करने की प्रतीक्षा करो
  4. वैकल्पिक, nav_edit 1 से खराब navigation डेटा मैन्युअल सुधारो
  5. serveur फिर से लोड या पुनरारंभ करो (यह चरण छोड़ना उपलब्धियाँ निष्क्रिय करता है)
  6. बॉट प्रकट करने के लिए tf_bot_add <संख्या>

चेतावनी : serveur पर बॉट सक्रिय रहते navmesh बदलना खेल crash करा सकता है। एक बार जाल मौजूद होने पर, भविष्य सत्रों के लिए उसे फिर से बनाना जरूरी नहीं : बस tf_bot_add से बॉट जोड़ो।

स्वतः उत्पन्न जाल Control Point, King of the Hill, Payload और CTF नक्शों पर सबसे अच्छे काम करते हैं। Mannpower नक्शों पर, बॉट डिफ़ॉल्ट CTF तरह का व्यवहार अपनाते हैं लेकिन grapplin या powerup मुश्किल से इस्तेमाल करते हैं। अगर नक्शे में बॉट AI पहचानने वाला उद्देश्य नहीं है लेकिन spawn कक्ष इकाई है, तो tf_bot_offense_must_push_time 0 सेट करना बॉट को फिर भी लड़ने देता है।

(इस खंड का स्रोत : आधिकारिक TF2 wiki का Bots पेज।)

नक्शा दर नक्शा वर्तमान स्थिति

Hatless अद्यतन से, हर वर्ग अब सही काम करता है, ऐतिहासिक buggy Spy सहित। बॉट ज्यादातर आधिकारिक KOTH नक्शों, कुछ Payload नक्शों, Dustbowl/Gorge Attack-Defense और CTF/Mann Manor नक्शों पर सही व्यवहार करते हैं। इन आखिरी दो पर, तुम उन्हें tf_bot_add से सीधे प्रकट नहीं कर सकते। असमर्थित नक्शों पर (ऊपर nav_generate प्रक्रिया से), वे काम करते हैं, लेकिन असली खिलाड़ी नकल करने में स्पष्ट कम अच्छे हैं।

PLR नक्शे खोया कारण हैं : बॉट Hightower पर बाधाएँ पार नहीं कर सकते और कोनों में फँसते हैं, और अन्य सभी PLR नक्शों पर वे बस खेलने के बजाय... dance party करते हैं। शायद यह एक दिन ठीक होगा, शायद यथास्थिति रहेगा।

बॉटों का सामान्य व्यवहार

चीजों का मिश्रण जो हर बॉट स्तर स्वतंत्र करता है :

  • बॉट सिर्फ बुनियादी loadout इस्तेमाल करते हैं (plugin उन्हें गैर मानक हथियार बाध्य कर सकता है, लेकिन vanilla बॉट कभी अपने नहीं चुनते)।
  • आसान बॉट अपना द्वितीयक हथियार मुश्किल से इस्तेमाल करते हैं। उच्च कठिनाइयाँ द्वितीयक पर जाती हैं जैसे ही मुख्य loader खाली होता है, या दूरी भरपाई के लिए।
  • बॉट उन्नत गति तकनीकें नजरअंदाज करते हैं : कोई rocket jump नहीं, कोई भवन स्थानांतरण नहीं।
  • kill बाद, बॉट चिढ़ा सकता है, आग के नीचे भी, सिवाय अगर वह शत्रु खुफिया ले जाता है, और यह नियम MvM में भी लागू होता है।
  • छिपे Spy बॉट (खिलाड़ी या AI) अन्य बॉट सही नजरअंदाज करते हैं : जब तक वे शत्रु को छूते हैं, कुछ तोड़ते हैं, गोली चलाते हैं या किसी के पास अदृश्य होते हैं। एक बार "खोजे" जाने पर, यह विशिष्ट बॉट/खिलाड़ी Spy के रूप में याद रखा जाता है जब तक वह अदृश्य रहते छिपाव बदलता है, मरता है या Dead Ringer से मौत दिखाता है।
  • Pyro बॉट सामान्य स्तर से Compression Blast उदार इस्तेमाल करते हैं।
  • Medic बॉट Snipers (और, कम हद तक, Engineers) सिवाय सब पर उपचार प्राथमिकता देते हैं, भले ही तुम ऐसे होकर "Medic!" spam करो।
  • Medic बॉट Heavy, Soldier, Demomen और Pyro की ओर झुकते हैं : विशेष रूप से जब मानव इन वर्गों को खेलता है। यह ध्यान इन भूमिकाओं में मानव उपस्थिति का अनुसरण करता है।
  • बॉट Attack/Defense और Payload नक्शों पर तैयारी समय के दौरान स्थिति में रहते हैं, Engineers, Snipers और Spies सिवाय, जो स्वतंत्र घूमते हैं (Demoman बॉट को sticky bomb पूर्व रखने की भी अनुमति है)।
  • Engineer बॉट कभी मित्र Engineer की रचनाओं को उन्नत या निष्क्रिय नहीं करते, जब तक वह रचना उनके लक्ष्य रास्ते पर न हो। वे कभी कभी अपनी turret ठीक नहीं करते, भले ही यह स्पष्ट लगे।
  • खोजे Spy बॉट चाकू बाध्य करने के बजाय अपनी revolver पर जाते हैं और पीछे हटते हैं।
  • Demoman बॉट जिन्होंने संतरी खोजी है (आमतौर पर उस पर एक बार मरकर) geometry अनुमति देने पर दीवारों और छतों से चाप में उसकी पहुँच से बाहर से उस पर sticky bomb सही फेंक सकते हैं।
  • Sniper बॉट जिन्हें निशाना लगाने बाद लक्ष्य नहीं मिलता "Negatives." ध्वनि पंक्तियों में से एक इस्तेमाल करते हैं।
  • मित्र Medic छिपे Spy को बिना हिचक ठीक करते हैं।

ज्ञात समस्याएँ / bug

दस्तावेज लंबे समय की विचित्रताओं की अच्छी संख्या सूचीबद्ध करता है :

  • बॉट कुछ स्थिर prop से चलने या गोली चलाने की कोशिश कर सकते हैं।
  • हर बार जब कोई खिलाड़ी/बॉट छिपाव हटाता है, छिपता है या प्रकट होता है, तो करीबी बॉट उसे "देखते" हैं और प्रतिक्रिया घूमते हैं : भले ही घटना उनके असली दृष्टि क्षेत्र से बाहर हुई हो। यह ध्वनि आधारित नहीं है ; यह दृष्टि परीक्षण का वैकल्पिक रास्ता है।
  • शायद ही, बॉट Engineer teleporter इस्तेमाल करते शारीरिक फँस सकते हैं।
  • बॉट ध्वनि कमांड (जैसे "Spy!", "आगे!") खिलाड़ियों की तरह चैट में पाठ में नहीं दिखतीं।
  • सक्रिय किसी को ठीक करता Medic बॉट आने वाली गोलियों से नहीं बचेगा और उपचार kit नहीं लेगा, महत्वपूर्ण HP पर भी नहीं।
  • बॉट जोड़ी चिढ़ के दौरान हिलना जारी रख सकते हैं, जो Festive Critical Strike के नियत प्रभाव तोड़ता है।
  • हाल घायल Medic बॉट अक्सर दूरी पर Syringe Gun इस्तेमाल करने से मना करते हैं, हाथापाई पसंद करते हैं (या, बहुत दुर्लभ मामलों में, Medi Gun किरण से तुम्हें छूने की कोशिश करते हैं)।
  • Medic बॉट Syringe Gun गोलियों के लिए गुरुत्व भरपाई नहीं करते : शायद क्योंकि हथियार AI कोड में गैर hitscan के रूप में सही चिह्नित नहीं है।
  • Spy बॉट अदृश्य Spy (खिलाड़ी या AI) देख और अनुसरण कर सकते हैं अगर यह Spy एक बार खोजा जा चुका है, उसका अनुसरण करने वाले बॉट के कौशल स्तर स्वतंत्र।
  • भले ही खिलाड़ी Spy अपनी टीम के वर्ग में छिपता है, शत्रु को छूना उसे फिर भी खोलता है (बॉट कभी खुद ऐसा नहीं करते, चूँकि बॉट कभी अपनी टीम में नहीं छिपते)।
  • बॉट टीम स्वतः संतुलन सम्मान करते हैं : अगर तुम एक तरफ बॉट ठूँसने की कोशिश करते हो, तो पहले mp_teams_unbalance_limit 0 इस्तेमाल करना होगा।
  • Engineer बॉट अपनी रचनाओं को पूरी तरह नजरअंदाज कर सकते हैं जब तक वे नष्ट न हों।
  • Heavy बॉट कभी कभी Minigun चलाने की कोशिश करते हैं जबकि गोला बारूद खत्म है, खासकर कठिन स्तर नीचे।
  • हारती टीम के Medic बॉट Humiliation चरण के दौरान कभी कभी आत्महत्या करते हैं जब कोई शत्रु पास नहीं है, कुछ ऐसा जिसे मानव खिलाड़ी कोशिश करके भी दोहरा नहीं सकता।
  • लोड स्क्रीन में अपनी टीम पूर्वावलोकन BLU पर सेट करना RED बॉट को तुम्हें दृष्टिगत BLU रेंडर कराता है।
  • हाथापाई हथियार निकाले बॉट कभी कभी गोला बारूद उठाने बाद भी हथियार बदलने से मना करते हैं।
  • Jungle Inferno बाद, स्पष्ट पैरामीटर से प्रकट बॉट (जैसे tf_bot_add 5 pyro bleu normal) अपने spawn कक्ष में तुरंत मर सकते हैं। सुधार : tf_bot_reevaluate_class_in_spawnroom 0 (sv_cheats 1 चाहिए)।

AI नाम

बॉट नाम TF2, अन्य Valve खेलों और प्रोग्रामिंग संस्कृति संदर्भों के बड़े भंडार से लिए गए हैं, काफी हद तक क्योंकि समुदाय Steam forum पर विशिष्ट माँगता रहता था। सूची का नमूना : AimBot, Aperture Science Prototype XR7, Black Mesa, Companion Cube, C++, Divide by Zero, GLaDOS, H@XX0RZ, Saxton Hale, The G-Man, trigger_hurt, 0xDEADBEEF, और उसी तरह के दसियों अन्य।

लीक स्रोत build में मिले नामों का lot भी है जो production में कभी नहीं भेजा गया, अस्पष्ट कारणों से : मुख्यतः 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 : मूल बॉट / TFBot , कौशल स्तरों में गोता

Sigsegv का मूल ढाँचा अभी भी टिका है : स्पष्ट है कि विशेषज्ञ बॉट आसान बॉट से बेहतर होते हैं, लेकिन Valve ने कभी समझाया नहीं कितना न क्यों। इसलिए जानने का एकमात्र तरीका कोड पढ़ना है। यहाँ हर यांत्रिकी है जो कौशल से विकसित होती है।

कठिनाई सेट करना

MvM के बाहर, कठिनाई cvar से नियंत्रित होती है :

tf_bot_difficulty कठिनाई स्तर
0 आसान
1 सामान्य (डिफ़ॉल्ट)
2 कठिन
3 विशेषज्ञ

tf_bot_add सीधे कठिनाई तर्क भी स्वीकार करता है (easy/normal/hard/expert)।

MvM Popfile

Mann vs. Machine में, popfile में हर TFBot spawn ब्लॉक में वैकल्पिक Skill कुंजी होती है। कुंजी अनुपस्थिति आसान स्तर से मेल खाती है। Valve मिशनों में : दिग्गज लगभग हमेशा विशेषज्ञ हैं, Engineer और Spy लगभग हमेशा विशेषज्ञ हैं, और Sniper आमतौर पर कठिन हैं (कभी कभी विशेषज्ञ)। अगर तुम नक्शा घटनाओं अनुसार लहर के दौरान बॉट गतिशील बदलने के लिए EventChangeAttributes (Two Cities अद्यतन में जोड़ा गया) इस्तेमाल करते हो, तो बॉट कौशल उन गुणों में से एक है जिन्हें तुम तुरंत बदल सकते हो।

अंतहीन MvM मोड

अंतहीन मोड कभी आधिकारिक नहीं भेजा गया, लेकिन इसमें, बॉट खिलाड़ियों की तरह उन्नयन पर पैसा खर्च करते हैं, जिसमें बॉट अनन्य उन्नयन शामिल जो खेल के दौरान उनका AI कौशल स्तर बढ़ाता है।

bot_generator इकाई

अस्पष्ट, काफी अप्रलेखित इकाई, प्रशिक्षण मोड और शायद शुरुआती MvM विकास में इस्तेमाल मानी जाती है। वह कौशल स्तर नियंत्रित करने के लिए SetDifficulty input उजागर करती है। उसके परे, निशान ठंडा होता है : Valve ने कभी प्रलेखित नहीं किया और किसी ने उसका व्यवहार पूरी तरह map नहीं किया।

आँख चमक रंग

MvM robot में आँख चमक कण होता है जो कौशल स्तर से रंग बदलता है, दृश्य सूचक जिसे समुदाय के बाहर किसी ने कभी समझाया नहीं :

कौशल आँख रंग RVB
आसान/सामान्य नीला #24b4ff
कठिन/विशेषज्ञ पीला #fff000

प्रतीक्षा स्थिति में TF2 Heavy बॉट

दृष्टि : पहचान समय

बॉट तुरंत प्रतिक्रिया नहीं करता जब कुछ उसके दृष्टि क्षेत्र में प्रवेश करता है : कठोर कोड विलंब है इससे पहले कि बाकी AI को खतरा पहचानने की अनुमति भी मिले :

कौशल न्यूनतम पहचान समय
आसान 1,00 s
सामान्य 0,50 s
कठिन 0,30 s
विशेषज्ञ 0,20 s

"आसान बॉट मूर्ख लगते हैं" प्रभाव का सार एक ही अंक में है : आसान बॉट तुम्हें देखने के बाद कम अच्छा निशाना नहीं लगाता, वह बस तुम्हारे अस्तित्व देखने में पाँच गुना ज्यादा समय लेता है।

निशाना : tracking दर

बॉट तुम्हें लगातार track नहीं करते। वे निश्चित अंतराल पर तुम्हारी स्थिति और गति नमूना करते हैं और वहाँ से सीधी रेखा पूर्वानुमान करते हैं :

कौशल पुनर्गणना अंतराल समतुल्य दर
आसान 1,00 s 1x/s
सामान्य 0,25 s 4x/s
कठिन 0,10 s 10x/s
विशेषज्ञ 0,05 s 20x/s

अपवाद : Spy बॉट अपने असली कौशल स्तर स्वतंत्र Normal tracking दर से hardcoded हैं : विशेषज्ञ Spy हमेशा Normal बॉट की तरह निशाना लगाता है। अगर तुम गति में 1x बनाम 20x अंतर देखना चाहते हो तो साथ साथ tracking दर तुलना करने वाला सार्वजनिक प्रदर्शन वीडियो भी है।

निशाना : हथियार विशिष्ट कौशल

बॉट सिर्फ तुम्हारे द्रव्यमान केंद्र पर निशाना नहीं लगाते : उनके पास प्रति हथियार तर्क है, कभी सच में buggy :

ग्रेनेड launcher और sticky bomb launcher। सभी कौशल स्तर ऊर्ध्वाधर चाप भरपाई करते हैं, cvar tf_bot_ballistic_elevation_rate के स्थिर मान इस्तेमाल करके। क्योंकि यह भरपाई सिर्फ आधार हथियार ID के लिए सक्रिय होती है, तेज projectile रूप (Loch-n-Load, projectile गति modifier वाला कुछ भी) का चाप सही समायोजित नहीं होता। और चूँकि यह विशेष रूप से हथियार ID से बँधा है, Loose Cannon (अलग ID) को कोई चाप भरपाई नहीं मिलती।

Huntsman। आसान बॉट तीर गिरावट भरपाई नहीं करते और कभी headshot नहीं खोजते। सामान्य स्तर बॉट चाप भरपाई करते हैं, लेकिन सिर्फ 150 HU के नीचे सिर निशाना लगाते हैं। कठिन/विशेषज्ञ बॉट हमेशा सिर निशाना लगाते हैं।

रॉकेट launcher। 150 HU से परे, गैर आसान बॉट द्रव्यमान केंद्र के बजाय तुम्हारे पैर निशाना लगाते हैं, क्षेत्र नुकसान और धक्का संभावना अधिकतम करते हुए। 150 HU के नीचे, वे headshot पर जाते हैं। आसान बॉट दूरी स्वतंत्र हमेशा द्रव्यमान केंद्र निशाना लगाते हैं। यह भी हथियार ID से locked है : Direct Hit और Cow Mangler इस व्यवहार को नहीं पाते। Direct Hit के लिए तार्किक (शोषण करने को प्रभाव क्षेत्र नहीं) ; Cow Mangler के लिए शून्य अर्थ : AI का यह हिस्सा हथियार अस्तित्व से पहले है और बस कभी दोबारा नहीं देखा गया।

Sniper राइफलें। आसान शरीर निशाना लगाता है। सामान्य शरीर से सिर की ओर लगभग 33% निशाना लगाता है। कठिन/विशेषज्ञ सीधे सिर निशाना लगाते हैं। MvM में कम महत्वपूर्ण, जहाँ बॉट headshot को वैसे भी नुकसान बोनस नहीं मिलता।

सुनना : विवेकपूर्ण गोलियों के प्रति संवेदनशीलता

हर गोली निशानेबाज स्थिति के बारे में करीबी बॉट को सतर्क करती है, दीवारों से भी, 100% देखे जाने संभावना के साथ 3000 HU तक (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 Spy के सभी चाकू
TF_WEAPON_FISTS Heavy विशिष्ट घूँसे (उसका बहु वर्ग घूँसा असल में TF_WEAPON_FIREAXE है)
TF_WEAPON_PDA सीधे अप्रयुक्त माना जाता है
TF_WEAPON_PDA_ENGINEER_BUILD Engineer निर्माण PDA
TF_WEAPON_PDA_ENGINEER_DESTROY Engineer विनाश PDA
TF_WEAPON_PDA_SPY Spy छिपाव kit
TF_WEAPON_BUILDER Spy/Engineer/Saboteur उपकरण kit
TF_WEAPON_MEDIGUN सभी Medi Gun
TF_WEAPON_DISPENSER शायद अप्रयुक्त (Dispenser वस्तुएँ हैं, हथियार नहीं)
TF_WEAPON_INVIS Spy की सभी अदृश्यता घड़ियाँ
TF_WEAPON_FLAREGUN Manmelter सिवाय सभी Pyro flare gun
TF_WEAPON_LUNCHBOX Sandwich, 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 Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

सड़ती सूची का क्लासिक उदाहरण : Manmelter को अपना ID मिला (TF_WEAPON_RAYGUN_REVENGE), विवेकपूर्ण हथियार सूची जमने बाद जोड़ा गया, इसलिए वह शोर माना जाता है, बावजूद सभी व्यावहारिक अर्थों में flare gun होने के। Scorch Shot, और बाद निकला, आधार ID TF_WEAPON_FLAREGUN फिर से इस्तेमाल करता है और इसलिए अभी भी विवेकपूर्ण माना जाता है। पागलपन, लेकिन यह कोड है।

रणनीति : खतरा प्राथमिकता

जब एक साथ कई शत्रु दिखते हैं, तो बॉट दूरी भारित करते हैं, क्या उन पर गोली चल रही है और, आसान से ऊपर, क्या मुख्य खतरा ठीक किया जा रहा है :

कौशल उपचार करने वाले पर निशाना लगाता है ?
आसान नहीं
सामान्य 50% संभावना
कठिन हाँ
विशेषज्ञ हाँ

500 HU से ज्यादा शत्रु सामान्यतः गैर तात्कालिक प्राथमिकता हटाए जाते हैं। अपवाद : कठिन/विशेषज्ञ बॉट हमेशा दूरस्थ Medic और Engineer को तात्कालिक खतरा मानते हैं, और तुम्हारी दिशा में लगभग निशाना लगाता कोई भी शत्रु Sniper दूरी और कौशल स्वतंत्र हमेशा तात्कालिक माना जाता है।

कौशल दूरस्थ Medic/Engineer/निशाना लगाता Sniper = तात्कालिक खतरा ?
आसान/सामान्य नहीं
कठिन/विशेषज्ञ हाँ

इस Sniper जाँच की आश्चर्यजनक कहानी है जिसे मैं हमेशा सुनाना पसंद करता हूँ। Sigsegv का मूल लेखन मानता था कि खेल sniper निशाना सदिश और बॉट सापेक्ष स्थिति के बीच बिंदु गुणनफल बिल्कुल शून्य माँगता है : इतनी सटीक तुलना कि वह चल float गणना में लगभग कभी trigger नहीं होती, पूरी सुविधा को प्रभावी मृत कोड बनाती। बाद प्रकाशित सुधार (साफ Hex-Rays डीकंपाइल श्रेय) ने दिखाया कि असली जाँच बिंदु गुणनफल > 0 है : सीधे तुम्हारी ओर से लंबवत तक सामना करता कोई भी Sniper तात्कालिक खतरा माना जाता है ; लंबवत से पीठ मोड़ने तक कुछ भी नहीं है। मूल गलत पढ़ना float SSE तुलना के गलत डीकंपाइल से आया था। AAA binary पर reverse-engineering करना अनुमानित अभ्यास रहता है।

गति : चकमा

आसान बॉट कभी चकमा नहीं देते, बस। सामान्य और ऊपर के बॉट बाएँ/दाएँ चकमा देते हैं (33% बाएँ, 33% दाएँ, 33% कुछ नहीं, पहचाने छेदों के खिलाफ भारित) जब वे युद्ध हथियार रखते हैं, पिछले 3 सेकंड में शत्रु देखा है और यह शत्रु उन पर दृष्टि रेखा रखता है।

वे चकमा नहीं देंगे अगर इनमें से एक मामला लागू होता है : DisableDodge विशेषता सेट, वर्तमान व्यवहार जल्दी करने को कहता है, वर्तमान में अजेय (कोई भी uber), पूरी चिढ़/उकसावा में, Engineer खेलता है, Spy के रूप में अदृश्य या छिपा, Sniper के रूप में निशाना लगाता या Heavy के रूप में घुमाता, या Huntsman खींचता है।

गति : शत्रुओं से टकराने से बचना

सामान्य से ऊपर, बॉट विशेष रूप से हिलते हुए शत्रुओं में घुसने से बचने की कोशिश करते हैं :

कौशल शत्रुओं से टकराने से बचता है ?
आसान नहीं
सामान्य नहीं
कठिन हाँ
विशेषज्ञ हाँ

व्यवहार में, यह सिर्फ Spy बॉट के लिए मायने रखता है : शत्रु खिलाड़ी से अटपटी टक्कर से बचना ठीक वह है जो छिपाव उजागर करता है।

Pyro : airblast महारत

airblast दो चीजों की सेवा करता है : projectile परावर्तित करना (PvP और MvM) और किनारों के पास शत्रुओं को धकेलना (सिर्फ PvP)। वैध अवसर सामने बॉट trigger दबाता है या नहीं, कौशल आधारित सिक्का उछाल है :

कौशल airblast trigger संभावना
आसान 0%
सामान्य 50%
कठिन 90%
विशेषज्ञ 100%

आसान Pyro बॉट सचमुच airblast नहीं कर सकते : draw hardcoded है कि कभी सफल न हो, सिर्फ "शायद ही" नहीं।

Spy : छिपाव प्रभावशीलता

दो अलग अक्ष कौशल से विकसित होते हैं। छिपाव चुनाव :

कौशल छिपाव विधि
आसान/सामान्य बेतरतीब वर्ग, शत्रु टीम असल क्या खेलती है नजरअंदाज
कठिन/विशेषज्ञ असली शत्रु खिलाड़ी चुनता है और उसकी सटीक वर्ग कॉपी करता है

छिपाव/अदृश्यता में व्यवहार :

कौशल छिपाव/अदृश्यता में व्यवहार
आसान/सामान्य शत्रु खिलाड़ियों को देखने पर घूरता है (संदिग्ध)
कठिन/विशेषज्ञ जानबूझकर आँख संपर्क से बचता है (ज्यादा विश्वसनीय)

Spy : backstab आक्रामकता

लंबी दूरी (300 HU तक, tf_bot_spy_knife_range), Spy बॉट backstab में तभी लगता है अगर वह पीड़ित देख सकता है और पीड़ित की पीठ कम से कम आंशिक मुड़ी है। कौशल तय करता है कि यह पीठ कोण कितना केंद्र से हट सकता है :

कौशल कोण सहनशीलता
आसान कोशिश करता है भले ही तुम सीधे उसका सामना करते हो
सामान्य तुम्हारी पीठ से ±45°
कठिन तुम्हारी पीठ से ±78°
विशेषज्ञ तुम्हारी पीठ से ±90° (पूरा 180° पिछला चाप)

आसान Spy बॉट कार्यात्मक आत्मघाती हैं : वे किसी पर चाकू कोशिश करेंगे जो उन्हें आँखों में देख रहा है। अपवाद : Mann vs. Machine में, हर Spy बॉट अपने असली कौशल स्तर स्वतंत्र Normal कोण बाधा पर बाध्य है।

रणनीति : हथियार चुनाव

यह तर्क सिर्फ आसान से ऊपर स्तरों से जुड़ा है, MvM में घटे रुचि के साथ चूँकि वहाँ बॉटों के आमतौर पर कड़े हथियार प्रतिबंध हैं :

  • Scout : मुख्य loader खाली होने पर द्वितीयक हथियार पर जाता है।
  • Soldier : loader खाली और लक्ष्य 500 HU से कम होने पर द्वितीयक हथियार पर जाता है।
  • Sniper : 750 HU से कम लक्ष्यों के लिए द्वितीयक हथियार पर जाता है।
  • Pyro : 750 HU से ज्यादा लक्ष्यों के लिए द्वितीयक हथियार पर जाता है, सिवाय अगर यह लक्ष्य Soldier या Demoman है।

रणनीति : cover में reload

MvM से अनुपस्थित तर्क। अगर बॉट का वर्तमान व्यवहार उसे पीछे हटने को नहीं कहता, उसका मुख्य loader खाली है और वह बिना uber असुरक्षित रहता है, तो उच्च स्तर बॉट तुम्हारे सामने खाली हथियार क्लिक करने के बजाय reload के लिए अस्थायी cover पीछे हटते हैं :

कौशल reload के लिए पीछे हटता है ?
आसान नहीं
सामान्य नहीं
कठिन हाँ
विशेषज्ञ हाँ

CP मोड : रक्षक भटकना

MvM से अनुपस्थित तर्क। control point बचाव में, उच्च स्तर बॉट kill शिकार के लिए point छोड़ने की ज्यादा संभावना रखते हैं ("खोज और नष्ट"), लेकिन सिर्फ tf_bot_defense_must_defend_time पर decent समय बचे साथ :

कौशल भटकने की संभावना
आसान 10%
सामान्य 50%
कठिन 75%
विशेषज्ञ 90%

CP मोड : capture अवरुद्ध

MvM से अनुपस्थित तर्क। शत्रु capture प्रयास का विरोध करते रक्षक बॉट :

कौशल capture अवरुद्ध करने की कोशिश करेगा ?
आसान नहीं
सामान्य 50% संभावना
कठिन हाँ
विशेषज्ञ हाँ

पूर्ण सारांश तालिका

पहलू आसान सामान्य कठिन विशेषज्ञ नोट
दृष्टि : पहचान समय 1,00s 0,50s 0,30s 0,20s
निशाना : tracking दर 1x/s 4x/s 10x/s 20x/s Spy हमेशा Normal इस्तेमाल करते हैं
ग्रेनेड/sticky चाप भरपाई हाँ हाँ हाँ हाँ Loose Cannon छूट
Huntsman ऊर्ध्वाधर भरपाई नहीं हाँ हाँ हाँ
Huntsman Headshot नहीं <150 HU हाँ हाँ
रॉकेट launcher पैर गोली नहीं हाँ हाँ हाँ Direct Hit और Cow Mangler छूट
Sniper राइफल निशाना बिंदु शरीर सिर की ओर ~33% सिर सिर
विवेकपूर्ण गोली देखने की संभावना 10% 30% 60% 90% शोर गोलियों से छिपने पर आधी
उपचार करने वाले पर निशाना नहीं 50% हाँ हाँ
दूरस्थ Medic/Engineer/निशाना लगाता Sniper = खतरा नहीं नहीं हाँ हाँ
चकमा नहीं हाँ हाँ हाँ लंबी अपवाद सूची
शत्रुओं से टकराने से बचना नहीं नहीं हाँ हाँ Spy के लिए खास महत्वपूर्ण
airblast trigger संभावना 0% 50% 90% 100%
Spy छिपाव वर्ग चुनाव बेतरतीब बेतरतीब असली शत्रु से मेल असली शत्रु से मेल
छिपाव में Spy आँख संपर्क घूरता (स्पष्ट) घूरता बचता (विश्वसनीय) बचता
Spy backstab कोण ~0° ±45° ±78° ±90° MvM Normal बाध्य करता है
हथियार चुनाव तर्क नहीं हाँ हाँ हाँ MvM में कम प्रासंगिक
cover में reload नहीं नहीं हाँ हाँ MvM में नहीं
CP रक्षक भटकना 10% 50% 75% 90% MvM में नहीं
CP capture अवरुद्ध नहीं 50% हाँ हाँ MvM में नहीं

निष्कर्ष

minigun से निशाना लगाता TF2 Heavy बॉट

यह सब Valve की जानबूझकर तंत्र दर्शाता है : पूरी तरह नियतात्मक स्कोर और संभावनाएँ, बस कभी आधिकारिक प्रलेखित नहीं। इस गोते बाद मैं ये बिंदु रखता हूँ :

  1. "कौशल" स्वतंत्र cursor का समुच्चय है, वैश्विक गुणक नहीं। प्रतिक्रिया समय, निशाना ताल और हर रणनीतिक व्यवहार अलग विकसित होते हैं, और कुछ (Spy tracking दर, MvM backstab कोण) अपने स्तर स्वतंत्र hardcoded कुचल रखते हैं।
  2. एक हिस्सा सच में buggy है, सिर्फ पुराना नहीं। 2010 से जमी विवेकपूर्ण हथियार सूची, बिना अच्छे कारण पैर गोली तर्क रहित Cow Mangler, Sniper बिंदु गुणनफल जाँच जिसे सही डीकंपाइल होने में साल लगे : Valve AI कोड के 17 साल के codebase जैसे निशान हैं।
  3. तुम यह सब इस्तेमाल कर सकते हो। जानो कि Sniper बॉट Normal में तुम्हें headshot नहीं करेगा, आसान Pyro सचमुच तुम्हारा रॉकेट परावर्तित नहीं कर सकता, आसान Spy आमने सामने तुम्हें चाकू मारने की कोशिश करेगा। यह किस्मत नहीं है। यह तकनीकी शीट है।

मूल कोड गोते के लिए sigsegv को बहुत धन्यवाद जिसने इसका ज्यादातर संभव बनाया, बॉट कमांड और नक्शा समर्थन पर बुनियादी दस्तावेज के लिए TF2 wiki, और समुदाय में सभी को जो 17 साल पुरानी बॉट AI को छेड़ना जारी रखते हैं यह समझने के लिए कि वह ठीक वह क्यों करती है जो वह करती है।

بوتات TF2 ليست عشوائية : أعدت اكتشاف كل معامل صعوبة

الرؤية والتصويب وزوايا الطعن الخلفي ومنطق headshot وكل bug معروف، لم توثق Valve شيئا أبدا. فنبشنا الكود وحوّلنا الكل إلى بطاقة تقنية كاملة.

مقدمة

Soldat bot TF2 visant avec un lance-roquettes

قال كل لاعب TF2 مرة واحدة على الأقل : «هذا البوت يغش.» أو العكس : «لماذا يبقى هذا البوت السهل مزروعا يأكل صواريخ.» لا يعرف أحد فعلا ماذا تعني "سهل" و"عادي" و"صعب" و"خبير" تحت الغطاء : شحنت Valve أربعة ملصقات صعوبة وصفر توثيق بالضبط.

فجمعت مجموعة منا (أنا وawimii وMush The Possum، مع جزء ضخم من العمل الأساسي من sigsegv، الذي نبش فعلا الكود المفكك للعبة) وثيقة بحث كاملة عن سلوك TFBot. كل آلية وكل bug معروف وكل احتمال مُرمَّز صلبا. هذا المقال هو التقرير الكامل، لا النسخة المختصرة. خذوا Bonk، سيطول الأمر.


الفصل الأول : الأساسيات

Bot ضد Bot دمية

لدى TF2 شيئان مختلفان تماما يسميهما الناس "بوتات" :

  • بوتات ذكاء اصطناعي (TFBots) : ذكاء حقيقي، مبني على نفس إطار PlayerBot/Infected الذي استخدمته Valve لسلسلة Left 4 Dead. تختار فئة عشوائية، وتلعب الهدف، وتعمل دون sv_cheats وتحفّز الإنجازات كلاعب حقيقي.
  • بوتات دمى : صفر ذكاء، عاجزة عن الحركة أو الفعل وحدها. توجد فقط لتُتحكَّم يدويا، فيستطيع لاعب إجبارها على التتبع والتصويب والإطلاق. تُستخدَم أساسا للاختبارات أو لصنع لقطات وفيديوهات سينمائية. يتطلب إظهارها sv_cheats 1، مما يعطل أيضا الإنجازات للجلسة.

هذا المقال عن النوع الأول كليا.

ما يمكن (تقريبا) قوله لبوتات الذكاء لتفعله

ليست TFBot قابلة للتحكم مباشرة، لكن يمكن حثها على فعل أشياء :

  • صوّب على أي بوت (حليف أو عدو) بشبكتك وسيسخر منك إذا استخدمت الأوامر الصوتية الصحيحة.
  • بوت Medic حليف يداويك إذا استخدمت الأمر الصوتي «Medic!»
  • إذا كان بوت Medic يداويك ولديه UberCharge جاهزة، فقول «Go go go!» أو «فعّل الشحنة!» يجعله يطلق الشحنة فورا.
  • بوت Medic مع شحنة جاهزة يفعّلها تلقائيا بمجرد أن يتلقى هو أو هدف شفائه أضرارا جدية، دون أمر صوتي ضروري.
  • تنفذ البوتات عفويا سخريات ثنائية (High Five) أو سخريات جماعية (Conga) مع زملاء قريبين.

تشغيل البوتات على خرائط غير مدعومة

تعتمد البوتات على شبكة تنقل لتعرف أين يحق لها المشي، ومعظم خرائط المجتمع لا توفرها. للإجبار :

  1. sv_cheats 1
  2. nav_generate، يبني navmesh الأولي، والتقدم معروض في الطرفية
  3. انتظر حتى ينتهي اللعب من توليد المسارات
  4. اختياريا، صحح يدويا بيانات التنقل السيئة مع nav_edit 1
  5. أعد التحميل أو أعد تشغيل الخادم (تخطي هذه الخطوة يعطل الإنجازات)
  6. tf_bot_add <nombre> لإظهار البوتات

تحذير : تعديل navmesh بينما بوتات نشطة على الخادم قد ينهي اللعب. وبمجرد وجود الشبكة، لا تحتاج إعادة توليدها للجلسات المقبلة : أضف فقط البوتات مع tf_bot_add.

تنجح الشبكات المولدة آليا أفضل على خرائط نقطة التحكم وKing of the Hill وPayload وCTF. على خرائط Mannpower، تتبنى البوتات افتراضيا سلوكا من نوع CTF لكنها بالكاد تستخدم الخطافات أو powerups. وإذا لم تكن لخريطة هدف يعرفه ذكاء البوت لكن لديها كيان غرفة ظهور، فتعيين tf_bot_offense_must_push_time 0 يسمح للبوتات بالقتال مع ذلك.

(المصدر لهذا القسم : صفحة Bots في ويكي TF2 الرسمية.)

الحالة الراهنة، خريطة بخريطة

بفضل تحديث Hatless، تعمل كل فئة صحيحا الآن، بما فيها Spy التاريخي المليء bugs. تتصرف البوتات صحيحا على معظم خرائط KOTH الرسمية وبعض خرائط Payload وDustbowl/Gorge بنمط هجوم-دفاع وخرائط CTF/Mann Manor. على هاتين الأخيرتين، لا تستطيع إظهارها مباشرة مع tf_bot_add. على الخرائط غير المدعومة (عبر عملية nav_generate أعلاه)، تعمل، لكنها أسوأ بوضوح في محاكاة لاعب حقيقي.

خرائط PLR قضية خاسرة : لا تستطيع البوتات عبور الحواجز في Hightower وتعلق في الزوايا، وعلى كل خرائط PLR الأخرى تفعل فقط... حفلة رقص بدلا من اللعب. ربما يُصلَّح يوما، وربما يبقى كما هو.

السلوك العام للبوتات

خليط أشياء يفعلها كل بوت بمعزل عن مستواه :

  • تستخدم البوتات فقط loadouts أساسية (يمكن لإضافة إجبارها على أسلحة غير قياسية، لكن بوتات vanilla لا تختار أبدا خاصتها).
  • بالكاد تستخدم البوتات السهلة سلاحها الثانوي. تنتقل الصعوبات الأعلى للسلاح الثانوي بمجرد فراغ المخزن الرئيسي، أو لتعويض المسافة.
  • تتجاهل البوتات تقنيات الحركة المتقدمة : لا rocket jump، ولا نقل مبانٍ.
  • بعد قتل، قد يسخر بوت، حتى تحت النار، إلا إذا كان يحمل استخبارات العدو، وتنطبق هذه القاعدة أيضا في MvM.
  • بوتات Spy المتنكرة (لاعب أو ذكاء) تُتجاهَل صحيحا من البوتات الأخرى : حتى تلمس عدوا أو تخرب شيئا أو تطلق أو تصبح غير مرئية قرب أحدهم. وبمجرد "اكتشافها"، يُحفَظ هذا البوت/اللاعب بعينه كـSpy حتى يغيّر تنكره وهو غير مرئي أو يموت أو يتظاهر بالموت مع Dead Ringer.
  • تستخدم بوتات Pyro دفعة الضغط بسخاء انطلاقا من المستوى العادي.
  • تعطي بوتات Medic أولوية الشفاء للجميع باستثناء Snipers (وبدرجة أقل Engineers)، حتى لو أغمرت «Medic!» بصفتك كذلك.
  • تنجذب بوتات Medic نحو Heavies وSoldiers وDemomen وPyros : تحديدا عندما يلعب إنسان هذه الفئات. يتبع هذا الاهتمام وجود إنسان في هذه الأدوار.
  • تبقى البوتات في موضعها أثناء زمن التحضير على خرائط هجوم/دفاع وPayload، باستثناء Engineers وSnipers وSpies، الذين يتحركون بحرية (يُسمَح أيضا لبوتات Demoman بوضع قنابل لاصقة مسبقا).
  • لا تحسّن بوتات Engineer أبدا مباني Engineer حليف آخر ولا تعطّلها، إلا إذا كانت هذه المباني في طريق هدفها. وأحيانا لا تصلح ببساطة برجها الخاص، حتى عندما يبدو بديهيا.
  • تنتقل بوتات Spy المرصودة لمسدسها وتتراجع بدلا من إجبار طعنة سكين.
  • تستطيع بوتات Demoman التي حددت برجا (عادة بالموت عليه مرة) رمي قنابل لاصقة عليه تماما من خارج مداه، بقوس عبر الجدران والأسقف عندما تسمح الهندسة.
  • تستخدم بوتات Sniper التي لا تجد هدفا بعد التصويب أحد سطور «Negatives.»
  • تداوي Medics الحلفاء Spy متنكرا دون تردد.

مشاكل / bugs معروفة

يسرد المستند عددا جيدا من الغرائب القديمة :

  • قد تحاول البوتات المشي أو الإطلاق عبر بعض props الثابتة.
  • كلما كشف لاعب/بوت أو تنكر أو انكشف، "تراه" البوتات القريبة وتستدير للرد : حتى لو حدث الحدث خارج مجال رؤيتها الحقيقي. إنه ليس قائما على الصوت ؛ إنه التفاف على اختبار الرؤية.
  • نادرا، قد تعلق البوتات معا جسديا باستخدام ناقل Engineer.
  • لا تظهر الأوامر الصوتية للبوتات (مثلا «Spy!» و«إلى الأمام!») كنص في الدردشة كتلك الخاصة باللاعبين.
  • بوت Medic يشفي بنشاط لن يتفادى الطلقات الواردة ولن يأخذ kits شفاء، حتى عند PV حرجة.
  • قد تواصل البوتات التحرك أثناء سخرية ثنائية، مما يكسر الأثر المقصود من Festive Critical Strike.
  • ترفض بوتات Medic المجروحة حديثا غالبا استخدام Syringe Gun عن بعد، مفضلة الالتحام (أو، في حالات نادرة جدا، محاولة لمسك بشعاع Medi Gun نفسه).
  • لا تعوّض بوتات Medic الجاذبية لطلقات Syringe Gun : غالبا لأن السلاح غير موسوم صحيحا كغير hitscan في كود الذكاء.
  • تستطيع بوتات Spy رؤية Spy غير مرئي وتتبعه (لاعب أو ذكاء) إذا اكتُشف هذا Spy مرة فعلا، بمعزل عن مستوى مهارة البوت المتتبع.
  • حتى لو تنكر لاعب-Spy في فئة فريقه الخاص، فلمس عدو يكشفه مع ذلك (لا تفعل البوتات ذلك لنفسها أبدا، فالبوتات لا تتنكر أبدا في فريقها الخاص).
  • تحترم البوتات الموازنة الآلية للفرق : إذا حاولت حشر بوتات في جهة، يجب أولا استخدام mp_teams_unbalance_limit 0.
  • قد تتجاهل بوتات Engineer مبانيها الخاصة تماما حتى تُدمَّر.
  • تحاول بوتات Heavy أحيانا الإطلاق بـMinigun وهي نافدة الذخيرة، خاصة تحت المستوى الصعب.
  • تنتحر بوتات Medic في الفريق الخاسر أحيانا أثناء مرحلة الإذلال عندما لا عدو قريب، شيء لا يستطيع لاعب بشري إنتاجه حتى بالمحاولة.
  • ضبط معاينة فريقك على BLU في شاشة التحميل يجعل بوتات RED تبدو لك معروضة بصريا كـBLU.
  • ترفض البوتات مع سلاح التحام مخرج أحيانا تبديل السلاح حتى بعد جمع ذخيرة.
  • بعد Jungle Inferno، قد تموت البوتات المُظهَرة بمعاملات صريحة (مثلا tf_bot_add 5 pyro bleu 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، وعشرات أخرى على نفس النمط.

وهناك أيضا دفعة أسماء وُجدت في 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" يُظهر Heavy أزرق اسمه «Blu Hoovy.»


الفصل الثاني : البوتات الأصلية / TFBots، غوص في مستويات المهارة

إطار Sigsegv الأصلي ما زال قائما : واضح أن بوتات Expert تتفوق على بوتات السهلة، لكن Valve لم تشرح أبدا بكم ولا لماذا. إذن الطريقة الوحيدة للمعرفة هي قراءة الكود. إليكم كل آلية تتطور مع المهارة.

ضبط الصعوبة

خارج MvM، تُضبَط الصعوبة عبر cvar :

tf_bot_difficulty مستوى الصعوبة
0 سهل
1 عادي (افتراضي)
2 صعب
3 خبير

يقبل tf_bot_add أيضا وسيطة صعوبة مباشرة (easy/normal/hard/expert).

Popfiles الخاصة بـMvM

في Mann vs. Machine، تملك كل كتلة ظهور TFBot في popfile مفتاح Skill اختياريا. غياب المفتاح يقابل المستوى السهل. في مهام Valve : العمالقة دائما تقريبا Expert، وEngineers وSpies دائما تقريبا Expert، وSnipers عادة صعب (أحيانا Expert). وإذا استخدمت EventChangeAttributes (المضاف في تحديث Two Cities) لتعديل البوتات ديناميكيا أثناء الموجة حسب أحداث الخريطة، فمهارة البوت من الخصائص التي تستطيع تغييرها لحظيا.

وضع Endless في MvM

لم يُشحَن وضع Endless رسميا أبدا، لكن فيه، تنفق البوتات مالها في ترقيات كلاعبين، بما فيها ترقية حصرية للبوتات ترفع مستوى مهارة ذكائها أثناء اللعب.

كيان bot_generator

كيان غامض، غير موثق إلى حد كبير، يُفترَض أنه استُخدِم في وضع التدريب وربما في تطوير MvM المبكر. يعرض مدخلا SetDifficulty للتحكم في مستوى المهارة. وبعد ذلك، يبرد الأثر : لم توثقه Valve أبدا ولم يرسم أحد سلوكه كليا.

لون توهج العين

تملك روبوتات MvM جسيما لتوهج عين يتغير لونه مع مستوى المهارة، مؤشر بصري لم يشرحه أحد خارج المجتمع أبدا :

المهارة لون العينين RVB
سهل/عادي أزرق #24b4ff
صعب/خبير أصفر #fff000

Heavy bot TF2 en position d'attente

الرؤية : زمن التعرف

لا يتفاعل بوت فورا عندما يدخل شيء مجال رؤيته : هناك مهلة مُرمَّزة صلبا قبل أن يُسمَح لبقية الذكاء حتى بالتعرف على التهديد :

المهارة زمن التعرف الأدنى
سهل 1,00 s
عادي 0,50 s
صعب 0,30 s
خبير 0,20 s

إنه جوهر أثر «بوتات السهلة تبدو غبية» في رقم واحد : لا يصوّب بوت سهل أسوأ بمجرد ملاحظتك، بل يستغرق خمسة أضعاف الزمن لملاحظة وجودك.

التصويب : معدل التتبع

لا تتعقبك البوتات باستمرار. تعاين موضعك وسرعتك في فاصل ثابت وتتوقع خطا مستقيما من هناك :

المهارة فاصل إعادة الحساب المعدل المكافئ
سهل 1,00 s 1x/s
عادي 0,25 s 4x/s
صعب 0,10 s 10x/s
خبير 0,05 s 20x/s

استثناء : بوتات Spy مُرمَّزة صلبا بمعدل تتبع عادي مهما كان مستواها الحقيقي : يصوّب Spy خبير دائما كبوت عادي. وهناك أيضا فيديو عرض عام يقارن معدلات التتبع جنبا لجنب إذا أردت رؤية فارق 1x ضد 20x أثناء الحركة.

التصويب : مهارة خاصة بالأسلحة

لا تصوّب البوتات فقط مركز كتلتك : لديها منطق لكل سلاح، وأحيانا مليء bugs فعلا :

قاذف قنابل وقاذف قنابل لاصقة. تعوّض كل مستويات المهارة القوس العمودي، باستخدام قيمة ثابتة من cvar tf_bot_ballistic_elevation_rate. ولأن هذا التعويض لا ينشط إلا لمعرف السلاح الأساسي، لا تحظى صيغ المقذوفات الأسرع (Loch-n-Load وكل ما له معدِّل سرعة مقذوف) بقوس مضبوط صحيحا. وبما أنه مرتبط بمعرف السلاح تحديدا، لا يتلقى Loose Cannon (معرف مختلف) أي تعويض قوس.

Huntsman. لا تعوّض البوتات السهلة سقوط السهم ولا تبحث أبدا عن headshots. تعوّض بوتات المستوى العادي القوس، لكنها لا تصوّب الرأس إلا تحت 150 HU. تصوّب بوتات الصعب/الخبير الرأس دائما.

قاذف صواريخ. بعد 150 HU، تصوّب البوتات غير السهلة قدميك بدلا من مركز الكتلة، معظِّمة احتمالات أضرار المنطقة والدفع. وتحت 150 HU، تنتقل للـheadshots. تصوّب البوتات السهلة دائما مركز الكتلة مهما كانت المسافة. وهو أيضا مقفل بمعرف السلاح : لا يرث Direct Hit وCow Mangler هذا السلوك. منطقي لـDirect Hit (لا منطقة أثر لاستغلالها) ؛ وصفر معنى لـCow Mangler : هذا الجزء من الذكاء يسبق وجود السلاح ولم يُراجَع ببساطة أبدا.

بنادق قنص. يصوّب السهل الجسم. ويصوّب العادي حوالي 33% من الجسم نحو الرأس. ويصوّب الصعب/الخبير الرأس مباشرة. أقل أهمية في MvM، حيث لا تحصل headshots البوتات على مكافأة أضرار على أي حال.

السمع : حساسية للطلقات الخافتة

ينبّه كل إطلاق نار البوتات القريبة لموضع مطلق النار، حتى عبر الجدران، حتى 3000 HU مع 100% احتمال الملاحظة (tf_bot_notice_gunfire_range). لكن مجموعة فرعية من الأسلحة موسومة "خافتة" : مسموعة فقط في 500 HU (tf_bot_notice_quiet_gunfire_range)، وحتى حينها باحتمال يعتمد على المهارة :

المهارة احتمال ملاحظة طلقة خافتة
سهل 10%
عادي 30%
صعب 60%
خبير 90%

يُقسَم هذا الاحتمال على اثنين إذا سُمع طلقة صاخبة في آخر 3 ثوانٍ : الأصوات القوية تخفي الأصوات الضعيفة.

لم تُحدَّث قائمة معرفات الأسلحة الخافتة منذ ديسمبر 2010. كل إضافة لاحقة تستخدم معرف سلاح جديدا تُعامَل كصاخبة افتراضيا، مهما كان يجب منطقيا أن تكون خافتة، إلا إذا أعادت استخدام معرف أقدم. عمليا :

معرف السلاح يغطي
TF_WEAPON_KNIFE كل سكاكين Spy
TF_WEAPON_FISTS لكمات Heavy المحددة (لكمته متعددة الفئات هي في الواقع TF_WEAPON_FIREAXE)
TF_WEAPON_PDA يُفترَض غير مستخدم مباشرة
TF_WEAPON_PDA_ENGINEER_BUILD PDA بناء Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA تدمير Engineer
TF_WEAPON_PDA_SPY عدة تنكر Spy
TF_WEAPON_BUILDER عدة أدوات Spy/Engineer/مخرّب
TF_WEAPON_MEDIGUN كل Medi Guns
TF_WEAPON_DISPENSER غالبا غير مستخدم (Dispensers عناصر، لا أسلحة)
TF_WEAPON_INVIS كل ساعات اختفاء Spy
TF_WEAPON_FLAREGUN كل مسدسات إشارة Pyro باستثناء 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 Mor وPersian Persuader وHalf-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

المثال التقليدي للقائمة المتعفنة : تلقى Manmelter معرفه الخاص (TF_WEAPON_RAYGUN_REVENGE)، المضاف بعد تجميد قائمة الأسلحة الخافتة، فيُعامَل كصاخب، رغم كونه مسدس إشارة بكل المعاني العملية. أما Scorch Shot، الصادر بعده أكثر، فيعيد استخدام معرف الأساس TF_WEAPON_FLAREGUN وبالتالي ما زال يُعتبَر خافتا. جنوني، لكنه الكود.

الاستراتيجية : ترتيب التهديدات

عندما يكون عدة أعداء مرئيين في آن واحد، تزن البوتات المسافة وما إذا كان يُطلَق عليها النار، وفوق السهل، ما إذا كان التهديد الرئيسي يُداوَى :

المهارة يصوّب المداوي بدلا ؟
سهل لا
عادي 50% احتمال
صعب نعم
خبير نعم

يُخفَّض عادة أولوية الأعداء بعد 500 HU كغير فوريين. استثناءات : تعامل بوتات الصعب/الخبير دائما Medics وEngineers البعيدين كتهديدات فورية، وأي Sniper عدو يصوّب تقريبا في اتجاهك يُعامَل دائما كفوري مهما كانت المسافة والمهارة.

المهارة Medics/Engineers البعيدون/Snipers المصوّبون = تهديد فوري ؟
سهل/عادي لا
صعب/خبير نعم

لفحص Sniper هذا تاريخ مدهش أحب دائما روايته. افترضت كتابة Sigsegv الأصلية أن اللعب يشترط أن يكون الجداء النقطي بين متجه تصويب القناص والموضع النسبي للبوت صفرا بالضبط : مقارنة دقيقة حتى أنها بالكاد تُحفَّز في حساب عائم، جاعلة الوظيفة كاملة كودا ميتا فعليا. أظهر تصحيح منشور لاحقا (الفضل لتفكيك Hex-Rays أنظف) أن الفحص الحقيقي هو جداء نقطي > 0 : أي Sniper يواجه من نحوك مباشرة إلى عمودي عليك يُعتبَر تهديدا فوريا ؛ وكل ما من عمودي إلى مدير ظهره لا يُعتبَر. جاءت القراءة الخاطئة الأصلية من تفكيك سيئ لمقارنة SSE عائمة. يبقى الهندسة العكسية لثنائي AAA تمرينا تقريبيا.

الحركة : تفادٍ

لا تتفادى البوتات السهلة أبدا، نقطة نهائية. تتفادى بوتات العادي فأعلى يمينا/يسارا (33% يسار و33% يمين و33% لا شيء، موزونة ضد الحفر المكتشفة) عندما تحمل سلاح قتال ورأت عدوا في آخر 3 ثوانٍ وكان لهذا العدو خط رؤية عليها.

لن تتفادى إذا انطبقت إحدى هذه الحالات : سمة DisableDodge مضبوطة، أو يقول سلوكها الحالي أن تسرع، أو منيعة حاليا (أي uber)، أو وسط سخرية/استفزاز، أو تلعب Engineer، أو غير مرئية أو متنكرة كـSpy، أو تصوّب كـSniper أو تدور كـHeavy، أو تشد Huntsman.

الحركة : تجنب الاصطدام بالأعداء

فوق العادي، تحاول البوتات تحديدا ألا تدخل في الأعداء أثناء التحرك :

المهارة تتجنب الاصطدام بالأعداء ؟
سهل لا
عادي لا
صعب نعم
خبير نعم

عمليا، لا يهم ذلك إلا لبوتات Spy : تجنب اصطدام محرج مع لاعب عدو هو بالضبط ما يفضح تنكرا.

Pyro : إتقان airblast

يخدم airblast شيئين : عكس المقذوفات (PvP وMvM) ودفع الأعداء القريبين من الحواف (PvP فقط). إن ضغط البوت الزناد أمام فرصة صالحة أم لا هو رمي عملة قائم على المهارة :

المهارة احتمال تحفيز airblast
سهل 0%
عادي 50%
صعب 90%
خبير 100%

لا تستطيع بوتات Pyro السهلة حرفيا عمل airblast : الرمي مُرمَّز صلبا ليفشل أبدا، لا "نادرا" فقط.

Spy : فعالية التنكر

يتطور محوران متميزان مع المهارة. اختيار التنكر :

المهارة طريقة التنكر
سهل/عادي فئة عشوائية، متجاهلة ما يلعبه فعلا فريق العدو
صعب/خبير يختار لاعب عدو حقيقي وينسخ فئته بالضبط

السلوك في التنكر :

المهارة السلوك في التنكر/الاختفاء
سهل/عادي يحدّق في لاعبي العدو عندما يراهم (مريب)
صعب/خبير يتجنب عمدا التواصل البصري (أكثر إقناعا)

Spy : عدوانية الطعن الخلفي

على المدى الطويل (حتى 300 HU، tf_bot_spy_knife_range)، لا ينخرط بوت Spy في طعن خلفي إلا إذا استطاع رؤية الضحية وكان ظهر الضحية مدورا جزئيا على الأقل. تحدد المهارة إلى أي حد يمكن أن تنحرف زاوية الظهر هذه عن المركز :

المهارة تسامح الزاوية
سهل يحاول حتى لو واجهته مباشرة
عادي ±45° من ظهرك
صعب ±78° من ظهرك
خبير ±90° من ظهرك (قوس خلفي كامل 180°)

بوتات Spy السهلة انتحارية وظيفيا : ستحاول طعنة سكين على شخص ينظر لها في العينين مباشرة. استثناء : في Mann vs. Machine، يُجبَر كل بوت Spy على قيد الزاوية العادي مهما كان مستواه الحقيقي.

تكتيكات : اختيار الأسلحة

يخص هذا المنطق فقط المستويات فوق السهل، مع اهتمام مخفض في MvM بما أن للبوتات هناك عادة قيود أسلحة صارمة :

  • Scout : ينتقل للسلاح الثانوي عندما يفرغ مخزن الرئيسي.
  • Soldier : ينتقل للسلاح الثانوي عندما يفرغ المخزن وكان الهدف تحت 500 HU.
  • Sniper : ينتقل للسلاح الثانوي للأهداف تحت 750 HU.
  • Pyro : ينتقل للسلاح الثانوي للأهداف فوق 750 HU، إلا إذا كان هذا الهدف Soldier أو Demoman.

تكتيكات : إعادة التحميل تحت غطاء

منطق غائب عن MvM. إذا لم يقل سلوك البوت الحالي له أن يتراجع، وكان مخزنه الرئيسي فارغا وبقي ضعيفا دون uber، تنسحب بوتات المستوى الأعلى مؤقتا لغطاء لإعادة التحميل بدلا من النقر على سلاح فارغ في وجهك :

المهارة ينسحب لإعادة التحميل ؟
سهل لا
عادي لا
صعب نعم
خبير نعم

وضع 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 تستخدم Spies دائما العادي
تعويض قوس قنبلة/لاصقة نعم نعم نعم نعم Loose Cannon مستثنى
تعويض عمودي Huntsman لا نعم نعم نعم
Headshots في Huntsman لا <150 HU نعم نعم
إطلاق أقدام بقاذف صواريخ لا نعم نعم نعم Direct Hit وCow Mangler مستثنيان
نقطة تصويب بندقية قنص جسم ~33% نحو رأس رأس رأس
احتمال ملاحظة الطلقات الخافتة 10% 30% 60% 90% يُقسَم على 2 إذا خُفي بطلقات صاخبة
يصوّب المداوي لا 50% نعم نعم
Medic/Engineer/Sniper بعيد = تهديد لا لا نعم نعم
تفادٍ لا نعم نعم نعم قائمة استثناءات طويلة
تجنب الاصطدام بالأعداء لا لا نعم نعم مهم أساسا لـSpy
احتمال تحفيز airblast 0% 50% 90% 100%
اختيار فئة تنكر Spy عشوائي عشوائي يطابق عدوا حقيقيا يطابق عدوا حقيقيا
تواصل بصري Spy في التنكر يحدّق (واضح) يحدّق يتجنب (مقنع) يتجنب
زاوية طعن Spy الخلفي ~0° ±45° ±78° ±90° MvM يجبر العادي
منطق اختيار الأسلحة لا نعم نعم نعم أقل صلة في MvM
إعادة تحميل تحت غطاء لا لا نعم نعم ليس في MvM
تيه مدافع CP 10% 50% 75% 90% ليس في MvM
حظر التقاط CP لا 50% نعم نعم ليس في MvM

الخلاصة

Heavy bot TF2 visant avec un minigun

يعكس كل ذلك نظام Valve المتعمد : نتائج واحتمالات حتمية تماما، لكنها لم تُوثَّق رسميا أبدا. إليكم النقاط التي أحتفظ بها بعد هذا الغوص :

  1. "المهارة" مجموعة مؤشرات مستقلة، لا مضاعف شامل. يتطور زمن التفاعل وإيقاع التصويب وكل سلوك تكتيكي منفردا، وبعضها (معدل تتبع Spy وزاوية طعن MvM الخلفية) له تجاوزات مُرمَّزة صلبا مهما كان المستوى.
  2. جزء مليء bugs فعلا، لا قديم فقط. قائمة الأسلحة الخافتة المتجمدة منذ 2010 وCow Mangler دون منطق إطلاق أقدام دون سبب وجيه وفحص الجداء النقطي لـSniper الذي استغرق سنوات ليفكك صحيحا : كود ذكاء Valve له ندوب كأي قاعدة كود عمرها 17 عاما.
  3. تستطيع استخدام كل ذلك. اعلم أن بوت Sniper لن يصيبك headshot في العادي، وأن Pyro سهلا لا يستطيع حرفيا عكس صاروخك، وأن Spy سهلا سيحاول طعنك وجها لوجه. ليست حظا. إنها بطاقة تقنية.

شكر ضخم لـsigsegv على الغوص في الكود الأصلي الذي جعل معظم ذلك ممكنا، ولويكي TF2 على التوثيق الأساسي لأوامر البوتات ودعم الخرائط، ولكل من في المجتمع يواصلون العبث بذكاء بوت عمره 17 عاما لفهم بالضبط لماذا يفعل ما يفعله.

Bot TF2 không ngẫu nhiên : Tôi đã tái khám phá mọi tham số độ khó

Tầm nhìn, ngắm bắn, góc backstab, logic headshot, mọi bug đã biết -- Valve chưa từng ghi chép gì. Nên chúng tôi bới mã và biến tất cả thành tài liệu kỹ thuật đầy đủ.

Giới thiệu

Bot Soldier TF2 ngắm bằng rocket launcher

Mỗi người chơi TF2 đều nói ít nhất một lần : « bot này hack. » Hay ngược lại : « sao bot Dễ này đứng yên ăn rocket. » Không ai thực sự biết « Dễ », « Thường », « Khó » và « Chuyên gia » nghĩa là gì dưới nắp capo : Valve tung bốn nhãn độ khó và đúng không tài liệu nào.

Nên một nhóm chúng tôi (tôi, awimii, Mush The Possum, với phần lớn công nền do sigsegv thực hiện, người thực sự bới mã dịch ngược của game) đã gom tài liệu nghiên cứu đầy đủ về hành vi TFBot. Mỗi cơ chế, mỗi bug đã biết, mỗi xác suất ghi cứng. Bài này là báo cáo toàn văn, không phải bản rút gọn. Lấy Bonk đi, sẽ dài đấy.


Chương I : Nền tảng

Bot đấu Bot Con Rối

TF2 có hai thứ hoàn toàn khác nhau mà người ta gọi là « bot » :

  • Bot AI (TFBots) : AI thật, dựng trên cùng framework PlayerBot/Infected mà Valve dùng cho series Left 4 Dead. Chúng chọn lớp ngẫu nhiên, chơi mục tiêu, chạy không cần sv_cheats và kích hoạt thành tựu như người chơi thật.
  • Bot Con Rối : không AI, không thể tự di chuyển hay hành động. Chúng tồn tại chỉ để điều khiển tay -- người chơi có thể ép chúng theo, ngắm và bắn. Chủ yếu dùng để test hay làm ảnh chụp màn hình và video điện ảnh. Triệu hồi chúng đòi sv_cheats 1, điều này cũng tắt thành tựu cho phiên.

Bài này hoàn toàn về kiểu đầu.

Điều ta có thể (ít nhiều) bảo bot AI làm

TFBot không điều khiển trực tiếp được, nhưng ta có thể dụ chúng làm vài việc :

  • Nhắm vào bất kỳ bot nào (phe ta hay địch) bằng crosshair và nó sẽ trêu bạn nếu bạn dùng lệnh thoại đúng.
  • Bot Medic phe ta sẽ hồi máu bạn nếu bạn dùng lệnh thoại « Medic! »
  • Nếu bot Medic đang hồi máu bạn và có UberCharge sẵn, nói « Go go go! » hay « Activez la charge! » khiến nó kích hoạt charge ngay.
  • Bot Medic có charge sẵn tự kích hoạt hễ bản thân hay mục tiêu hồi của nó chịu sát thương nặng, không cần lệnh thoại.
  • Bot tự trêu đôi (High Five) hay trêu nhóm (Conga) với đồng đội gần.

Cho bot chạy trên bản đồ không hỗ trợ

Bot phụ thuộc lưới điều hướng để biết chúng được đi đâu, và hầu hết bản đồ cộng đồng không cung cấp. Để ép :

  1. sv_cheats 1
  2. nav_generate -- dựng navmesh ban đầu, tiến trình hiện trong console
  3. Chờ game sinh xong đường đi
  4. Tùy chọn, sửa tay dữ liệu điều hướng xấu bằng nav_edit 1
  5. Tải lại hay khởi động lại máy chủ (bỏ bước này tắt thành tựu)
  6. tf_bot_add <số lượng> để thả bot

Cảnh báo : sửa navmesh trong khi bot đang hoạt động trên máy chủ có thể làm sập game. Khi lưới đã tồn tại, bạn không cần tạo lại cho các phiên sau : chỉ thêm bot bằng tf_bot_add.

Lưới tự sinh chạy tốt nhất trên bản đồ Point de Contrôle, King of the Hill, Payload và CTF. Trên bản đồ Mannpower, bot mặc định hành vi kiểu CTF nhưng hầu như không dùng móc hay powerup. Nếu bản đồ không có mục tiêu AI bot nhận ra nhưng có thực thể phòng sinh, đặt tf_bot_offense_must_push_time 0 cho phép bot vẫn chiến đấu.

(Nguồn cho mục này : trang Bots của wiki TF2 chính thức.)

Trạng thái hiện tại, bản đồ theo bản đồ

Nhờ cập nhật Hatless, mỗi lớp chạy đúng giờ, kể cả Spy vốn bug lịch sử. Bot hành xử đúng trên hầu hết bản đồ KOTH chính thức, vài bản đồ Payload, Dustbowl/Gorge Attack-Defense và bản đồ CTF/Mann Manor. Trên hai bản đồ sau, bạn không thể thả chúng trực tiếp bằng tf_bot_add. Trên bản đồ không hỗ trợ (qua quy trình nav_generate trên), chúng chạy, nhưng kém hẳn việc bắt chước người chơi thật.

Bản đồ PLR là án thua : bot không qua được rào trên Hightower và kẹt trong góc, và trên mọi bản đồ PLR khác chúng chỉ... mở tiệc nhảy thay vì chơi. Có thể một ngày sẽ sửa, có thể sẽ giữ nguyên.

Hành vi chung của bot

Túi tổng hợp những việc mỗi bot làm bất kể cấp :

  • Bot chỉ dùng loadout cơ bản (plugin có thể ép chúng dùng vũ khí không chuẩn, nhưng bot vanilla không bao giờ tự chọn).
  • Bot Dễ hầu như không dùng vũ khí phụ. Cấp cao hơn chuyển sang vũ khí phụ hễ băng đạn chính hết, hay để bù khoảng cách.
  • Bot lờ kỹ thuật di chuyển nâng cao : không rocket jump, không di dời công trình.
  • Sau một mạng, bot có thể trêu, ngay cả dưới hỏa lực, trừ khi nó mang tin tình báo địch, và quy tắc này cũng áp trong MvM.
  • Bot Spy cải trang (người hay AI) được các bot khác lờ đúng : tới khi nó chạm địch, phá hoại gì đó, bắn hay thành vô hình gần địch. Khi « lộ », bot/người chơi cụ thể đó bị nhớ là Spy tới khi nó đổi cải trang trong lúc vô hình, chết hay giả chết bằng Dead Ringer.
  • Bot Pyro dùng Compression Blast thoải mái từ cấp Thường.
  • Bot Medic ưu tiên hồi máu mọi người trừ Sniper (và, ở mức ít hơn, Engineer), ngay cả khi bạn spam « Medic! » trong vai đó.
  • Bot Medic bị hút về Heavy, Soldier, Demoman và Pyro : cụ thể khi con người chơi các lớp này. Chú ý này theo sự hiện diện của con người trong các vai đó.
  • Bot giữ vị trí trong thời gian chuẩn bị trên bản đồ Attack/Defense và Payload, trừ Engineer, Sniper và Spy, di chuyển tự do (bot Demoman cũng được phép đặt trước bom dính).
  • Bot Engineer không bao giờ nâng cấp hay tắt công trình của Engineer phe ta khác, trừ khi công trình đó nằm trên đường tới mục tiêu của nó. Đôi khi chúng đơn giản không sửa tháp pháo của chính mình, ngay cả khi trông hiển nhiên.
  • Bot Spy bị lộ chuyển sang revolver và lùi thay vì ép dao.
  • Bot Demoman đã định vị sentry (thường bằng cách chết lên nó một lần) có thể ném bom dính hoàn hảo lên đó từ ngoài tầm của nó, theo vòng cung xuyên tường và trần khi hình học cho phép.
  • Bot Sniper không thấy mục tiêu sau khi ngắm dùng một trong các dòng thoại « Negatives. »
  • Medic phe ta hồi máu Spy cải trang không do dự.

Vấn đề / bug đã biết

Tài liệu liệt kê kha khá kỳ quặc lâu đời :

  • Bot có thể cố đi hay bắn xuyên vài prop tĩnh.
  • Mỗi khi người chơi/bot lộ mặt, cải trang hay hiện hình, bot gần « thấy » nó và quay lại phản ứng : ngay cả khi sự kiện xảy ra ngoài tầm nhìn thật của chúng. Việc này không dựa trên âm thanh ; đó là cách lách kiểm tra tầm nhìn.
  • Hiếm khi, bot có thể kẹt vật lý vào nhau khi dùng teleporter của Engineer.
  • Lệnh thoại của bot (vd « Spy! », « En avant! ») không hiện dạng văn bản trong chat như của người chơi.
  • Bot Medic đang hồi máu ai đó sẽ không né đạn tới hay lấy kit máu, ngay cả ở máu nguy kịch.
  • Bot có thể tiếp tục di chuyển trong lúc trêu đôi, phá hiệu ứng dự kiến của Festive Critical Strike.
  • Bot Medic vừa bị thương thường từ chối dùng Syringe Gun ở xa, thích cận chiến (hay, rất hiếm, cố chạm bạn bằng tia Medi Gun).
  • Bot Medic không bù trọng lực cho đạn Syringe Gun : có lẽ vì vũ khí không được đánh dấu đúng là phi hitscan trong mã AI.
  • Bot Spy có thể thấy và theo Spy vô hình (người hay AI) nếu Spy đó đã từng bị lộ một lần, bất kể cấp của bot đang theo.
  • Ngay cả khi người chơi Spy cải trang thành lớp của đội mình, chạm địch vẫn lộ mặt (bot không bao giờ tự làm vậy, vì bot không bao giờ cải trang thành đội mình).
  • Bot tôn trọng tự cân bằng đội : nếu bạn cố dồn bot một bên, bạn phải dùng mp_teams_unbalance_limit 0 trước.
  • Bot Engineer có thể hoàn toàn lờ công trình của chính mình tới khi chúng bị phá.
  • Bot Heavy đôi khi cố bắn Minigun trong khi hết đạn, nhất là dưới cấp Khó.
  • Bot Medic đội thua thỉnh thoảng tự sát trong giai đoạn Humiliation khi không địch nào gần -- điều người chơi không thể tái tạo dù cố.
  • Đặt xem trước đội thành BLU trong màn hình tải khiến bot RED trông như render thành BLU với 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 Jungle Inferno, bot thả với tham số rõ (vd tf_bot_add 5 pyro bleu normal) có thể chết ngay trong phòng sinh của chính mình. Sửa : tf_bot_reevaluate_class_in_spawnroom 0 (đòi sv_cheats 1).

Tên của AI

Tên bot lấy từ kho lớn tham chiếu tới TF2, game khác của Valve và văn hóa lập trình, phần lớn vì cộng đồng cứ đòi các tên cụ thể trên diễn đàn Steam. 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 chục cái khác cùng kiểu.

Ngoài ra có loạt tên thấy trong build mã nguồn rò rỉ chưa bao giờ lên production, vì lý do không rõ : chủ yếu tham chiếu 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ể thay tất cả tự làm : tf_bot_add heavyweapons blue "Blu Hoovy" thả Heavy BLU tên « Blu Hoovy. »


Chương II : Bot Gốc / TFBots -- Lặn vào Cấp Độ

Khung gốc của Sigsegv vẫn đúng : rõ ràng bot Chuyên gia vượt bot Dễ, nhưng Valve chưa bao giờ giải thích bao nhiêu hay vì sao. Nên cách duy nhất để biết là đọc mã. Đây là mỗi cơ chế évoluent theo cấp.

Chỉnh độ khó

Ngoài MvM, độ khó điều khiển bằng cvar :

tf_bot_difficulty Cấp độ
0 Dễ
1 Thường (mặc định)
2 Khó
3 Chuyên gia

tf_bot_add cũng nhận đối số độ khó trực tiếp (easy/normal/hard/expert).

Popfile MvM

Trong Mann vs. Machine, mỗi khối spawn TFBot trong popfile có khóa Skill tùy chọn. Thiếu khóa khớp cấp Dễ. Trong nhiệm vụ của Valve : Giant gần như luôn Chuyên gia, Engineer và Spy gần như luôn Chuyên gia, và Sniper thường Khó (thỉnh thoảng Chuyên gia). Nếu bạn dùng EventChangeAttributes (thêm trong cập nhật Two Cities) để sửa động bot giữa đợt theo sự kiện bản đồ, cấp của bot là một trong các thuộc tính bạn có thể đổi tức thì.

Chế độ Endless MvM

Chế độ Endless chưa bao giờ chính thức lên sóng, nhưng trong đó, bot tiêu tiền vào nâng cấp như người chơi, kể cả nâng cấp chỉ bot tăng cấp AI trong lúc chơi.

Thực thể bot_generator

Thực thể mù mờ, phần lớn không ghi chép, cho rằng từng dùng trong chế độ huấn luyện và có thể trong phát triển MvM sớm. Nó phơi bày đầu vào SetDifficulty để điều khiển cấp. Xa hơn, dấu vết nguội : Valve chưa bao giờ ghi chép nó và không ai vẽ đầy đủ hành vi của nó.

Màu phát sáng mắt

Robot MvM có hạt phát sáng mắt đổi màu theo cấp, chỉ báo hình ảnh không ai ngoài cộng đồng từng giải thích :

Cấp Màu mắt RVB
Dễ/Thường Xanh #24b4ff
Khó/Chuyên gia Vàng #fff000

Bot Heavy TF2 ở tư thế chờ

Tầm nhìn : thời gian nhận diện

Bot không phản ứng tức thì khi thứ gì lọt vào tầm nhìn : có trễ ghi cứng trước khi phần còn lại của AI được phép nhận diện mối đe dọa :

Cấp Thời gian nhận diện tối thiểu
Dễ 1,00 s
Thường 0,50 s
Khó 0,30 s
Chuyên gia 0,20 s

Đó là bản chất của hiệu ứng « bot Dễ trông ngu » trong một con số duy nhất : bot Dễ không ngắm kém hơn khi đã thấy bạn, nó chỉ mất gấp năm lần thời gian để nhận ra bạn tồn tại.

Ngắm : tốc độ bám

Bot không bám bạn liên tục. Chúng lấy mẫu vị trí và vận tốc của bạn theo khoảng cố định và dự đoán đường thẳng từ đó :

Cấp Khoảng tính lại Tốc độ tương đương
Dễ 1,00 s 1x/s
Thường 0,25 s 4x/s
Khó 0,10 s 10x/s
Chuyên gia 0,05 s 20x/s

Ngoại lệ : bot Spy ghi cứng với tốc độ bám Thường bất kể cấp thật : Spy Chuyên gia luôn ngắm như bot Thường. Ngoài ra có video demo công khai so sánh các tốc độ bám cạnh nhau nếu bạn muốn thấy chênh 1x đấu 20x khi động.

Ngắm : kỹ năng theo vũ khí

Bot không chỉ ngắm khối tâm của bạn : chúng có logic theo vũ khí, đôi khi bug thật :

Súng phóng lựu và Súng phóng bom dính. Mọi cấp đều bù vòng cung đứng, dùng giá trị cố định của cvar tf_bot_ballistic_elevation_rate. Vì bù này chỉ kích hoạt với ID vũ khí nền, các biến thể đạn nhanh hơn (Loch-n-Load, mọi thứ có bổ trợ tốc độ đạn) không có vòng cung chỉnh đúng. Và vì nó gắn cụ thể theo ID vũ khí, Loose Cannon (ID khác) không nhận bù vòng cung nào.

Huntsman. Bot Dễ không bù rơi tên và không bao giờ tìm headshot. Bot cấp Thường bù vòng cung, nhưng chỉ ngắm đầu dưới 150 HU. Bot Khó/Chuyên gia luôn ngắm đầu.

Súng phóng rocket. Ngoài 150 HU, bot phi Dễ ngắm chân bạn thay vì khối tâm, tối đa hóa cơ hội sát thương vùng và hất văng. Dưới 150 HU, chúng chuyển sang headshot. Bot Dễ luôn ngắm khối tâm bất kể khoảng cách. Việc này cũng khóa theo ID vũ khí : Direct Hit và Cow Mangler không thừa hưởng hành vi này. Hợp lý với Direct Hit (không có vùng hiệu ứng để khai thác) ; vô nghĩa với Cow Mangler : phần AI này có trước cả khi vũ khí tồn tại và đơn giản chưa bao giờ xem lại.

Súng bắn tỉa. Dễ ngắm thân. Thường ngắm khoảng 33% từ thân lên đầu. Khó/Chuyên gia ngắm thẳng đầu. Ít quan trọng trong MvM, nơi headshot của bot đằng nào cũng không được thưởng sát thương.

Thính giác : nhạy với phát bắn kín

Mỗi phát bắn báo cho bot gần về vị trí của xạ thủ, ngay cả xuyên tường, tới 3000 HU với 100% cơ hội bị chú ý (tf_bot_notice_gunfire_range). Nhưng tập con vũ khí được đánh dấu « kín » : chỉ nghe được trong 500 HU (tf_bot_notice_quiet_gunfire_range), và ngay cả vậy với cơ hội phụ thuộc cấp :

Cấp Cơ hội chú ý phát bắn kín
Dễ 10%
Thường 30%
Khó 60%
Chuyên gia 90%

Xác suất này chia đôi nếu phát bắn ồn đã nghe trong 3 giây qua : âm lớn át âm nhỏ.

Danh sách ID vũ khí kín chưa cập nhật từ tháng 12 năm 2010. Mọi bổ sung sau dùng ID vũ khí mới mặc định bị coi là ồn, dù về logic nó kín tới đâu, trừ khi nó tái dùng ID cũ hơn. Cụ thể :

ID vũ khí Bao phủ
TF_WEAPON_KNIFE Mọi dao của Spy
TF_WEAPON_FISTS Đấm tay riêng của Heavy (cú đấm đa lớp của nó thực chất là TF_WEAPON_FIREAXE)
TF_WEAPON_PDA Cho rằng không dùng trực tiếp
TF_WEAPON_PDA_ENGINEER_BUILD PDA xây của Engineer
TF_WEAPON_PDA_ENGINEER_DESTROY PDA phá của Engineer
TF_WEAPON_PDA_SPY Kit cải trang của Spy
TF_WEAPON_BUILDER Kit công cụ của Spy/Engineer/Saboteur
TF_WEAPON_MEDIGUN Mọi Medi Gun
TF_WEAPON_DISPENSER Có lẽ không dùng (Dispenser là vật thể, không phải vũ khí)
TF_WEAPON_INVIS Mọi đồng hồ tàng hình của Spy
TF_WEAPON_FLAREGUN Mọi súng pháo sáng Pyro 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 kín)
TF_WEAPON_COMPOUND_BOW Huntsman
TF_WEAPON_SWORD Eyelander, Skullcutter, Claidheamh Mor, Persian Persuader, Half-Zatoichi
TF_WEAPON_CROSSBOW Crusader's Crossbow

Ví dụ kinh điển của danh sách mục nát : Manmelter nhận ID riêng (TF_WEAPON_RAYGUN_REVENGE), thêm sau khi danh sách vũ khí kín đóng băng, nên bị coi là ồn, dù thực tế là súng pháo sáng mọi nghĩa. Scorch Shot, ra còn muộn hơn, tái dùng ID nền TF_WEAPON_FLAREGUN nên vẫn bị coi là kín. Điên, nhưng đó là mã.

Chiến lược : ưu tiên mối đe dọa

Khi nhiều địch cùng hiện, bot cân khoảng cách, việc chúng có đang bị bắn và, trên Dễ, việc mối đe dọa chính có đang được hồi máu :

Cấp Ngắm người hồi máu thay?
Dễ Không
Thường 50% cơ hội
Khó Có
Chuyên gia Có

Địch ngoài 500 HU thường bị hạ ưu tiên thành không cấp bách. Ngoại lệ : bot Khó/Chuyên gia luôn coi Medic và Engineer xa là mối đe dọa cấp bách, và mọi Sniper địch ngắm gần đúng hướng bạn luôn bị coi là cấp bách bất kể khoảng cách và cấp.

Cấp Medic/Engineer xa/Sniper đang ngắm = mối đe dọa cấp bách?
Dễ/Thường Không
Khó/Chuyên gia Có

Lần kiểm tra Sniper này có lịch sử đáng ngạc nhiên tôi luôn thích kể. Bài gốc của Sigsegv cho rằng game đòi tích vô hướng giữa vector ngắm của sniper và vị trí tương đối của bot phải đúng bằng không : so sánh chính xác tới mức gần như không bao giờ kích trong tính dấu chấm động, khiến toàn bộ tính năng thực tế là mã chết. Sửa sau (ghi công bản dịch ngược Hex-Rays sạch hơn) cho thấy kiểm tra thật là tích vô hướng > 0 : mọi Sniper đối mặt từ thẳng về phía bạn tới vuông góc với bạn bị coi là mối đe dọa cấp bách ; mọi thứ từ vuông góc tới quay lưng thì không. Lần đọc sai gốc tới từ bản dịch ngược sai của so sánh SSE dấu chấm động. Reverse-engineering trên binary AAA vẫn là bài tập gần đúng.

Di chuyển : né

Bot Dễ không bao giờ né, chấm hết. Bot Thường trở lên né trái/phải (33% trái, 33% phải, 33% không làm gì, cân tránh hố phát hiện) khi chúng cầm vũ khí chiến đấu, đã thấy địch trong 3 giây qua và địch đó có đường nhìn lên chúng.

Chúng sẽ không né nếu một trong các ca này áp dụng : thuộc tính DisableDodge đặt, hành vi hiện tại bảo phải nhanh, đang bất khả xâm phạm (bất kỳ uber nào), đang trêu/chế nhạo, chơi Engineer, vô hình hay cải trang Spy, đang ngắm Sniper hay quay Heavy, hay đang giương Huntsman.

Di chuyển : tránh húc địch

Trên Thường, bot cố không đi vào địch khi di chuyển :

Cấp Tránh húc địch?
Dễ Không
Thường Không
Khó Có
Chuyên gia Có

Thực tế, việc này chỉ đáng với bot Spy : tránh va chạm ngượng với người chơi địch đúng là thứ lộ cải trang.

Pyro : thành thạo airblast

airblast dùng cho hai việc : phản chiếu đạn (PvP và MvM) và đẩy địch gần mép (chỉ PvP). Việc bot có bóp cò trước cơ hội hợp lệ hay không là tung đồng xu theo cấp :

Cấp Cơ hội kích airblast
Dễ 0%
Thường 50%
Khó 90%
Chuyên gia 100%

Bot Pyro Dễ đúng nghĩa không thể airblast : lần tung ghi cứng không bao giờ trúng, không chỉ « hiếm. »

Spy : hiệu quả cải trang

Hai trục riêng évoluent theo cấp. Chọn cải trang :

Cấp Phương pháp cải trang
Dễ/Thường Lớp ngẫu nhiên, lờ đội địch thực sự chơi gì
Khó/Chuyên gia Chọn người chơi địch thật và chép đúng lớp của họ

Hành vi khi cải trang :

Cấp Hành vi khi cải trang/vô hình
Dễ/Thường Nhìn chằm người chơi địch khi thấy (đáng ngờ)
Khó/Chuyên gia Cố tránh tiếp xúc mắt (thuyết phục hơn)

Spy : hiếu chiến backstab

Ở tầm xa (tới 300 HU, tf_bot_spy_knife_range), bot Spy chỉ lao vào backstab nếu nó thấy nạn nhân và lưng nạn nhân ít nhất quay một phần. Cấp quyết góc lưng này lệch được bao nhiêu :

Cấp Dung sai góc
Dễ Cố ngay cả khi bạn đối mặt trực tiếp
Thường ±45° từ lưng bạn
Khó ±78° từ lưng bạn
Chuyên gia ±90° từ lưng bạn (vòng sau đầy 180°)

Bot Spy Dễ tự sát về chức năng : chúng sẽ dao người đang nhìn thẳng vào mắt chúng. Ngoại lệ : trong Mann vs. Machine, mỗi bot Spy bị ép ràng buộc góc Thường bất kể cấp thật.

Chiến thuật : chọn vũ khí

Logic này chỉ cho cấp trên Dễ, với ít giá trị trong MvM vì bot ở đó thường bị hạn chế vũ khí chặt :

  • Scout : chuyển vũ khí phụ khi băng đạn chính hết.
  • Soldier : chuyển vũ khí phụ khi băng đạn hết và mục tiêu dưới 500 HU.
  • Sniper : chuyển vũ khí phụ cho mục tiêu dưới 750 HU.
  • Pyro : chuyển vũ khí phụ cho mục tiêu trên 750 HU, trừ khi mục tiêu đó là Soldier hay Demoman.

Chiến thuật : nạp đạn ở chỗ nấp

Logic vắng mặt 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 của nó hết và nó còn dễ tổn thương không uber, bot cấp cao hơn tạm rút về chỗ nấp để nạp thay vì bấm vũ khí rỗng vào mặt bạn :

Cấp Rút về nạp?
Dễ Không
Thường Không
Khó Có
Chuyên gia Có

Chế độ CP : lang thang của hậu vệ

Logic vắng mặt trong MvM. Khi thủ điểm kiểm soát, bot cấp cao hơn dễ rời điểm để săn mạng (« search and destroy »), nhưng chỉ khi còn kha thời gian trên tf_bot_defense_must_defend_time :

Cấp Cơ hội lang thang
Dễ 10%
Thường 50%
Khó 75%
Chuyên gia 90%

Chế độ CP : chặn chiếm

Logic vắng mặt trong MvM. Bot hậu vệ tranh mưu toan chiếm của địch :

Cấp Sẽ chặn chiếm?
Dễ Không
Thường 50% cơ hội
Khó Có
Chuyên gia Có

Bảng tóm tắt đầ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 độ bám 1x/s 4x/s 10x/s 20x/s Spy luôn dùng Thường
Bù vòng cung lựu đạn/bom dính Có Có Có Có Loose Cannon miễn
Bù đứng Huntsman Không Có Có Có
Headshot Huntsman Không <150 HU Có Có
Bắn chân Súng rocket Không Có Có Có Direct Hit và Cow Mangler miễn
Điểm ngắm Súng bắn tỉa Thân ~33% lên đầu Đầu Đầu
Cơ hội chú ý phát bắn kín 10% 30% 60% 90% Chia đôi nếu bị tiếng ồn át
Ngắm người hồi máu Không 50% Có Có
Medic/Engineer/Sniper xa = mối đe dọa Không Không Có Có
Né Không Có Có Có Danh sách ngoại lệ dài
Tránh húc địch Không Không Có Có Quan trọng nhất với Spy
Cơ hội kích 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
Tiếp xúc mắt Spy khi cải trang Nhìn chằm (lộ) Nhìn chằm Tránh (thuyết phục) Tránh
Góc backstab 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 ở chỗ nấp Không Không Có Có Không trong MvM
Lang thang hậu vệ CP 10% 50% 75% 90% Không trong MvM
Chặn chiếm CP Không 50% Có Có Không trong MvM

Kết luận

Bot Heavy TF2 ngắm bằng minigun

Tất cả phản ánh hệ thống có chủ ý của Valve : điểm và xác suất hoàn toàn xác định, chỉ chưa bao giờ ghi chép chính thức. Đây là các điểm tôi giữ sau lần lặn này :

  1. « Cấp » là tập thanh trượt độc lập, không phải hệ số nhân toàn cục. Thời gian phản ứng, nhịp ngắm và mỗi hành vi chiến thuật évoluent riêng, và vài cái (tốc độ bám Spy, góc backstab MvM) có ghi đè ghi cứng bất kể cấp.
  2. Một phần thực sự bug, không chỉ cũ. Danh sách vũ khí kín đóng băng từ 2010, Cow Mangler thiếu logic bắn chân không vì lý do chính đáng nào, kiểm tra tích vô hướng của Sniper mất nhiều năm mới dịch ngược đúng : mã AI của Valve có sẹo như bất kỳ codebase 17 năm nào.
  3. Bạn có thể dùng tất cả. Biết rằng bot Sniper sẽ không headshot bạn ở Thường, Pyro Dễ đúng nghĩa không thể phản rocket của bạn, Spy Dễ sẽ dao bạn đối mặt. Đó không phải may rủi. Đó là tài liệu kỹ thuật.

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