Merge branch 'master' of https://github.com/aeon0/botty into nip-to-bnip

This commit is contained in:
Riddle
2022-06-24 13:36:53 -04:00
5 changed files with 77 additions and 40 deletions
+19 -14
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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:
+20 -15
View File
@@ -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
+36 -9
View File
@@ -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
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)