Automatisation de jeu : les mains et les yeux de l'agent
Le vrai jeu est l'oracle. La boucle est : lancer → naviguer → mettre en place la scène → agir → capture d'écran et lire les logs → décider. Construisez-la une fois par jeu, puis chaque modification que vous apportez peut être vérifiée en une minute.
Windows (natif ou depuis WSL) : um win
um win setup # une fois : outils PowerShell + un ffmpeg avec gfxcapture, choisit NVENC/AMF/QSV/x264
um win ps # processus fenêtrés : pid, nom, titre
um win launch --steam 105600 # ou : um win launch "C:\Games\Foo\Foo.exe" -- -windowed
um win shot --exe Terraria.exe shot.png --scale 0.33 # image complète + une copie à 1/3 peu coûteuse à analyser
um win drive --proc Terraria "focus" "click 640 360" "key 0x1B" "type hello" "hold 0x44 1500"
um win drive --proc Terraria "hold 0x20 150" "sleep 200" "hold 0x20 150" # sleep <ms> pause entre les étapes
um win drive --proc Terraria idle # secondes depuis la dernière interaction souris/clavier (ne bloque pas)
um win kill <pid> # PID exact uniquement
um win reg get "HKCU\Software\..." # registre (reg set sauvegarde d'abord la clé)
Depuis Python (pour des scripts plus longs), from um.win import Drive, shot, Recorder, puis d = Drive("AoE2DE_s"), d.focus(), d.click(x, y), d.key("0x0D").
Commandes WinDrive (um/ps1/WinDrive.ps1 ; protocole stdin, une réponse par ligne). Les coordonnées sont dans la zone client de la fenêtre du jeu.
- Souris :
move x y,click x y [right],mdown/mup,drag x0 y0 x1 y1,rel dx dy(caméras FPS / entrée brute),wheel 120. - Clavier :
key <vk> [tap|down|up],hold <vk> <ms>,type <text>,scanmode on(jeux DirectInput / entrée brute qui ignorent les événements de touches virtuelles). - Fenêtre :
focus,rect,size <w> <h>(définit la taille client),title,fg,idle,untop. - Temporisation :
sleep <ms>attend entre les étapes d'un seul appel. Chaque appelum win drivedémarre PowerShell (1-2 s), donc mettez les combos temporisés dans un seul appel. - Codes de touches virtuelles : Échap 0x1B, Entrée 0x0D, Espace 0x20, W/A/S/D 0x57/0x41/0x53/0x44, F1 0x70, Maj 0x10, Ctrl 0x11, flèches 0x25-0x28.
Règles de conduite
- Ne mettez jamais un jeu en ligne de focus pendant que l'humain tape. C'est arrivé avec GTA V : l'agent a mis GTA au premier plan pour cliquer sur Story Mode, les frappes de l'humain ont atterri sur la page d'accueil de GTA, et GTA a averti d'un "accès aux serveurs GTA Online avec une version modifiée". ScriptHookV l'a bloqué ; ne comptez pas là-dessus. Vérifiez
idle, demandez à l'humain de cliquer et lancez avec l'anti-triche désactivé pour qu'Online ne puisse pas démarrer. Voirknowledge/techniques/driving-real-games-safely.md. - L'entrée ne va qu'au jeu. WinDrive refuse d'envoyer tant qu'une autre application est au premier plan. La seule exception est quand rien n'est au premier plan et que le curseur est sur le jeu, ce que les jeux en mode fenêtré provoquent en perdant le premier plan lors des clics.
- L'utilisateur peut être à son PC. Si
idleest inférieur à une minute, demandez avant de conduire et gardez les sessions courtes. Les exécutions sans surveillance sont acceptables une fois que l'utilisateur l'a dit. - Les captures d'écran coûtent des tokens. Utilisez les copies
--scale 0.33. Multipliez les coordonnées par ×3 pour les clics et conservez un tableau des points de clic des menus dans MODLOG.md, mesurés une fois. - Pourquoi gfxcapture : les jeux rendus par GPU deviennent noirs avec la capture GDI. gfxcapture (Windows.Graphics.Capture) capture les vraies images d'une fenêtre, même si elle est couverte. Il ne peut pas capturer les fenêtres réduites.
- Écrans HDR : avec Windows Auto HDR activé pour un jeu SDR, les captures sont délavées (2-3× plus lumineuses, décalées vers le cyan), donc les couleurs ne peuvent pas être évaluées.
um win shot/recordavertissent quand c'est le cas ; désactivez-le pour le jeu pendant la capture (Paramètres > Système > Affichage > Graphiques > le jeu > Auto HDR), et réactivez-le après si l'utilisateur le souhaite.
Rendre la fenêtre prévisible
- Mode fenêtré avec une taille client fixe. Chaque jeu cache ce paramètre quelque part :
- un ini (
[/Script/Engine.GameUserSettings]dans UEGameUserSettings.ini, les valeurs de RegistreScreenmanager Fullscreen mode/Resolutionde Unity sousHKCU\Software\<company>\<product>) ; - un indicateur de lancement (
-windowed -w 1920 -h 1080, Unity-screen-fullscreen 0 -screen-width 1920 -screen-height 1080, Source-sw -w 1920 -h 1080) ; - ou le propre registre du jeu (AoE2 :
Mode Display0 +Windowed Width/Height). um win drive --proc X "size 1920 1080"redimensionne aussi la plupart des jeux fenêtrés.
- un ini (
- Sauter les intros : indicateurs de lancement (
-skipintro,-nosplash, Unity-popupwindow), ou supprimez/renommez les vidéos d'intro dans une copie du jeu. - Aller directement au contenu : indicateurs de chargeur (tModLoader
-skipselect Player:World), une sauvegarde faite pour les tests, le chargement automatique d'un scénario, une commande console de développement. - Limitation en arrière-plan : de nombreux jeux limitent ou mettent en pause lorsqu'ils ne sont pas au premier plan. Trouvez le paramètre (Terraria :
Main.instance.InactiveSleepTime = TimeSpan.Zero; Unity :Application.runInBackground = true; UE :t.IdleWhenNotForeground 0).
Mieux qu'un clic : une scène scriptée ou une passerelle
- Commandes de discussion ou de console dans votre mod qui donnent des objets, invoquent des ennemis et téléportent. Elles réduisent les tests à une seule ligne (
/arsenal,/mothership). - Scènes de test : une timeline côté mod (invoquer des vagues à l'image N, tirer à N+30), un scénario avec des déclencheurs (AoE2 via AoE2ScenarioParser), un monde de test dédié avec une sauvegarde vierge.
- Passerelle agent : un socket JSON-lines dans le mod sur
127.0.0.1(voirexamples/terraria-tmodloader/reference/AgentBridge.cs).- Commandes comme
observe(options de menu ou état du monde sous forme de texte),click <id>,controls,step. - Traitez chaque requête sur le thread principal du jeu après une mise à jour, afin que les réponses soient cohérentes.
- Lisez les menus de manière générique depuis l'arborescence UI, pour que l'agent voie ce qu'un joueur verrait. Laissez de côté les boutons destructeurs (supprimer).
- Un agent peut alors jouer sans utiliser de pixels du tout.
- Commandes comme
- Backend hors processus : gardez la partie dans le jeu légère et mettez le cerveau à l'extérieur (HTTP/dépôt de fichiers). Ce modèle s'adapte aux PNJ IA et aux mashups inter-jeux.
Crashes et nettoyage
- Les rapporteurs de crash (BugSplat
BsSndRpt64.exe,CrashReportClient.exe,UnityCrashHandler64.exe) peuvent persister et faire dire à Steam "déjà en cours d'exécution". Utilisezum win pspour les repérer,um win kill <pid>pour les supprimer. - Ne jamais utiliser
pkill -foutaskkill /IMavec des wildcards. Le motif peut correspondre à votre propre shell ou à d'autres applications. - Après un crash, lisez d'abord le journal du chargeur ou du jeu (la compétence mod-any-game les liste), puis le Visionneuse d'événements Windows (journal Application) pour les crashes natifs.
Linux et macOS
- Linux (X11) :
xdotool search --name "Game" windowactivate --sync key Escape,xdotool mousemove --window $W 640 360 click 1. Captures d'écran :import -window $(xdotool search --name Game) shot.png, ou ffmpegx11grab. - Linux (Wayland) : ydotool +
grim. Les jeux Proton sont des jeux Windows sous Wine : les options de lancement (WINEDLLOVERRIDES,PROTON_LOG=1) vont dans Steam. - macOS :
screencapture -l <windowid> shot.png(identifiant de fenêtre viaGetWindowIDou AppleScript),osascript/cliclickpour l'entrée. L'entrée et l'enregistrement d'écran nécessitent les autorisations d'accessibilité et d'enregistrement d'écran pour le terminal.