From 857052c75db3374eb18f6244b4cadb3427389a4e Mon Sep 17 00:00:00 2001 From: aeon0 Date: Mon, 13 Dec 2021 19:13:53 +0100 Subject: [PATCH] Tele dancing sorc nil (#282) * Implement simple "tele-dancing" for sorc nil * increase trav atk len --- config/params.ini | 2 +- src/char/sorceress.py | 28 +++++++++++++++++----------- src/utils/misc.py | 9 +++++++++ 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/config/params.ini b/config/params.ini index d8edcf7..b262170 100644 --- a/config/params.ini +++ b/config/params.ini @@ -29,7 +29,7 @@ casting_frames=11 stash_gold=1 gold_trav_only=0 use_merc=1 -atk_len_trav=2.0 +atk_len_trav=3.0 atk_len_pindle=3.0 atk_len_eldritch=3.0 atk_len_shenk=4.0 diff --git a/src/char/sorceress.py b/src/char/sorceress.py index a88f032..7235472 100644 --- a/src/char/sorceress.py +++ b/src/char/sorceress.py @@ -6,11 +6,12 @@ from ui import UiManager from pather import Pather from logger import Logger from screen import Screen -from utils.misc import wait +from utils.misc import wait, rotate_vec, unit_vector import random import time from typing import Tuple from pather import Location, Pather +import numpy as np class Sorceress(IChar): @@ -141,16 +142,21 @@ class Sorceress(IChar): def kill_nihlatak(self, end_nodes: list[int]) -> bool: # Find nilhlatak position delay = [0.2, 0.3] - nihlatak_pos_abs = self._pather.find_abs_node_pos(end_nodes[-1], self._screen.grab()) - if nihlatak_pos_abs is None: - return False - # Attack - cast_pos_abs = [nihlatak_pos_abs[0] * 0.9, nihlatak_pos_abs[1] * 0.9] atk_sequences = int(self._char_config["atk_len_nihlatak"]) - print(atk_sequences) - for _ in range(atk_sequences): - self._right_attack(cast_pos_abs, delay, 90) - self._left_attack(cast_pos_abs, delay, 90) + for i in range(atk_sequences): + nihlatak_pos_abs = self._pather.find_abs_node_pos(end_nodes[-1], self._screen.grab()) + if nihlatak_pos_abs is not None: + cast_pos_abs = np.array([nihlatak_pos_abs[0] * 0.9, nihlatak_pos_abs[1] * 0.9]) + atk_sequences = int(self._char_config["atk_len_nihlatak"]) + self._right_attack(cast_pos_abs, delay, 90) + self._left_attack(cast_pos_abs, delay, 90) + # Do some tele "dancing" after each sequence + if i < atk_sequences - 1: + rot_deg = random.randint(-10, 10) if i % 2 == 0 else random.randint(170, 190) + tele_pos_abs = unit_vector(rotate_vec(cast_pos_abs, rot_deg)) * 100 + pos_m = self._screen.convert_abs_to_monitor(tele_pos_abs) + self.pre_move() + self.move(pos_m) # Move to items self._pather.traverse_nodes(end_nodes, self, time_out=0.8) return True @@ -170,4 +176,4 @@ if __name__ == "__main__": ui_manager = UiManager(screen, t_finder) char = Sorceress(config.sorceress, config.char, screen, t_finder, ui_manager, pather) #char.pre_buff() - char.kill_nihlatak([506]) + char.kill_nihlatak([501]) diff --git a/src/utils/misc.py b/src/utils/misc.py index fdf659a..c3d5132 100644 --- a/src/utils/misc.py +++ b/src/utils/misc.py @@ -6,6 +6,7 @@ from logger import Logger import cv2 from typing import List, Tuple import os +from math import cos, sin, dist def wait(min_seconds, max_seconds = None): @@ -65,3 +66,11 @@ def list_files_in_folder(path: str): for name in files: r.append(os.path.join(root, name)) return r + +def rotate_vec(vec: np.ndarray, deg: float) -> np.ndarray: + theta = np.deg2rad(deg) + rot_matrix = np.array([[cos(theta), -sin(theta)], [sin(theta), cos(theta)]]) + return np.dot(rot_matrix, vec) + +def unit_vector(vec: np.ndarray) -> np.ndarray: + return vec / dist(vec, (0, 0))