Files
my-botty/src/run/arcane.py
T
reqyl baa6bf0e9b Enhancement: Optimize trav (#829)
* Small optimization by know if current run is last

* Tele amu optimization

Prefer to not use tele changes when getting back inside to loot.
Only use tele charge if pathway was blocked.

This change makes bot use a less tele charges, and thereby improve run speed due to not having to repair as often.

* Pass whole list of runs instead of just last one

This would allow to e.g check first run / only run etc
2022-06-06 11:16:58 -04:00

121 lines
4.7 KiB
Python

from char.i_char import IChar
from config import Config
from logger import Logger
from pather import Location, Pather
from item.pickit import PickIt
import template_finder
from town.town_manager import TownManager
from utils.misc import wait
from dataclasses import dataclass
from chest import Chest
from ui import waypoint
from health_manager import set_pause_state
class Arcane:
name = "run_arcane"
def __init__(
self,
pather: Pather,
town_manager: TownManager,
char: IChar,
pickit: PickIt,
runs: list[str]
):
self._pather = pather
self._town_manager = town_manager
self._char = char
self._pickit = pickit
self._chest = Chest(self._char, 'arcane')
self._runs = runs
def approach(self, start_loc: Location) -> bool | Location:
Logger.info("Run Arcane")
set_pause_state(True)
if not self._char.capabilities.can_teleport_natively:
raise ValueError("Arcane requires teleport")
if not self._town_manager.open_wp(start_loc):
return False
wait(0.4)
if waypoint.use_wp("Arcane Sanctuary"):
return Location.A2_ARC_START
return False
def _find_summoner(self, traverse_to_summoner: list[tuple[float, float]]) -> bool:
# Check if we arrived at platform
templates_platform = ["ARC_PLATFORM_1", "ARC_PLATFORM_2", "ARC_PLATFORM_3", "ARC_CENTER"]
tempaltes_summoner = ["ARC_ALTAR", "ARC_ALTAR3", "ARC_END_STAIRS", "ARC_END_STAIRS_2"]
match_platform = template_finder.search_and_wait(templates_platform, threshold=0.55, timeout=0.5, use_grayscale=True)
match_summoner = template_finder.search_and_wait(tempaltes_summoner, threshold=0.79, timeout=0.5, use_grayscale=True)
if not match_platform.valid and not match_summoner.valid:
# We might have arrived at summoner, move up stairs with static traverse
self._pather.traverse_nodes_fixed(traverse_to_summoner, self._char)
# try to match summoner again
match_summoner = template_finder.search_and_wait(tempaltes_summoner, threshold=0.79, timeout=1.0, use_grayscale=True)
if match_summoner.valid:
if self._pather.traverse_nodes([461], self._char, timeout=2.2, force_tp=True):
return True
else:
# Traverse to center of platform
self._pather.traverse_nodes([462], self._char, timeout=1.3, force_tp=True)
return False
def battle(self, do_pre_buff: bool) -> bool | tuple[Location, bool]:
picked_up_items = False
@dataclass
class PathData:
calib_node_start: int
static_path_forward: str
jump_to_summoner: list[tuple[float, float]]
path_arr = [
PathData(450, "arc_top_right", [(500, 40)]),
PathData(453, "arc_top_left", [(500, 40)]),
PathData(456, "arc_bottom_right", [(500, 40)]),
PathData(459, "arc_bottom_left", [(500, 20), (700, 100)])
]
picked_up_items = False
for i, data in enumerate(path_arr):
set_pause_state(False)
if do_pre_buff:
self._char.pre_buff()
# calibrating at start and moving towards the end of the arm
self._pather.traverse_nodes([data.calib_node_start], self._char, force_tp=True)
if not self._pather.traverse_nodes_fixed(data.static_path_forward, self._char):
return False
found = self._find_summoner(data.jump_to_summoner)
# Kill the summoner or trash mob
self._char.kill_summoner()
if Config().char["open_chests"]:
self._chest.open_up_chests()
picked_up_items |= self._pickit.pick_up_items(self._char)
if found:
return (Location.A2_ARC_END, picked_up_items)
elif i < len(path_arr) - 1:
# Open TP and return back to town, walk to wp and start over
if not self._char.tp_town():
Logger.warning("TP to town failed, cancel run")
return False
set_pause_state(True)
if not self._town_manager.wait_for_tp(Location.A2_TP):
return False
if not self.approach(Location.A2_FARA_STASH):
return False
return False
if __name__ == "__main__":
import keyboard
from game_stats import GameStats
import os
keyboard.add_hotkey('f12', lambda: os._exit(1))
keyboard.wait("f11")
from config import Config
from bot import Bot
game_stats = GameStats()
bot = Bot(game_stats)
bot._arcane._find_summoner([(500, 40)])