From 4e10dbb2c7666dd374602b740aa81e1d0aa95092 Mon Sep 17 00:00:00 2001 From: Legit <96157236+D2RLegit@users.noreply.github.com> Date: Thu, 23 Jun 2022 13:49:45 -0500 Subject: [PATCH 1/4] Updated staves and nip errors (#932) Corrected white staves and other syntax errors. --- config/default.nip | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/config/default.nip b/config/default.nip index 0ec4b0a..499ab8b 100644 --- a/config/default.nip +++ b/config/default.nip @@ -581,7 +581,6 @@ //[Type] == Bow && [Quality] == Rare # [Itemskillonattack] == 66 && ([Enhanceddamage] >= 400 || ([Enhanceddamage] >= 300 && [Itemtohitperlevel] >= 1)) //[Type] == Bow && [Quality] == Rare # ([Enhanceddamage] >= 400 || ([Enhanceddamage] >= 250 && [Itemskillonattack] == 66) || ([Enhanceddamage] >= 300 && [Itemtohitperlevel] >= 1)) && [Sockets] >= 0 //[Type] == Bow && [Quality] == Rare # [Ias] >= 20 && ([Enhanceddamage] >= 300 || ([Enhanceddamage] >= 225 && [Itemskillonattack] == 66) || ([Enhanceddamage] >= 250 && [Itemtohitperlevel] >= 1)) && [Sockets] >= 0 -//[Type] == Bow && [Quality] == Rare && [Flag] != Ethereal # [Enhanceddamage] >= 250 && [218] >= 4 && [224] >= 33 //---------------------------------------- //================= Belts ================ @@ -899,16 +898,22 @@ //----------------------------------------------- // <<<<<<<<< [ Ethereal/Non-Ethereal Superior/Non-Superior Socketed/Non-Socketed Staves ] >>>>>>>>> -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] == 3 && [Skillchillingarmor] >= 1 && [Sockets] == 0 // Memory -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] == 3 && [Skillchillingarmor] >= 1 && [Sockets] >= 4 // Memory Socketed -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillthunderstorm] == 3 && ([Skillenergyshield] == 3 || [Skillchillingarmor] >= 1) && [Sockets] == 0 // Memory -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillthunderstorm] == 3 && ([Skillenergyshield] == 3 || [Skillchillingarmor] >= 1) && [Sockets] >= 4 // Memory Socketed -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] == 3 && [Skillenchant] >= 1 && [Sockets] == 0 // Memory -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] == 3 && [Skillenchant] >= 1 && [Sockets] >= 4 // Memory Socketed -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillthunderstorm] == 3 && ([Skillenergyshield] == 3 || [Skillenchant] >= 1) && [Sockets] == 0 // Memory -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillthunderstorm] == 3 && ([Skillenergyshield] == 3 || [Skillenchant] >= 1) && [Sockets] >= 4 // Memory Socketed -([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skilllightningmastery] == 3 && ([Skilllightning] == 3 || [Skillchainlightning] == 3 || [Skillthunderstorm] == 3) && [Skillenergyshield] >= 1 && [Sockets] == 0 // Cta/Obsession -([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skilllightningmastery] == 3 && ([Skilllightning] == 3 || [Skillchainlightning] == 3 || [Skillthunderstorm] == 3) && [Skillenergyshield] >= 1 && [Sockets] >= 5 // Cta/Obsession Socketed +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] >= 3 && ([Skillchillingarmor] >= 2 || Skillthunderstorm] >= 2) && [Sockets] == 0 // Energy Shield Memory +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] >= 3 && ([Skillchillingarmor] >= 2 || Skillthunderstorm] >= 2) && [Sockets] >= 4 // Energy Shield Memory Socketed +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillthunderstorm] >= 3 && ([Skillenergyshield] >= 2 || [Skillchillingarmor] >= 2) && [Sockets] == 0 // Thunderstorm Memory +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillthunderstorm] >= 3 && ([Skillenergyshield] >= 2 || [Skillchillingarmor] >= 2) && [Sockets] >= 4 // Thunderstorm Memory Socketed +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillchillingarmor] >= 3 && ([Skillthunderstorm] >= 2 || [Skillenergyshield] >= 2) && [Sockets] == 0 // Chilling armor Memory +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillchillingarmor] >= 3 && ([Skillthunderstorm] >= 2 || [Skillenergyshield] >= 2) && [Sockets] >= 4 // Chilling armor Memory Socketed +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenchant] >= 3 && [Skillwarmth] == 2 && [Sockets] == 0 // Enchant Memory +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenchant] >= 3 && [Skillwarmth] == 2 && [Sockets] >= 4 // Enchant Memory Socketed +([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillchillingarmor] >= 2 && [Skillthunderstorm] >= 2 && ([Skillenergyshield] >= 2 || [Skillenchant] >= 2) && [Sockets] == 0 // Cta +([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillchillingarmor] >= 2 && [Skillthunderstorm] >= 2 && ([Skillenergyshield] >= 2 || [Skillenchant] >= 2) && [Sockets] == 5 // Cta Socketed +([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillchainlightning] >= 3 && ([Skilllightningmastery] >= 2 || [Skilllightning] >= 2 || [Skillthunderstorm] >= 2) && [Skillenergyshield] >= 0 && [Sockets] == 0 // Lightning Obsession +([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillchainlightning] >= 3 && ([Skilllightningmastery] >= 2 || [Skilllightning] >= 2 || [Skillthunderstorm] >= 2) && [Skillenergyshield] >= 0 && [Sockets] == 6 // Lightning Obsession socketed +([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillblizzard] >= 3 && ([Skilliceblast] >= 2 || [Skillfrozenorb] >= 2 || [Skillwarmth] >= 2) && [Skillchillingarmor] >= 0 && [Sockets] >= 0 // Blizzard Obsession +([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillblizzard] >= 3 && ([Skilliceblast] >= 2 || [Skillfrozenorb] >= 2 || [Skillwarmth] >= 2) && [Skillchillingarmor] >= 0 && [Sockets] >= 6 // Obsession Socketed +([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillfireball] >= 3 && ([Skillmeteor] >= 2 || [Skillfirebolt] >= 2 || [Skillwarmth] >= 2) && [Skillchillingarmor] >= 0 && [Sockets] >= 0 // Fireball Obsession +([Name] == Warstaff || [Name] == Runestaff || [Name] == Archonstaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillfireball] >= 3 && ([Skillmeteor] >= 2 || [Skillfirebolt] >= 2 || [Skillwarmth] >= 2) && [Skillchillingarmor] >= 0 && [Sockets] >= 6 // Fireball Obsession socketed //--------------------------------------------------------- //================= Necromancer Wand Bases ================ @@ -1117,7 +1122,7 @@ //================= Griswold's Legacy ================ //---------------------------------------------------- -//[Name] == Ornateplate && [Quality] == Set # // Griswold's Heart +//[Name] == Ornateplate && [Quality] == Set // Griswold's Heart //[Name] == Corona && [Quality] == Set # [Itemmagicbonus] >= 20 // Griswold's Valor //[Name] == Corona && [Quality] == Set # [Itemmagicbonus] >= 30 && [Enhanceddefense] >= 75 // Griswold's Valor Perfect //[Name] == Caduceus && [Quality] == Set # [Sockets] >= 3 && [Enhanceddamage] >= 200 // Griswold's Redemption @@ -1441,7 +1446,7 @@ //[Name] == Buckler && [Quality] == Unique && [Flag] != Ethereal # [Enhanceddefense] >= 30 // Pelta Lunata //[Name] == Buckler && [Quality] == Unique && [Flag] != Ethereal # [Enhanceddefense] == 40 // Pelta Lunata Perfect -///[Name] == Towershield && [Quality] == Unique && [Flag] != Ethereal # [Enhanceddefense] >= 80 // Bverrit Keep +//[Name] == Towershield && [Quality] == Unique && [Flag] != Ethereal # [Enhanceddefense] >= 80 // Bverrit Keep //[Name] == Towershield && [Quality] == Unique && [Flag] != Ethereal # [Enhanceddefense] == 120 // Bverrit Keep Perfect //[Name] == Roundshield && [Quality] == Unique && [Flag] != Ethereal # [Enhanceddefense] >= 180 // Moser's Blessed Circle //[Name] == Roundshield && [Quality] == Unique && [Flag] != Ethereal # [Enhanceddefense] == 220 // Moser's Blessed Circle Perfect @@ -1473,7 +1478,7 @@ //[Idname] == Bloodletter // Bloodletter //[Idname] == Coldsteeleye // Coldsteel Eye //[Idname] == Hexfire // Hexfire -//[Idname] == Bladeofalibaba && [Dexterity] >= 5 // Blade Of Ali Baba +//[Idname] == Bladeofalibaba # [Dexterity] >= 5 // Blade Of Ali Baba [Idname] == Bladeofalibaba # [Dexterity] >= 15 // Blade Of Ali Baba Perfect Dex //[Idname] == Ginthersrift // Ginther's Rift //[Name] == Battlesword && [Quality] == Unique && [Flag] != Ethereal # [Enhanceddamage] >= 150 // Headstriker From c62c2374422353fa92fa2e039d9a289083cd5963 Mon Sep 17 00:00:00 2001 From: Gleed Date: Thu, 23 Jun 2022 14:53:58 -0400 Subject: [PATCH 2/4] Bugfix: template_finder.search_all() messing with input arguments (#931) * init * remove print --- src/template_finder.py | 2 +- test/template_finder_test.py | 45 ++++++++++++++++++++++++++++-------- 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/template_finder.py b/src/template_finder.py index e981503..e166cae 100644 --- a/src/template_finder.py +++ b/src/template_finder.py @@ -209,7 +209,7 @@ def search_all( """ templates = _process_template_refs(ref) matches = [] - img = inp_img + img = inp_img.copy() while True: any_found = False for template in templates: diff --git a/test/template_finder_test.py b/test/template_finder_test.py index 65cb5f9..644eae3 100644 --- a/test/template_finder_test.py +++ b/test/template_finder_test.py @@ -7,20 +7,17 @@ import utils.download_test_assets # downloads assets if they don't already exist screen.set_window_position(0, 0) -image = cv2.imread("test/assets/stash_slots.png") -empty = cv2.imread("test/assets/stash_slot_empty.png") -slash = cv2.imread("test/assets/stash_slot_slash.png") -cross = cv2.imread("test/assets/stash_slot_cross.png") -slash_expected_roi = [38, 0, 38, 38] - def test_search(): - threshold=0.6 """ Test default search behavior (first match) - searches first for cross, which doesn't perfectly match but should reach above threshold - if cross matches above threshold as expected, then it won't bother to search for slash, which has a perfect match on the image - test passes if the template match score is not perfect """ + image = cv2.imread("test/assets/stash_slots.png") + slash = cv2.imread("test/assets/stash_slot_slash.png") + cross = cv2.imread("test/assets/stash_slot_cross.png") + threshold=0.6 match = template_finder.search([cross, slash], image, threshold) assert threshold <= match.score < 1 @@ -31,14 +28,44 @@ def test_search_best_match(): - searches next for slash, which perfectly matches on image - test passes if the center of the template match lies within the expected region of the slash """ + image = cv2.imread("test/assets/stash_slots.png") + slash = cv2.imread("test/assets/stash_slot_slash.png") + cross = cv2.imread("test/assets/stash_slot_cross.png") + slash_expected_roi = [38, 0, 38, 38] match = template_finder.search([cross, slash], image, threshold=0.6, best_match=True) assert is_in_roi(slash_expected_roi, match.center) def test_search_all(): """ - Test all matches + Test all matches for a single template in argument - searches for empty slots with high threshold - test passes if 3 matches result """ + image = cv2.imread("test/assets/stash_slots.png") + empty = cv2.imread("test/assets/stash_slot_empty.png") matches = template_finder.search_all(empty, image, threshold=0.98) - assert len(matches) == 3 \ No newline at end of file + assert len(matches) == 3 + +def test_search_all_multiple_templates(): + """ + Test all matches with multiple templates in argument + - searches for empty slots and slash with high threshold + - test passes if 4 matches result + """ + image = cv2.imread("test/assets/stash_slots.png") + empty = cv2.imread("test/assets/stash_slot_empty.png") + slash = cv2.imread("test/assets/stash_slot_slash.png") + matches = template_finder.search_all([empty, slash], image, threshold=0.98) + assert len(matches) == 4 + +if __name__ == "__main__": + image = cv2.imread("test/assets/stash_slots.png") + empty = cv2.imread("test/assets/stash_slot_empty.png") + slash = cv2.imread("test/assets/stash_slot_slash.png") + cross = cv2.imread("test/assets/stash_slot_cross.png") + slash_expected_roi = [38, 0, 38, 38] + + + matches = template_finder.search_all([empty, slash], image, threshold=0.98) + print(len(matches)) + print(matches) From 9ed7869ddd29aa7e4ede84541fefda080ef804c8 Mon Sep 17 00:00:00 2001 From: mgleed Date: Thu, 23 Jun 2022 15:13:10 -0400 Subject: [PATCH 3/4] fix typo :eyes: --- config/default.nip | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/default.nip b/config/default.nip index 499ab8b..7231342 100644 --- a/config/default.nip +++ b/config/default.nip @@ -898,8 +898,8 @@ //----------------------------------------------- // <<<<<<<<< [ Ethereal/Non-Ethereal Superior/Non-Superior Socketed/Non-Socketed Staves ] >>>>>>>>> -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] >= 3 && ([Skillchillingarmor] >= 2 || Skillthunderstorm] >= 2) && [Sockets] == 0 // Energy Shield Memory -([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] >= 3 && ([Skillchillingarmor] >= 2 || Skillthunderstorm] >= 2) && [Sockets] >= 4 // Energy Shield Memory Socketed +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] >= 3 && ([Skillchillingarmor] >= 2 || [skillthunderstorm] >= 2) && [Sockets] == 0 // Energy Shield Memory +([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillenergyshield] >= 3 && ([Skillchillingarmor] >= 2 || [skillthunderstorm] >= 2) && [Sockets] >= 4 // Energy Shield Memory Socketed ([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillthunderstorm] >= 3 && ([Skillenergyshield] >= 2 || [Skillchillingarmor] >= 2) && [Sockets] == 0 // Thunderstorm Memory ([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillthunderstorm] >= 3 && ([Skillenergyshield] >= 2 || [Skillchillingarmor] >= 2) && [Sockets] >= 4 // Thunderstorm Memory Socketed ([Name] == Gnarledstaff || [Name] == Battlestaff) && ([Quality] == Normal || [Quality] == Superior) # [Skillchillingarmor] >= 3 && ([Skillthunderstorm] >= 2 || [Skillenergyshield] >= 2) && [Sockets] == 0 // Chilling armor Memory From 689a93a3f7caa2a8e989e27f6e176df8764fb7bb Mon Sep 17 00:00:00 2001 From: Gleed Date: Thu, 23 Jun 2022 17:01:45 -0400 Subject: [PATCH 4/4] Bugfix: Make character name OCR not freeze program if fails, also improved read --- config/game.ini | 2 +- src/ui/character_select.py | 35 ++++++++++++++++++++--------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/config/game.ini b/config/game.ini index 211869a..3e6a288 100644 --- a/config/game.ini +++ b/config/game.ini @@ -120,7 +120,7 @@ shrine_check=500,50,350,100 character_select=1033, 44, 226, 554 character_online_status=1033, 19, 226, 25 ; character_sub_roi is with respect to matched active character template -character_name_sub_roi=6, 22, 186, 18 +character_name_sub_roi=2, 20, 194, 22 cube_area_roi=167,209,113,152 cube_btn_roi=160,368,125,57 xp_bar_text=369,630,554,34 diff --git a/src/ui/character_select.py b/src/ui/character_select.py index 6c5ebd0..b46df69 100644 --- a/src/ui/character_select.py +++ b/src/ui/character_select.py @@ -61,21 +61,26 @@ def save_char_template(): x, y, w, h = Config().ui_roi["character_name_sub_roi"] x, y = x + match.region[0], y + match.region[1] char_template = cut_roi(img, [x, y, w, h]) - ocr_result = ocr.image_to_text( - images = char_template, - model = "hover-eng_inconsolata_inv_th_fast", - psm = 6, - scale = 1.2, - crop_pad = False, - erode = False, - invert = False, - threshold = 0, - digits_only = False, - fix_regexps = False, - check_known_errors = False, - correct_words = False, - )[0] - Logger.debug(f"Saved character template: {ocr_result.text.splitlines()[0]}") + msg="" + try: + ocr_result = ocr.image_to_text( + images = cut_roi(img, [x, y, w, h]), + model = "hover-eng_inconsolata_inv_th_fast", + psm = 6, + scale = 1.2, + crop_pad = False, + erode = False, + invert = False, + threshold = 0, + digits_only = False, + fix_regexps = False, + check_known_errors = False, + correct_words = False, + )[0] + msg += f": {ocr_result.text.splitlines()[0]}" + except: + pass + Logger.debug(f"Saved character template{msg}") else: Logger.error("save_char_template: Could not save character template") return