Skip to content

Repository files navigation

Rubin

CI Dernière release Licence MIT Python 3.10 à 3.12 Discord

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.


Pourquoi ce projet existe

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.

Comment ça marche

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.

Ce qui rend la mesure difficile

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.

Français et anglais

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.

État d'avancement

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

⚠️ Le classement ne contient pour l'instant que 11 mesures, d'un seul joueur, sur une seule chaîne. Ce sont des mesures, pas encore des références : une médiane calculée sur un échantillon est un chiffre, pas une observation. Cela se comble en jouant, pas en programmant.

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 :

  1. 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 ;
  2. 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 ;
  3. 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 ;
  4. un bandeau d'objectif porte une ligne de trop, que rien ne distingue de la suite d'un nom long passé à la ligne ;
  5. 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 fenetre

Quatre 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 referentiel

Rubinmétrer une session :

python -m rubin suivre

⚠️ Laissez le jeu au premier plan. Rubin lit l'écran, pas la mémoire du jeu, donc toute fenêtre posée par-dessus est lue à sa place. Basculer sur un navigateur pendant une session ne produit aucune mesure. C'est une limite de la méthode, pas un réglage : voir la section « Ce qui rend la mesure difficile ».

Aprè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 echecs

Un 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 --archiver

L'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.

Sources des données

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.

Documentation

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

Soutenir

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 :

Soutenir Rubin sur PayPal

Licence

MIT, voir LICENSE.

Confidentialité

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.

Politique de signature

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.

⚠️ L'exécutable n'est pas encore signé. Windows et certains antivirus peuvent donc l'annoncer comme provenant d'un éditeur inconnu, ce qui est un faux positif courant des programmes Python empaquetés. Deux précautions sont prises en attendant : le programme n'est pas compressé par UPX, et il est distribué en dossier plutôt qu'en fichier auto-extractible, deux traits que les antivirus associent aux logiciels malveillants.

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 SHA256

et 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.

About

Chronometre de quetes pour Black Desert Online, pense pour le client francais

Resources

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages