Merge branch 'master' of https://github.com/aeon0/botty into nip-to-bnip
This commit is contained in:
+19
-14
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user