Repository navigation
Releases: GregoireF/dd-toolkit
Releases · GregoireF/dd-toolkit
Release list
v0.2.0
[0.2.0] - 2026-07-16
Added
AbilityWheelModule.DiagnoseSlots: nouvelle toucheDiagnosticKey
(Ctrl+Alt+D par défaut, en jeu) qui ouvre la roue et rapporte la
vraie couleur lue dans chacune des 3 cases (fenêtre + fichier
wheel-diagnostic.txt), qu'elle corresponde ou non à une couleur
connue — pour diagnostiquer "le spin ne se déclenche pas" avec des
données concrètes plutôt qu'un silence. Voir README.md.- Suite de tests unitaires réels (
tests/Run-UnitTests.ps1, framework
AutoHotUnit vendorisé en MIT
danstests/vendor/) — 96 tests couvrant toute la logique des 6
modules et deCommon.ahk,Init()de chaque module compris (config +
enregistrement de hotkeys réels), sans exception : chaque fonction qui
parle à l'OS (Send,SendEvent,GetKeyState,PixelSearch,
PixelGetColor,WinExist,WinGetPos,SetTimer,SetKeyDelay,
SetMouseDelay,Hotkey,HotIfWinActive,DirSelect,MsgBox,
RegRead) est remplacée par un double de test (tests/Shims.ahk) —
AutoHotkey v2 permet à une fonction utilisateur de même nom de
remplacer un built-in pour le reste du script (vérifié empiriquement).
Résultat : les méthodes qui envoient réellement une touche/clic
(PressAbility,Stack,FireChargedShot,
TurboFire,SpinWheel...) tournent pour de vrai en test, mais
l'entrée synthétique n'atteint jamais l'OS ; et commeHotkey()lui-même
est simulé, aucun test n'enregistre non plus de vrai raccourci auprès
de Windows — les noms de touches utilisés dans les fixtures de test
n'ont donc plus besoin d'être "obscurs" pour rester sans risque. Aucun
risque de clic/frappe simulé sur le vrai bureau, même en poussant la
couverture à 100%. Complètetests/Test-Syntax.ps1(qui prouve
seulement qu'un script charge) avec de vraies assertions ; intégré à
ci.yml. GameTweaksModule.ApplyVsyncFix: bascule optionnelle de la V-Sync
(UseVsyncdansUDKEngine.ini) — supprime le tearing d'écran au prix
d'un peu de latence, donc une case à cocher plutôt qu'un correctif
automatique comme les textures. Voir docs/CORRECTIFS-JEU.md pour la
source. Disponible dans l'onglet "Correctifs jeu" de DDToolkit et dans
GameTweaks.ahk.GameTweaksModule.ApplyPerformanceFix: bascule optionnelle d'un lot de
9 réglages performance (DetailMode,GraphicsQualityMode,
ombres dynamiques, ambient occlusion, bloom haute qualité, LOD) dans
UDKEngine.ini, sourcé et vérifié contre une vraie installation. Voir
docs/CORRECTIFS-JEU.md.
Changed
- Aucun réglage par défaut n'utilise plus la rangée F (F1-F12).
Certains joueurs réservent cette rangée à un outil séparé qui bascule
le focus entre plusieurs clients/personnages simultanés — nos valeurs
par défaut ne doivent pas entrer en compétition avec ça.
AutoAbility.ToggleKey(F2→ScrollLock),AutoAbility.PanicKey
(F3→Pause),AutoClicker.RightToggleKey(F6→Insert). Les
fixtures de test suivent la même logique.
Fixed
AutoAbilityModule: armer la boucle ne pressait la touche qu'après
le premier intervalle complet (47s par défaut), jamais immédiatement.
SetTimeravec une période positive ne se déclenche jamais tout seul
à l'instant où il est armé — le premier passage n'arrive qu'une fois
l'intervalle entier écoulé (confirmé dans la doc AutoHotkey). Avec le
défaut de 47s, armer la macro voulait dire "bip, puis rien pendant
47 secondes" — largement de quoi croire que "ça ne marche pas" pour
qui teste pendant quelques secondes.Toggle()presse maintenant la
touche une fois immédiatement en plus d'armer le minuteur répétitif.AutoClickerModule: le réglageIntervalMsn'avait jamais d'effet
réel sur la vitesse de clic. Le code appelaitSetKeyDelay(...), qui
ne régit que les touches clavier envoyées parSend/SendEvent—
aucun effet sur les boutons de souris (LButton/RButton), qui
dépendent deSetMouseDelay(confirmé dans la doc AutoHotkey). Ce
module n'envoie jamais que des boutons de souris, donc l'appel
SetKeyDelayétait un no-op silencieux depuis le début — remplacé par
SetMouseDelay(this.IntervalMs).AutoAbilityModule: la touche panique ne stoppait pas réellement le
minuteur, en production depuis la v0.1.0.
Toggle()armait le minuteur avecSetTimer(ObjBindMethod(this, "PressAbility"), ...), etPanic()tentait de le désarmer avec
SetTimer(ObjBindMethod(this, "PressAbility"), 0)— mais
ObjBindMethod()crée un nouvel objet à chaque appel, etSetTimer
identifie "quel minuteur" désarmer uniquement par référence de callback.
Deux liaisons distinctes de la même méthode ne sont jamais "le même
minuteur" pourSetTimer, donc l'appel de désarmement dePanic()
n'avait tout simplement aucun effet sur le minuteur réellement actif :
le raccourci "arrêt d'urgence" mettait à jour l'affichage ("au repos")
et jouait le bip d'arrêt, tout en laissant la macro continuer à
presser la touche configurée indéfiniment. Trouvé et vérifié
empiriquement en écrivant les tests ci-dessus (un vrai minuteur de
20ms continuait de se déclencher des centaines de ms après son
"désarmement"), pas par relecture manuelle. Corrigé en liant
PressAbilityune seule fois (BoundPressAbility, dansInit()) et
en réutilisant cette même référence pour armer et désarmer ; épinglé
par un test de non-régression qui compare les deux callbacks par
pointeur d'objet (ObjPtr).GameTweaksModule.ComputeFixedContent(le correctif textures, en
production depuis la v0.1.0) : le pattern regex\s*$était assez
gourmand pour manger le saut de ligne de la ligne modifiée elle-même
(\smatche aussi\n), transformant silencieusement sa fin de ligne
CRLF en LF. Inoffensif pour la lecture du fichier par le jeu, mais un
vrai bug de correction — remplacé par une lookahead(?=\r?$), qui
vérifie la fin de ligne sans la consommer. Détecté et corrigé en
écrivant les tests unitaires ci-dessus (voir leur test de non-régression
CRLF), pas en jeu.GameTweaksModule.LooksLikeGameFolderretournait la valeur brute de
DirExist(ex."D") plutôt qu'un booléen strict — sans impact en
production (!s'en accommode) mais un contrat fragile, resserré en
!!DirExist(...).
v0.1.0
[0.1.0] - 2026-07-16
Added
src/Setup.ahkdétecte l'absence d'AutoHotkey v2 et propose (bouton
explicite, jamais automatique sans clic) de le télécharger et
l'installer silencieusement (/silent, compte utilisateur, pas besoin
d'admin) depuis la source officielle GitHub. Testé pour de vrai : le
téléchargement binaire (WinHttpRequest + ADODB.Stream) a été vérifié
octet pour octet contre la taille réelle de l'installeur officiel.
Testé pour de vrai (première fois cette session — pas juste une revue statique)
- AutoHotkey v2 (portable, officiel) a pu être installé temporairement
dans l'environnement de travail. Les 8 scripts (src/*.ahk) ont été
chargés avec un vrai interpréteur AutoHotkey viatests/Test-Syntax.ps1
— tous OK. DDToolkit.ahk: la fenêtre de réglages a été réellement ouverte et
capturée en image — onglets, valeurs pré-remplies (dont le contrôle
Hotkey qui traduit correctement "CapsLock" en "VERR.MAJ" pour
l'affichage français), aucun chevauchement. Un incident est survenu
pendant ce test : un clic simulé mal calculé a atterri sur une autre
fenêtre déjà ouverte (pas d'impact, immédiatement stoppé et nettoyé) —
plus aucune simulation de clic/frappe n'est faite dans cet
environnement sans confirmation explicite.GameTweaksModule: testé sur une copie du vraiUDKEngine.ini
d'une installation Steam de Dungeon Defenders trouvée sur la machine de
travail (jamais l'original) — la section[TextureStreaming]et les
quatre lignesPoolSize*ont été trouvées et corrigées exactement comme
prévu, sans toucher àCommonAudioPoolSize(faux positif potentiel
écarté). La détection automatique du dossier d'installation (voir
ci-dessous) a aussi été testée en conditions réelles avec succès.
Added (recherche de juillet 2026 : voir README § Idées explorées)
src/ChargeShot.ahk+ChargeShotModule: maintient le bouton d'attaque
une durée configurable puis le relâche automatiquement, pour un tir
chargé reproductible (les bâtons d'Apprentice bénéficient d'une charge
partielle, ~70% cité comme repère par le wiki DD). Seule des 4 macros
candidates (guide Steam d'automatisation DD) à avoir été retenue après
recherche — Minion Line Placement, Aura/Trap Stacking et Upgrade
Automation ont été explicitement écartées avec justification sourcée
(README § Idées explorées, délibérément pas retenues).src/GameTweaks.ahk+GameTweaksModule: corrige les textures floues
connues de Redux en modifiantUDKGame\Config\UDKEngine.ini
(PoolSize/PoolSizeLow/PoolSizeMedium/PoolSizeHigh). Sauvegarde
horodatée systématique avant écriture ; recherche-et-remplace des
lignes existantes plutôt qu'IniWritevers une section devinée ;
abandon propre sans écriture si aucune ligne correspondante n'est
trouvée. Voirdocs/CORRECTIFS-JEU.mdpour les sources et ce qui n'est
délibérément pas automatisé (option de lancement Steam
-nolauncher).GameTweaksModule.AutoDetectInstallPath(): trouve le dossier
d'installation du jeu tout seul via le registre Steam
(HKCU\Software\Valve\Steam) + sa bibliothèque par défaut, sans aucune
saisie utilisateur si le jeu y est installé. Ne demande de choisir le
dossier (DirSelect) qu'en dernier recours, si l'auto-détection ne
trouve rien (bibliothèque Steam secondaire, copie non-Steam...).src/Setup.ahk: installeur optionnel (raccourci Bureau, entrée de
démarrage Windows facultative) — aucune modification du registre,
aucun service, désinstallable en supprimant le raccourci.docs/CORRECTIFS-JEU.md: correctifs connus du jeu, sourcés.- Fenêtre de réglages de
DDToolkit.ahkréorganisée en onglets (Tab3)
au lieu d'un long formulaire vertical — un onglet par macro/outil.
Added
src/DDToolkit.ahk: appli unifiée regroupant les 4 macros dans un
seul processus — icône en zone de notification, menu (Réglages /
Recharger / Quitter), et une fenêtre de réglages (Gui()) qui écrit
danssettings.inipuis relance (Reload()) au lieu d'exiger l'édition
manuelle du fichier ini. Pensée pour un utilisateur qui ne connaît rien
à AutoHotkey — voirdocs/DEMARRAGE.md.src/Lib/Modules/*Module.ahk: logique des 4 macros extraite en
classes réutilisables (état en propriétés statiques, pas en globales)
pour pouvoir coexister dans le process unique deDDToolkit.ahksans
collision de noms. Les 4 scripts standalone (AutoAbility.ahk, etc.)
deviennent de fins wrappers autour de leur module.DD.Write()/DD.WriteBool()dansCommon.ahk(écriture ini,
utilisées par la fenêtre de réglages).Enabled=truepar section danssettings.ini: chaque macro peut être
coupée entièrement (aucun hotkey enregistré) sans supprimer ses réglages.docs/DEMARRAGE.md: guide d'installation zéro-prérequis (SmartScreen,
antivirus, zone de notification, tout en français simple).templates/NewMacroModule.ahk.example: gabarit module, en plus du
wrapper existant, pour suivre le nouveau pattern module+wrapper.
Fixed (trouvé en vérifiant chaque API avant de l'utiliser)
- Toutes les API AHK v2 nouvellement utilisées pour
DDToolkit.ahk
(Gui(),A_TrayMenu,IniWrite,Persistent(),HotIf()générique
avec callback compound) ont été vérifiées via la documentation avant
d'être écrites, faute de pouvoir exécuter AutoHotkey dans cet
environnement. Deux erreurs ont été attrapées avant d'être commises :
assignerthis.x := valeurà une propriété non déclarée dans une
méthode statique n'est pas garanti créer une vraie propriété statique
(toutes les propriétés deSettingsWindowsont maintenant déclarées
explicitement) ;IniWriteprend(Valeur, Fichier, Section, Clé),
ordre différent d'IniRead.
Security
release.yml:${{ inputs.tag }}(texte libre du déclenchement
manuelworkflow_dispatch) était interpolé directement dans deux blocs
run:PowerShell — le vecteur d'injection de script classique des
workflows GitHub Actions. Corrigé en passant la valeur parenv: TAG_NAMEet en la relisant via$env:TAG_NAME, qui la traite comme
donnée plutôt que comme texte de script. Les SHA de commit
(github.event.pull_request.*.sha) restent interpolés directement dans
commitlint.yml: ce sont des identifiants calculés par GitHub, pas du
texte libre attaquable.
Fixed
tests/Test-Syntax.ps1etscripts/Install-Hooks.ps1ne s'exécutaient
pas du tout sous Windows PowerShell 5.1 (powershell.exe, le shell par
défaut de la plupart des machines Windows) : un tiret cadratin dans une
chaîne de caractères réelle (pas un commentaire) se fait mal décoder par
PS 5.1 sur un fichier sans BOM, produisant un octet qui ressemble à un
guillemet Unicode — que le parser PowerShell traite comme un vrai
délimiteur de chaîne, cassant le script ("Le terminateur " est
manquant"). Confirmé en exécutant réellement les scripts (pas seulement
en les parsant). Remplacé par des tirets ASCII simples ; les tirets
cadratins dans des blocs de commentaires (Bump-Version.ps1,
Build-All.ps1) ne posent pas ce problème et restent inchangés.scripts/Install-Hooks.ps1affichait "OK" même quandgit config
échouait (pas dans un repo git, etc.) : une commande externe qui échoue
ne déclenche pas$ErrorActionPreference = "Stop", il faut vérifier
$LASTEXITCODEexplicitement. Testé en conditions réelles (repo git
valide + hors repo git) après correction.- Distribution cassée pour
AbilityWheel.ahk(et en théorie tous les
scripts) une fois compilée en.exeet distribuée seule :DD.ConfigPath
pointait uniquement vers..\config\settings.ini(disposition du repo en
dev), un chemin qui n'existe pas pour un.exetéléchargé isolément
depuis une Release GitHub —AbilityWheel.ahk.exese serait chargé sans
erreur mais avec zéro spin enregistré.DD.ConfigPathcherche
maintenantsettings.inidans son propre dossier en premier (voir
DD.ResolveConfigPath()), etbuild/Build-All.ps1copie
config/settings.inidansdist/pour que ce cas marche par défaut. - Une valeur non numérique ou mal cochée dans
settings.ini
(IntervalMs,ToleranceRGB,ScopeToGame, une couleur hex invalide
dans[AbilityWheelColors]...) faisait planter tout le script au
chargement au lieu de retomber sur la valeur par défaut. Ajout de
DD.ReadInt()/DD.ReadBool()(notifient et utilisent le fallback au
lieu de lever une exception non gérée) et d'untry/catchpar entrée
de couleur dansAbilityWheel.ahk. release.ymlpublie maintenant aussi un zip combiné
dd-toolkit-vX.Y.Z.zip(tous les.exe+settings.ini), en plus des
.exeisolés, pour un téléchargement unique prêt à l'emploi.AbilityWheel.ahk: nettoyage deWinGetPos(X/Y jamais utilisés,
paramètres omis au lieu de variables mortes).tests/Test-Syntax.ps1: délai de smoke-test relevé à 2,5s (marge contre
la lenteur/charge variable des runners CI).package.json: scriptstest/builden alias des scripts PowerShell
correspondants, pournpm test/npm run build.
Added
src/AutoClicker.ahk: remplace le repo de référence Azazel131's10 CPS Left.ahk/10 CPS Right.ahk(deux fichiers quasi-dupliqués, un par
bouton, délai codé en dur malgré le nom "10 CPS" alors qu'ils tournent en
réalité à ~50 clics/s). Un seul script, intervalle et touches de toggle
configurables viasettings.ini, scoping fenêtre activé par défaut
(ScopeToGame, désactivable pour retrouver le comportement système
d'origine).src/AbilityWheel.ahk: réécriture complète deAuto Wheel.ahk(roue
Jester / Wheel of Fortune), qui était en AutoHotkey v1 alors que le
reste du repo de référence exige v2. Port v2 comp...