Skip to content

Releases: GregoireF/dd-toolkit

Release list

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 16:45

[0.2.0] - 2026-07-16

Added

  • AbilityWheelModule.DiagnoseSlots : nouvelle touche DiagnosticKey
    (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
    dans tests/vendor/) — 96 tests couvrant toute la logique des 6
    modules et de Common.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 comme Hotkey() 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ète tests/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
    (UseVsync dans UDKEngine.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.

    SetTimer avec 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églage IntervalMs n'avait jamais d'effet
    réel sur la vitesse de clic.
    Le code appelait SetKeyDelay(...), qui
    ne régit que les touches clavier envoyées par Send/SendEvent —
    aucun effet sur les boutons de souris (LButton/RButton), qui
    dépendent de SetMouseDelay (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 avec SetTimer(ObjBindMethod(this, "PressAbility"), ...), et Panic() tentait de le désarmer avec
    SetTimer(ObjBindMethod(this, "PressAbility"), 0) — mais
    ObjBindMethod() crée un nouvel objet à chaque appel, et SetTimer
    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" pour SetTimer, donc l'appel de désarmement de Panic()
    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
    PressAbility une seule fois (BoundPressAbility, dans Init()) 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
    (\s matche 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.LooksLikeGameFolder retournait 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

Choose a tag to compare

@github-actions github-actions released this 16 Jul 00:29

[0.1.0] - 2026-07-16

Added

  • src/Setup.ahk dé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 via tests/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 vrai UDKEngine.ini
    d'une installation Steam de Dungeon Defenders trouvée sur la machine de
    travail (jamais l'original) — la section [TextureStreaming] et les
    quatre lignes PoolSize* 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 modifiant UDKGame\Config\UDKEngine.ini
    (PoolSize/PoolSizeLow/PoolSizeMedium/PoolSizeHigh). Sauvegarde
    horodatée systématique avant écriture ; recherche-et-remplace des
    lignes existantes plutôt qu'IniWrite vers une section devinée ;
    abandon propre sans écriture si aucune ligne correspondante n'est
    trouvée. Voir docs/CORRECTIFS-JEU.md pour 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.ahk ré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
    dans settings.ini puis relance (Reload()) au lieu d'exiger l'édition
    manuelle du fichier ini. Pensée pour un utilisateur qui ne connaît rien
    à AutoHotkey — voir docs/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 de DDToolkit.ahk sans
    collision de noms. Les 4 scripts standalone (AutoAbility.ahk, etc.)
    deviennent de fins wrappers autour de leur module.
  • DD.Write() / DD.WriteBool() dans Common.ahk (écriture ini,
    utilisées par la fenêtre de réglages).
  • Enabled=true par section dans settings.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 :
    assigner this.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 de SettingsWindow sont maintenant déclarées
    explicitement) ; IniWrite prend (Valeur, Fichier, Section, Clé),
    ordre différent d'IniRead.

Security

  • release.yml : ${{ inputs.tag }} (texte libre du déclenchement
    manuel workflow_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 par env: TAG_NAME et 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.ps1 et scripts/Install-Hooks.ps1 ne 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.ps1 affichait "OK" même quand git config
    échouait (pas dans un repo git, etc.) : une commande externe qui échoue
    ne déclenche pas $ErrorActionPreference = "Stop", il faut vérifier
    $LASTEXITCODE explicitement. 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 .exe et distribuée seule
    : DD.ConfigPath
    pointait uniquement vers ..\config\settings.ini (disposition du repo en
    dev), un chemin qui n'existe pas pour un .exe téléchargé isolément
    depuis une Release GitHub — AbilityWheel.ahk.exe se serait chargé sans
    erreur mais avec zéro spin enregistré. DD.ConfigPath cherche
    maintenant settings.ini dans son propre dossier en premier (voir
    DD.ResolveConfigPath()), et build/Build-All.ps1 copie
    config/settings.ini dans dist/ 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'un try/catch par entrée
    de couleur dans AbilityWheel.ahk.
  • release.yml publie maintenant aussi un zip combiné
    dd-toolkit-vX.Y.Z.zip (tous les .exe + settings.ini), en plus des
    .exe isolés, pour un téléchargement unique prêt à l'emploi.
  • AbilityWheel.ahk : nettoyage de WinGetPos (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 : scripts test/build en alias des scripts PowerShell
    correspondants, pour npm test / npm run build.

Added

  • src/AutoClicker.ahk : remplace le repo de référence Azazel131's 10 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 via settings.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 de Auto 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...
Read more