- health_manager.py: read actual merc health for heal/chicken/rejuv decisions instead of timer-only logic; pass merc_health to belt.drink_potion stats - processing.py: remove stale TODO comment (traceback import is used)
88 lines
3.5 KiB
Python
88 lines
3.5 KiB
Python
import cv2
|
|
import time
|
|
|
|
import cv2
|
|
import numpy as np
|
|
from d2r_image.data_models import GroundItemList, HoveredItem, ItemQuality, ItemText
|
|
from d2r_image.bnip_helpers import parse_item
|
|
|
|
from d2r_image.processing_helpers import build_d2_items, crop_text_clusters, crop_item_tooltip, get_items_by_quality, consolidate_clusters, find_base_and_remove_items_without_a_base, set_set_and_unique_base_items
|
|
import numpy as np
|
|
|
|
from logger import Logger
|
|
from utils.log_rotation import safe_imwrite
|
|
|
|
import os
|
|
|
|
os.makedirs("./log/screenshots/info", exist_ok=True)
|
|
|
|
def get_ground_loot(image: np.ndarray, consolidate: bool = False) -> GroundItemList | None:
|
|
crop_result = crop_text_clusters(image)
|
|
items_by_quality = get_items_by_quality(crop_result)
|
|
if consolidate:
|
|
consolidate_clusters(items_by_quality)
|
|
find_base_and_remove_items_without_a_base(items_by_quality)
|
|
set_set_and_unique_base_items(items_by_quality)
|
|
return build_d2_items(items_by_quality)
|
|
|
|
import traceback
|
|
|
|
def get_hovered_item(image: np.ndarray, model = "hover-eng_inconsolata_inv_th_fast") -> tuple[HoveredItem, ItemText]:
|
|
res, quality = crop_item_tooltip(image, model)
|
|
parsed_item = None
|
|
if res.ocr_result:
|
|
try:
|
|
parsed_item = parse_item(quality, res.ocr_result.text)
|
|
except Exception as e:
|
|
Logger.warning(f"\nparsed_item ERROR {e}\n {traceback.format_exc()}")
|
|
# * Log the screenshot to log/screenshots/info directory.
|
|
t = time.time()
|
|
safe_imwrite(f"log/screenshots/info/02_{t}.png", res.img)
|
|
with open("log/screenshots/info/02_error_log.txt", "a") as f:
|
|
f.write(f"""--------------------------------------------------------------------------------
|
|
[{t}]
|
|
{res.ocr_result.text}
|
|
|
|
{traceback.format_exc()}
|
|
--------------------------------------------------------------------------------""")
|
|
return parsed_item, res
|
|
|
|
|
|
if __name__ == "__main__":
|
|
from input_layer import keyboard
|
|
import os
|
|
from screen import start_detecting_window, stop_detecting_window, grab
|
|
from d2r_image import processing as d2r_image
|
|
from d2r_image.demo import draw_items_on_image_data, gen_truth_from_ground_loot
|
|
from bnip.actions import should_keep, should_pickup
|
|
import json
|
|
from logger import Logger
|
|
start_detecting_window()
|
|
keyboard.add_hotkey('f12', lambda: Logger.info('Force Exit (f12)') or stop_detecting_window() or os._exit(1))
|
|
Logger.info("Move to d2r window and press f11")
|
|
keyboard.wait("f11")
|
|
|
|
gen_truth = False
|
|
|
|
while 1:
|
|
img = grab().copy()
|
|
# look for item tooltip
|
|
item, res = d2r_image.get_hovered_item(img)
|
|
if res.roi is not None:
|
|
Logger.debug(f"Keep {item.Quality} {item.BaseItem['DisplayName']}?: {should_keep(item.as_dict())}")
|
|
x, y, w, h = res.roi
|
|
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1)
|
|
Logger.debug(f"{json.dumps(item.as_dict(), indent=4)}\n")
|
|
else:
|
|
# look for dropped items
|
|
all_loot = d2r_image.get_ground_loot(img)
|
|
if all_loot.items and len(all_loot.items) > 0:
|
|
for item in all_loot.items:
|
|
if item:
|
|
Logger.debug(f"Pick {item.Quality} {item.BaseItem['DisplayName']}?: {should_pickup(item.as_dict())}")
|
|
Logger.debug(item.as_dict())
|
|
draw_items_on_image_data(all_loot.items, img)
|
|
if gen_truth:
|
|
gen_truth_from_ground_loot(all_loot.items, img)
|
|
cv2.imshow("res", img)
|
|
cv2.waitKey(3000) |