dungeon.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import cv2
  2. import time
  3. import numpy as np
  4. from helper import (
  5. tap,
  6. look_for_templates,
  7. first_template,
  8. capture_current_screen,
  9. get_current_screen,
  10. )
  11. # templates
  12. templates = {
  13. "to_battle": cv2.imread("templates/dungeon/to_battle.png"),
  14. "attack": cv2.imread("templates/dungeon/attack.png"),
  15. "auto_battle": cv2.imread("templates/dungeon/auto_battle.png"),
  16. "ok": cv2.imread("templates/dungeon/ok.png"),
  17. "lock": cv2.imread("templates/dungeon/lock.png"),
  18. "collect": cv2.imread("templates/dungeon/collect.png"),
  19. }
  20. tpl_mixed = cv2.imread("templates/dungeon/mixed.png")
  21. tpl_water = cv2.imread("templates/dungeon/water.png")
  22. tpl_earth = cv2.imread("templates/dungeon/earth.png")
  23. tpl_angus = cv2.imread("templates/dungeon/angus.png")
  24. tpl_moloch = cv2.imread("templates/dungeon/moloch.png")
  25. tpl_angus2 = cv2.imread("templates/dungeon/angus2.png")
  26. tpl_moloch2 = cv2.imread("templates/dungeon/moloch2.png")
  27. tpl_dead = cv2.imread("templates/dungeon/dead.png")
  28. def low_health(element, name):
  29. left = element[0] - 113
  30. right = element[0] + 108
  31. top = element[1] + 158
  32. bottom = top + 11
  33. screen = read_screen()
  34. health_bar = screen[top:bottom, left:right]
  35. cv2.imwrite("test/health_bar.png", health_bar)
  36. health_bar_hsv = cv2.cvtColor(health_bar, cv2.COLOR_BGR2HSV)
  37. green_lower = np.array([40, 40, 40]) # Lower end of green in HSV
  38. green_upper = np.array([80, 255, 255]) # Upper end of green in HSV
  39. mask = cv2.inRange(health_bar_hsv, green_lower, green_upper)
  40. total_length = mask.shape[1]
  41. current_length = total_length - np.argmax(np.flip(mask[0]) > 0)
  42. health_percentage = (current_length / total_length) * 100
  43. print(f"Remaining Health ({name}): {health_percentage:.2f}%")
  44. return health_percentage < 60
  45. def read_screen():
  46. data = get_current_screen()
  47. image_data = np.frombuffer(data, dtype=np.uint8)
  48. return cv2.imdecode(image_data, cv2.IMREAD_COLOR)
  49. print("watching the screen...")
  50. is_mixed = False
  51. while True:
  52. try:
  53. capture_current_screen()
  54. name, locations = look_for_templates(templates)
  55. if name is not None:
  56. if name in ["to_battle", "ok", "lock", "collect"]:
  57. tap(*locations[0])
  58. continue
  59. if name in ["auto_battle"]:
  60. dead = first_template(tpl_dead)
  61. if dead:
  62. print("++++++++ at least one titan is dead. stopping")
  63. break
  64. if is_mixed:
  65. moloch = first_template(tpl_moloch)
  66. if moloch and moloch[1] < 1000 and low_health(moloch, "moloch"):
  67. angus = first_template(tpl_angus2)
  68. if angus:
  69. tap(angus)
  70. time.sleep(0.5)
  71. tap(angus[0] + 500, angus[1])
  72. else:
  73. print(
  74. "######### seems like angus is dead already. stopping"
  75. )
  76. break
  77. else:
  78. angus = first_template(tpl_angus)
  79. if angus and angus[1] < 1000 and low_health(angus, "angus"):
  80. moloch = first_template(tpl_moloch2)
  81. if moloch:
  82. tap(moloch)
  83. time.sleep(0.5)
  84. tap(moloch[0] - 500, moloch[1])
  85. else:
  86. print(
  87. "######### seems like moloch is dead already. stopping"
  88. )
  89. break
  90. tap(*locations[0])
  91. continue
  92. if name == "attack":
  93. if len(locations) == 1:
  94. element = first_template(tpl_mixed)
  95. is_mixed = element is not None
  96. tap(*locations[0])
  97. continue
  98. if len(locations) == 2:
  99. element = first_template(tpl_mixed)
  100. if element:
  101. is_mixed = True
  102. else:
  103. is_mixed = False
  104. element = first_template(tpl_water)
  105. if element is None:
  106. element = first_template(tpl_earth)
  107. tap(element[0], locations[0][1])
  108. continue
  109. print("...")
  110. except Exception as e:
  111. print(f"error: {e}")