Le chronomètre de quêtes pour Black Desert Online.
Rubin mesure le temps que prend chaque quête principale, sans que vous ayez à appuyer sur quoi que ce soit. Vous jouez normalement, il lit l'écran, et il vous dit quelles chaînes de quêtes rapportent le plus de quêtes par heure.
📕 Vous reprenez ce projet ? Lisez ETAT.md en entier avant de coder. Il consigne cinq pièges découverts en conditions réelles, dont aucun n'était visible sur des captures d'écran fixes, et dont chacun suffisait à lui seul pour qu'aucune quête ne soit jamais mesurée.
⚠️ Projet en construction, mais utilisable. Voir État d'avancement. Deux façons de l'installer, sur la page des releases : l'installateur (rubin-installateur-x.y.z.exe), qui pose un raccourci et propose ensuite la mise à jour en un clic depuis la fenêtre elle-même ; ou l'archive (rubin-windows-x.y.z.zip), portable, à décompresser où vous voulez.
Black Desert compte environ 19 000 quêtes, dont 3 924 principales réparties en 349 chaînes. Quand on décide de les faire toutes, une question devient importante : par où commencer ?
Personne n'a la réponse, parce que personne ne l'a mesurée. Les guides classent les quêtes par récompense, jamais par temps. Or une chaîne de 117 quêtes courtes et groupées vaut mieux que vingt quêtes isolées qui obligent à traverser la carte entre chacune, même si les secondes par quête sont comparables.
Rubin mesure ce que personne ne mesure : le débit, en quêtes par heure et par chaîne.
Le jeu affiche un bandeau en bas à droite à chaque changement d'état de quête :
| Bandeau | Couleur | Ce qu'on en fait |
|---|---|---|
Nouvelle quête |
jaune | départ du chronomètre |
Quête accomplie |
cyan | arrêt du chronomètre |
Les deux portent le nom complet de la quête, avec sa région. Rubin surveille cette seule zone, environ 400 × 160 pixels, et ne réveille la reconnaissance de caractères que lorsque les pixels changent. En pratique, quelques dizaines de lectures par heure au lieu de plusieurs milliers.
Aucune interaction avec le jeu. Pas de lecture mémoire, pas d'injection, pas de surcouche, pas de touche simulée. Rubin regarde une capture d'écran, exactement comme un logiciel d'enregistrement vidéo. C'est une limite de conception, pas une étape à franchir plus tard.
Les bandeaux se ratent. Quand on enchaîne vite, un bandeau d'accomplissement peut passer sans être vu. Rubin n'est donc pas un minuteur mais un journal d'événements : il note ce qu'il voit, et reconstruit les durées après coup en indiquant leur qualité.
| Ce qui a été vu | Mesure | Qualité |
|---|---|---|
| les deux bandeaux | accepté → accompli | exacte |
| départ suivant seulement | accepté → accepté suivant | déduite par la chaîne |
| trou de plusieurs positions | aucune | écartée |
La déduction est possible parce que l'identifiant d'une quête est une paire
chaîne/position : voir démarrer 21136/2 implique que 21136/1 vient de
s'achever.
Un nom ne suffit pas à identifier une quête. 705 quêtes principales, soit
18 % d'entre elles, partagent leur nom avec une autre. [Serendia] Boss des Fogans désigne trois quêtes distinctes. Seule la chaîne en cours permet de
trancher, et quand elle ne suffit pas, Rubin renonce à la mesure plutôt que de
l'attribuer au hasard.
Rater une mesure donne un chiffre incomplet. En inventer une donne un chiffre faux. Les deux erreurs ne coûtent pas la même chose, donc les réglages ne sont pas symétriques.
Le référentiel est chargé dans les deux langues, et les deux partagent les mêmes identifiants. Un joueur du client français et un joueur du client anglais lisent des textes différents, aboutissent au même identifiant et alimentent la même ligne de classement. Aucune table de traduction n'est écrite à la main.
| Partie | État |
|---|---|
| Référentiel des quêtes, deux langues | ✅ 18 999 quêtes, jointure FR/EN complète |
| Reconstitution des chaînes | ✅ 267 chaînes sur 349 sans trou de numérotation |
| Capture et lecture des bandeaux | ✅ fonctionne en jeu |
| Rubinmétrage et journal d'événements | ✅ fonctionne en jeu |
| Suivi de quête, pour lever les ambiguïtés de noms | ✅ fonctionne en jeu |
| Identification des quêtes principales | ✅ 100 % |
| Envoi au serveur et classement | ✅ en ligne |
| Exécutable Windows | ✅ publié en release |
| Rétention des lectures ratées | ✅ locale, envoi manuel |
| Rattachement d'un compte Discord | ⏸ écrit, en attente d'identifiants |
| Robot Discord de consultation | ⏸ écrit, en attente d'un jeton de robot |
En ligne :
| Serveur | https://rubin.maxyull.fr |
| Version Windows | https://github.com/Maxyull/rubin-bdo/releases |
Première mesure en conditions réelles, le 5 août 2026 :
5 min 48 s [Calpheon] Discuter avec Enrique
Soit la quête 21139/46, quarante-sixième d'une chaîne de quatre-vingt-quinze.
Cinq défauts ont été trouvés en jouant, et aucun n'était visible sur des captures fixes. Chacun suffisait à lui seul pour qu'aucune quête ne soit jamais mesurée :
- l'icône du bandeau se déplace de 150 pixels selon la longueur du nom, la barre restant ancrée à droite. Elle est cherchée par glissement, jamais à une position fixe ;
- la corrélation plafonne à 0,90 en jeu au lieu de 0,99 sur capture fixe, parce que le bandeau est semi-transparent et que le décor bouge derrière. Le seuil retenu est 0,70 ;
- la reconnaissance avale des espaces, « Ce qui s'est passé » devenant « Cequi s'estpasse ». Les noms sont donc comparés sans espaces ni ponctuation des deux côtés ;
- un bandeau d'objectif porte une ligne de trop, que rien ne distingue de la suite d'un nom long passé à la ligne ;
- le panneau de choix coupe le préfixe de région : « [Carrefour] Du côté de Valks » là où le catalogue porte « [Calpheon][Carrefour] Du côté de Valks ». 76 quêtes principales sont dans ce cas.
En prime, le panneau de suivi n'a aucun fond opaque : de nuit, la luminance de toute la zone tombe à 19 sur 255 et la reconnaissance n'y trouve aucune ligne. Un étirement de contraste avant lecture est obligatoire.
C'est la leçon principale du projet : un jeu de test figé valide la lecture d'une image, pas le comportement d'une interface vivante.
Ouvrir la fenêtre :
python -m rubin fenetreQuatre onglets. Session dit où vous en êtes et ce qui vient. Classement cherche une quête par son nom et liste les plus rapides, au temps médian. Zones montre les trois rectangles que Rubin lit et ce qu'il y lit à l'instant, ce qui répond en une seconde à « pourquoi ça ne mesure rien ». Réglages porte les curseurs, la langue du client et l'opacité.
Le classement se fait par quête et sur la médiane, à partir de trois mesures. Une chaîne moyenne ses quêtes rapides et ses quêtes lentes, or on choisit quête par quête ; et en dessous de trois mesures, la première place irait toujours à une quête mesurée une seule fois par quelqu'un de chanceux. Tant que rien n'atteint le seuil, la fenêtre le dit plutôt que d'afficher un tableau vide.
Deux de ces rectangles ont été mesurés sur un écran réel : le bandeau, en bas à droite, et le panneau de suivi, sous la minimap. Le troisième, le panneau de choix d'un carrefour, est estimé : la moitié centrale de l'écran, faute d'une capture pour le relever. Tracez-le vous-même, avec « Tracer le choix ». Mal placé, il ne coûte aucune durée : il fait seulement perdre les quêtes dont le jeu coupe le préfixe de région, et la branche que vous avez prise.
La fenêtre se pose d'elle-même à côté du panneau de quêtes, jamais dessus. Ce n'est pas une coquetterie : Rubin lit une capture d'écran, donc une fenêtre posée sur une zone de lecture est lue à la place de cette zone. Elle prévient quand vous l'y déplacez, et la transparence n'y change rien puisque c'est le mélange des deux qui est capturé.
Ce n'est pas une surcouche : rien n'est injecté dans le jeu, c'est une fenêtre Windows ordinaire.
Voir l'état du référentiel :
python -m rubin referentielRubinmétrer une session :
python -m rubin suivreAprès chaque quête mesurée, les suivantes de la chaîne s'affichent avec leur temps de référence :
à suivre dans la chaîne 21136 :
2. [Calpheon] Cris stridents des harpies 4 min 12 s (14 mesures)
3. [Calpheon] Coup de main tant désiré 1 min 37 s (1 mesure)
Trois choses n'y sont jamais tues, parce que les taire donnerait une liste qu'on ne peut pas suivre :
- une quête que personne n'a mesurée affiche « jamais mesurée », et non une colonne vide qui se lirait comme « instantané » ;
- un trou de numérotation est annoncé. 82 chaînes sur 349 en portent, et le référentiel connaît 18 999 quêtes quand le jeu en compte 19 235 : une quête peut donc exister à l'écran sans figurer dans cette liste ;
- une branche d'un choix est marquée. 69 quêtes principales sur 38 chaînes sont des embranchements, et vous n'en ferez qu'une partie.
--suivantes 0 supprime l'affichage, --suivantes 10 l'allonge.
Voir les bandeaux que le logiciel n'a pas su lire :
python -m rubin echecsUn bandeau bien visible à l'écran dont rien ne sort est le défaut le plus coûteux du projet : la session ne mesure rien et n'explique pas pourquoi. Ces images sont donc gardées sur votre disque, avec les lignes que la reconnaissance en a tirées. Elles n'en sortent que si vous fabriquez une archive et l'envoyez vous-même :
python -m rubin echecs --archiverL'archive ne contient que des vignettes de texte de quête en niveaux de gris,
349 × 115 pixels pour le bandeau. Ni le nom du personnage, ni le chat, ni la
carte. Vous pouvez l'ouvrir avant de décider quoi que ce soit. Sa taille est
bornée par celle qu'accepte la destination visée, --vers github par défaut.
Le catalogue des quêtes provient de BDO Codex. Ces données appartiennent à Pearl Abyss ; Rubin les télécharge chez vous au premier lancement et ne les redistribue pas.
Black Desert Online est une marque de Pearl Abyss. Ce projet n'est ni affilié à Pearl Abyss, ni approuvé par eux.
| Fichier | Ce qu'il contient |
|---|---|
| CHANGELOG.md | ce qui a changé, version par version |
| docs/ou-va-le-projet.md | où va le projet, dans quel ordre, et les pièges déjà repérés sur la route |
| docs/versionnage.md | les trois choses qui versionnent séparément, et pourquoi les confondre serait une erreur |
| CONTRIBUTING.md | langue du projet, politique de tests, ce que Rubin ne fera jamais |
| serveur/README.md | le serveur de classement, son interface et son déploiement |
| bot/README.md | le robot Discord de consultation, et ce qu'il reste à créer à la main |
Rubin est gratuit et le restera. Pas de version payante, pas de publicité, et rien n'est envoyé sans qu'on le demande (voir Confidentialité).
Si le chronomètre vous fait gagner du temps et que vous voulez donner un coup de pouce, c'est ici, et c'est entièrement facultatif :
MIT, voir LICENSE.
Ce logiciel n'envoie rien sans qu'on le lui demande, et ne transmet jamais de pseudonyme, de position, de discussion, de capture d'écran ni d'horaire de jeu. Le détail de ce qui part et de ce qui ne part pas est publié dans la politique de confidentialité.
Cela vaut aussi pour les lectures ratées gardées par rubin echecs. Elles
restent sur votre disque, s'effacent d'elles-mêmes au bout de quatre-vingt-dix
jours, et aucune requête réseau ne les concerne. Les envoyer est un geste
manuel, entièrement le vôtre, sur un fichier que vous pouvez ouvrir d'abord.
Cela vaut enfin pour le robot Discord de bot/, qui ne fait que lire le
classement public et n'affiche aujourd'hui aucun pseudonyme. Le jour où une
commande en afficherait un, la politique de confidentialité devrait être mise à
jour d'abord : elle promet en l'état qu'aucun pseudonyme n'est transmis.
Le code de ce projet est écrit et relu par Maxime Lacoste, seul mainteneur. Il est publié sur github.com/Maxyull/rubin-bdo, sous licence MIT, sans composant propriétaire ni double licence commerciale.
Les versions publiées sont construites par empaquetage/construire.py à partir
de l'état du dépôt, et l'empreinte SHA-256 de chaque fichier (archive comme
installateur) est publiée à côté de lui.
La signature de code est demandée à la SignPath Foundation, qui l'offre gratuitement aux projets libres. La demande a été envoyée le 05/08/2026, son issue est encore inconnue. Tant qu'elle n'a pas abouti, ce qui suit s'applique.
Vérifier un fichier téléchargé (le nom porte la version, par exemple
rubin-installateur-0.5.5.exe ou rubin-windows-0.5.5.zip) :
Get-FileHash rubin-installateur-0.5.5.exe -Algorithm SHA256et comparer au fichier .sha256 publié à côté. C'est la même vérification
que fait autoupdate.py tout seul avant de lancer une mise à jour reçue
depuis la fenêtre.
