Crash Doctor 2.1.0.0 — neuf nouvelles protections
Neuf nouvelles protections, un compteur honnête de plantages évités, l'analyse des dumps et notre propre pile d'appels détaillée dans le rapport. Une seule installation pour Bannerlord 1.2 / 1.3.15 / 1.4.x.
En bref
- Neuf nouvelles protections, d'un changement de jour qui bute sur un objet d'une campagne précédente à une exécution sans bourreau en 1.5+
- Correction de notre propre bug en 1.2.10 : le Doctor cassait le calcul des soldes et le comptait en « plantages évités »
- Rapport : notre propre pile d'appels détaillée et l'analyse des plantages natifs à partir du dump
- L'onglet Mods analyse en arrière-plan et signale les problèmes avant le lancement
Déjà sur le Steam Workshop : la mise à jour est automatique. RickLauncher l’installe tout seul. Tout le travail fait depuis le 29 août en une seule version. Bannerlord 1.2 / 1.3.15 / 1.4.x : une seule installation pour toutes les versions.
⚠️ D’abord, notre propre bug
Sur Bannerlord 1.2.10, c’est le Doctor lui-même qui cassait le calcul des soldes. Une protection installée dans le menu principal exécutait trop tôt un morceau de code du jeu : le jeu mémorisait l’échec pour de bon, et les soldes de tous les groupes valaient zéro jusqu’au redémarrage. Pendant ce temps, le mod comptait les conséquences comme 94 332 « plantages évités ». Une 1.2.10 propre, avec seulement Harmony et le Doctor ; sans le Doctor, tout allait bien.
Corrigé au niveau de la conception même du mod : les protections ne s’installent plus du tout aussi tôt, et un test dédié y veille. Un tel échec est désormais signalé une seule fois et en termes honnêtes : pas « plantage évité », mais ce qui est cassé et jusqu’à quand.
Deux autres correctifs dans le même sens : la protection du menu de rencontre ne tourne plus en boucle (un journal comptait 3 223 déclenchements en deux minutes, chacun compté comme un sauvetage ; les répétitions sont maintenant reconnues et signalées une seule fois), et deux protections qui avalaient n’importe quelle erreur ne revendiquent plus un plantage évité que pour la leur.
🛡 Neuf nouvelles protections
Activées par défaut, chacune avec son propre interrupteur dans l’onglet Crash Fixes.
- Changement de jour sur un objet dont la catégorie vient d’une campagne précédente. Une fois par jour, le jeu vend les marchandises des marchés et cherche la catégorie de chaque objet dans la table de la demande, sans vérifier que la ligne existe. Un seul type d’objet n’a pas de ligne : ceux qu’un mod a gardés de la campagne précédente dans la même session de jeu. Le conseil qui règle toute cette catégorie de problèmes : redémarrez le jeu avant de charger une sauvegarde.
- Première vague de renforts quand un mod a ajouté une équipe après le début de la bataille. Les plans de déploiement sont construits une seule fois au début et consultés en direct à chaque vague : une équipe arrivée en retard n’a pas de plan, et le jeu plante dessus à chaque tick. La protection construit le plan comme le jeu lui-même le ferait.
- Icône de bannière au-dessus de troupes partageant une bannière. Le jeu cherche le matériau en cache avec une texture mais l’enregistre sous une autre ; un groupe avec une bannière commune (lors du déploiement de siège, par exemple) faisait planter le tick.
- Un marchand qui envoie une caravane : une régression du jeu lui-même depuis la mise à jour navale. Quatre valeurs sont lues sans la moindre vérification. Le plantage revenait une minute après chaque chargement, parce que le même marchand se présente tous les jours.
- Colonie sans clan propriétaire. Une colonie ajoutée au jeu après la création de la sauvegarde reste sans propriétaire pour toujours, avec sa milice, qui faisait planter la carte à chaque tick. La protection n’attribue pas de propriétaire : cela changerait le seigneur d’une ville en pleine campagne.
- Exécution sans bourreau (Bannerlord 1.5+). La marque « exécuté, bourreau inconnu » est laissée par un mod qui exécute des héros sans nommer le bourreau ; le système de vendetta lit le clan du bourreau sans vérification : plantage quelques secondes après chaque chargement.
- Naissance d’un enfant dont le parent n’a pas de données d’apparence. L’ancienne protection donnait une valeur au premier qui la lisait et laissait l’objet cassé : le plantage se déplaçait deux lignes plus bas, et revenir à une ancienne sauvegarde n’y changeait rien. La nouvelle répare toute la famille.
- Début de siège : un effectif dont le compteur liste des troupes alors que la liste est vide. Laissé par un mod qui modifie les effectifs en contournant l’API. Le compteur est recalculé à partir des vraies entrées, comme au chargement d’une sauvegarde.
- Une texture de bannière qui arrive sur une armure détruite avec son porteur. Rien ne permet d’annuler le rendu de bannière en arrière-plan à la fin d’une bataille, et le premier appel sur un modèle mort est une violation d’accès mémoire que personne ne peut intercepter. La protection n’applique plus la texture une fois la bataille terminée et intercepte la variante « en pleine bataille » (un mod a rhabillé un soldat à son apparition).
📄 Rapport de plantage
- Notre propre pile d’appels détaillée : pour chaque frame, la position dans la méthode, l’appel le plus proche et les auteurs de chaque patch sur cette méthode. C’est ce qui permet de distinguer deux exceptions identiques dans une même méthode. Un collecteur de rapports tiers n’est plus nécessaire.
- Les plantages natifs sont lus à partir du dump : un verdict selon la bibliothèque qui a planté, qu’il s’agisse du pilote graphique, d’un overlay (Steam / Discord / RTSS / Nahimic), du moteur audio ou d’une DLL native d’un mod. Au passage, nous avons compris pourquoi cela ne fonctionnait pas avant : le mod supprimait lui-même le dump sans le lire.
- Les dossiers de plantage sont associés à l’entrée du mod quel que soit le fuseau horaire : le moteur les nomme en UTC, et en dehors de UTC+0 l’entrée contenant la pile d’appels ne se rattachait pas au dossier.
- La liste des modules donne les identifiants des mods, pas les noms de dossiers ; le rapport liste les paires de mods que leurs auteurs ont déclarées incompatibles ; les troupes dont les données n’ont pas pu être chargées indiquent le mod coupable.
🔎 Onglet Mods
- Analyse en arrière-plan avec une barre de progression et mémorise le résultat jusqu’à ce que les fichiers changent (avant, le jeu restait figé pendant toute l’analyse).
- Les manifestes sont lus de la même façon que le jeu les lit, et la vérification des fichiers par hash à partir de la base de compatibilité fonctionne enfin.
- Signalé avant le lancement : un module présent deux fois dans l’ordre de chargement (le jeu meurt avant le menu), un manifeste que le jeu ne lira pas, une traduction placée au-dessus de son mod, et un souhait de l’auteur sur l’ordre de chargement que l’ordre actuel contredit.
- Le jeu n’est plus accusé de ne pas avoir ses propres DLL PlayStation et Game Pass.
🧰 Interface et détails
- Le bouton du cache des shaders ne touche que le cache généré, jamais les fichiers du jeu ou des mods. Le conseil du diagnostic qui vous disait de les supprimer a été réécrit.
- Un correctif qui attend une session de jeu s’affiche comme « Deferred », et non « Not needed ».
- Les textes longs (analyse des sauvegardes, détails d’un réglage) défilent au lieu de rétrécir jusqu’à devenir illisibles.
- L’onglet Prevented regroupe les répétitions sur une seule ligne et change de langue avec le jeu.
- La fenêtre What’s New apparaît dès que le menu est construit.
- Correction des chaînes françaises qui retombaient silencieusement sur l’anglais.
Un plantage ? Cliquez sur « Open folder » sur la carte et envoyez les deux fichiers : report.txt et crashdoctor_at_crash.log.
