From be12f8dcd5fd4e767da292f87e8bb3ab25a23b9d Mon Sep 17 00:00:00 2001 From: aeon0 Date: Mon, 22 Nov 2021 20:10:30 +0100 Subject: [PATCH] Add additional debug options to color checker (#83) --- README.md | 6 ++--- assets/docs/color_checker.png | Bin 952173 -> 0 bytes assets/docs/graphic_debugger.png | Bin 0 -> 3171456 bytes params.ini | 2 +- src/config.py | 2 +- src/run.py | 8 +++---- .../{color_checker.py => graphic_debugger.py} | 21 ++++++++++++++++-- 7 files changed, 28 insertions(+), 11 deletions(-) delete mode 100644 assets/docs/color_checker.png create mode 100644 assets/docs/graphic_debugger.png rename src/utils/{color_checker.py => graphic_debugger.py} (54%) diff --git a/README.md b/README.md index 29eec6d..2890790 100644 --- a/README.md +++ b/README.md @@ -31,8 +31,8 @@ Download the a prebuilt release [here](https://github.com/aeon0/botty/releases). ## Color Test Mode -To check if you graphic settings are good and if the bot would pick up items there is a **Color Test Mode** built in. Start botty and press F10 (Default key). This will open up a (mostly black) window. Start a game in D2R and throw some items of different type on the ground. If you now bring forward the debug window all items should show up with their names while the background is black. If you throw an item on the ground that should be picked up, it will have a red circle.
- +To check if you graphic settings are good and if the bot would pick up items there is a **Graphic Debugger Mode** built in. Start botty and press F10 (Default key). This will open up a (mostly black) window. Start a game in D2R and go to A5. You should see some templates with blue circles detected and scores printed out to the console. E.g. for 720p you should see scores higher 0.8 for the templates. To check item finding, throw some items of different types on the ground. The debug window should show the item names with black background. If you throw an item on the ground that should be picked up, it will have a red circle. The console will print out the scores for each item that would be picked up. Scores should be well above 0.9 for these items.
+ ## Development Check out the [development.md](development.md) docu for infos on how to build from source and details of the project structure and code. @@ -60,7 +60,7 @@ min_game_length_s | Games must have at least this length, will wait in hero sele max_game_length_s | Botty will attempt to stop whatever its doing and try to restart a new game. Note if this fails, botty will attempt to shut down D2R and Bnet exit_key | Pressing this key (anywhere), will force botty to shut down resume_key | After starting the exe botty will wait for this keypress to atually start botting away -color_checker_key | Pressing this key will start a debug mode to check if the color filtering works with your settings. It also includes the item search and marks items it would pick up with red circles +graphic_debugger_key | Pressing this key will start a debug mode to check if the color filtering works with your settings. It also includes the item search and marks items it would pick up with red circles logger_lvl | Can be any of [info, debug] and determines how much output you see on the command line randomize_runs | If 0, the order will always be pindle -> eldritch/shenk. If 1 the order will be random. difficulty | Set to `normal` `nightmare` or `hell` for game difficulty diff --git a/assets/docs/color_checker.png b/assets/docs/color_checker.png deleted file mode 100644 index b14fbb68088ef8c724aa49fe3f283551a4e838d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 952173 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