Tele dancing sorc nil (#282)
* Implement simple "tele-dancing" for sorc nil * increase trav atk len
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user