Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
78d9e7d
feat: trying to open depot
Adriein Aug 31, 2024
c5fffe7
feat: trying to open depot
Adriein Aug 31, 2024
781c7da
feat: trying to open depot
Adriein Aug 31, 2024
ad2d9ab
feat: trying to open depot
Adriein Aug 31, 2024
1b6a7c5
feat: trying to open depot
Adriein Aug 31, 2024
f1497bb
feat: trying to open depot
Adriein Aug 31, 2024
3e89cb2
feat: trying to open depot
Adriein Aug 31, 2024
f7ff65e
feat: trying to open depot
Adriein Aug 31, 2024
ea02c6d
feat: trying to open depot
Adriein Aug 31, 2024
9253ede
feat: trying to open depot
Adriein Aug 31, 2024
8a99a2e
feat: trying to open market
Adriein Aug 31, 2024
7ce6ee6
feat: trying to open market
Adriein Aug 31, 2024
47c3163
feat: trying to open market
Adriein Aug 31, 2024
0f04295
feat: trying to open market
Adriein Sep 1, 2024
0dd455b
feat: trying to open market
Adriein Sep 1, 2024
8a4e8bc
feat: trying to open market
Adriein Sep 1, 2024
498d932
feat: trying to search item in the market
Adriein Sep 1, 2024
8f60c60
feat: trying to search item in the market
Adriein Sep 1, 2024
f2e930c
feat: trying to search item in the market
Adriein Sep 1, 2024
d239ffa
feat: trying to select item in the market
Adriein Sep 1, 2024
68c3a41
feat: trying to select item in the market
Adriein Sep 1, 2024
57afcf7
feat: trying to select item in the market
Adriein Sep 1, 2024
5760b5f
feat: trying to select item in the market
Adriein Sep 1, 2024
1879e9b
feat: trying to select item in the market
Adriein Sep 1, 2024
2345cb9
feat: trying to parse info from item
Adriein Sep 1, 2024
fff2ead
feat: trying to parse info from item
Adriein Sep 1, 2024
56f7372
feat: trying to parse info from item
Adriein Sep 1, 2024
816d854
feat: trying to parse info from item
Adriein Sep 1, 2024
0fadd9d
feat: trying to parse info from item
Adriein Sep 1, 2024
245d824
feat: trying to parse info from item
Adriein Sep 1, 2024
c02ac4c
feat: trying to parse info from item
Adriein Sep 1, 2024
07464ae
feat: trying to parse info from item
Adriein Sep 1, 2024
fb33029
feat: trying to parse info from item
Adriein Sep 1, 2024
af9539b
feat: trying to parse info from item
Adriein Sep 1, 2024
dacbd8e
feat: trying to parse info from item
Adriein Sep 1, 2024
d42da55
feat: trying to parse info from item
Adriein Sep 1, 2024
13b8cad
feat: trying to parse info from item
Adriein Sep 1, 2024
b514de3
feat: trying to parse info from item
Adriein Sep 1, 2024
cd3921c
feat: trying to parse info from item
Adriein Sep 1, 2024
8cd50e2
feat: trying to parse info from item
Adriein Sep 1, 2024
0c9135f
feat: trying to parse info from item
Adriein Sep 1, 2024
ca87b49
feat: trying to extract whole row info
Adriein Sep 7, 2024
6fcc1a2
feat: trying to extract whole row info
Adriein Sep 7, 2024
327ea7c
feat: trying to extract whole row info
Adriein Sep 7, 2024
a6ddb7e
feat: trying to extract whole row info
Adriein Sep 7, 2024
f058c39
feat: trying to extract whole row info
Adriein Sep 7, 2024
da86c95
feat: trying to extract whole row info
Adriein Sep 7, 2024
fa3ad28
feat: trying to extract whole row info
Adriein Sep 7, 2024
29df214
feat: trying to extract whole row info
Adriein Sep 7, 2024
fb00f95
feat: trying to extract whole row info
Adriein Sep 7, 2024
9d1a64e
feat: trying to extract whole row info
Adriein Sep 7, 2024
d34835a
feat: trying to extract whole row info
Adriein Sep 7, 2024
8b22fcc
feat: trying to extract whole row info
Adriein Sep 7, 2024
a765df2
feat: trying to extract whole row info
Adriein Sep 7, 2024
7dfa07b
feat: trying to extract whole row info
Adriein Sep 7, 2024
e982b00
feat: trying to extract whole row info
Adriein Sep 7, 2024
33cd70a
feat: trying to extract whole row info
Adriein Sep 7, 2024
80de785
feat: trying to extract whole row info
Adriein Sep 7, 2024
4d20d8b
feat: trying to extract whole row info
Adriein Sep 7, 2024
6c6fb7f
feat: trying to extract whole row info
Adriein Sep 7, 2024
53b9e4d
feat: trying to extract whole row info
Adriein Sep 7, 2024
493e15a
feat: trying to extract whole row info
Adriein Sep 7, 2024
dbf33e1
feat: trying to extract whole row info
Adriein Sep 7, 2024
9e6341f
feat: trying to extract whole row info
Adriein Sep 7, 2024
05ef096
feat: make http request
Adriein Sep 7, 2024
daa4c0b
feat: trying to cancel item search
Adriein Sep 7, 2024
9a19fd7
feat: trying to cancel item search
Adriein Sep 7, 2024
3d5e1a0
feat: trying to cancel item search
Adriein Sep 7, 2024
3f9e801
feat: trying to cancel item search
Adriein Sep 7, 2024
c2e3d1d
feat: trying to cancel item search
Adriein Sep 7, 2024
5bce543
feat: trying to cancel item search
Adriein Sep 7, 2024
b7be9ca
feat: trying to cancel item search
Adriein Sep 7, 2024
563fe8f
feat: trying to cancel item search
Adriein Sep 7, 2024
18b89a3
feat: trying to cancel item search
Adriein Sep 7, 2024
f2e2089
feat: trying to cancel item search
Adriein Sep 7, 2024
dfdfa75
feat: trying to cancel item search
Adriein Sep 7, 2024
070c0fb
feat: trying to cancel item search
Adriein Sep 7, 2024
d742c91
feat: trying to cancel item search
Adriein Sep 7, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 35 additions & 7 deletions App.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import time

from src.GamePackage import Player, Script, Map, PathFinder
from src.GamePackage import Player, Script, Map, PathFinder, TradeScript
from src.LoggerPackage import Logger
from src.OperatingSystemPackage import Kernel, Monitor, GlobalGameWidgetContainer, Keyboard, Mouse
from src.VendorPackage import PyAutoGui, TesseractOcr
from src.Cavebot import CaveBot
from src.Train import AutoTrainer
from src.Trader import AutoTrader
from src.TaskPackage import TaskResolver
from src.SharedPackage import Constants, GameContext

Expand All @@ -28,7 +29,7 @@ def init(self) -> None:

game_context = GameContext()

if Constants.TRAIN_MODE not in os.environ:
if Constants.TRAIN_MODE not in os.environ and Constants.TRADE_MODE not in os.environ:
game_context.set_script_enemies(self.__script.creatures())
game_context.set_cave_route(self.__script.waypoints())
game_context.set_has_to_wear_ring(self.__script.has_to_wear_ring())
Expand All @@ -49,14 +50,31 @@ def init(self) -> None:

return

auto_trainer = AutoTrainer(
if Constants.TRAIN_MODE in os.environ:
auto_trainer = AutoTrainer(
self.__monitor,
self.__task_resolver,
self.__global_widget_container,
self.__tesseract
)

auto_trainer.start(game_context, player)

return

script = TradeScript.load('src/Wiki/Script/Trade/trade.json')

game_context.set_trade_items(script.items())

auto_trader = AutoTrader(
self.__monitor,
self.__task_resolver,
self.__global_widget_container,
self.__tesseract
self.__pyautogui
)

auto_trainer.start(game_context, player)
auto_trader.start(game_context, player)


except KeyboardInterrupt:
Logger.info('Graceful shutdown')
Expand All @@ -65,7 +83,7 @@ def init(self) -> None:
Logger.error(str(error), error)

Logger.info('Force character logout')
self.__kernel.force_game_logout()
# self.__kernel.force_game_logout()

raise SystemExit from error

Expand Down Expand Up @@ -148,6 +166,12 @@ def __collect_program_arguments(self) -> None:
help='Indicate that program should start in training mode'
)

parser.add_argument(
'--trade',
action="store_true",
help='Indicate that program should start in trade mode'
)

if parser.parse_args():
table = Table()
table.add_column("Argument", justify="left", style="magenta", no_wrap=True)
Expand All @@ -157,6 +181,10 @@ def __collect_program_arguments(self) -> None:
os.environ[Constants.TRAIN_MODE] = Constants.TRAIN_MODE
table.add_row("--train", Constants.TRAIN_MODE)

if parser.parse_args().trade:
os.environ[Constants.TRADE_MODE] = Constants.TRADE_MODE
table.add_row("--trade", Constants.TRADE_MODE)

if parser.parse_args().debug:
os.environ[Constants.DEBUG_MODE] = Constants.DEBUG_MODE
table.add_row("--debug", Constants.DEBUG_MODE)
Expand All @@ -165,7 +193,7 @@ def __collect_program_arguments(self) -> None:
os.environ[Constants.DEV_MODE] = Constants.DEV_MODE
table.add_row("--dev", Constants.DEV_MODE)

if not parser.parse_args().dev and not parser.parse_args().train and not parser.parse_args().debug:
if not parser.parse_args().dev and not parser.parse_args().train and not parser.parse_args().debug and not parser.parse_args().trade:
os.environ[Constants.PRODUCTION_MODE] = Constants.PRODUCTION_MODE
table.add_row("production", Constants.PRODUCTION_MODE)

Expand Down
19 changes: 19 additions & 0 deletions src/GamePackage/Player.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from time import sleep

from src.LoggerPackage import Logger
from src.OperatingSystemPackage import Keyboard, Mouse
from src.SharedPackage import Creature, Coordinate, MoveCommand
Expand Down Expand Up @@ -67,3 +69,20 @@ def chase_opponent(self) -> None:
def use_stealth_ring(self) -> None:
Logger.info('Equip stealth ring')
self.__keyboard.press('t')

def open(self, coordinates: Coordinate) -> None:
self.__mouse.use_right_button(coordinates)

def left_click(self, coordinates: Coordinate) -> None:
self.__mouse.use_left_button(coordinates)

def write(self, word: str) -> None:
letters = list(word)

for letter in letters:
if letter == " ":
self.__keyboard.press("space")
continue

self.__keyboard.press(letter)
sleep(0.2)
23 changes: 23 additions & 0 deletions src/GamePackage/TradeScript.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import json
from src.UtilPackage import LinkedList

class TradeScript:
__FILE_READ_MODE = 'r'

__items: LinkedList = LinkedList[str]()


def __init__(self, script_json_data: dict):
for item in script_json_data['item']:
self.__items.append(item)


@staticmethod
def load(name: str) -> 'TradeScript':
with open(name, TradeScript.__FILE_READ_MODE) as file:
script_data = json.load(file)

return TradeScript(script_data)

def items(self) -> LinkedList[str]:
return self.__items
3 changes: 2 additions & 1 deletion src/GamePackage/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@
from .Script import Script
from .Map import Map
from .MapTile import MapTile
from .PathFinder import PathFinder
from .PathFinder import PathFinder
from .TradeScript import TradeScript
42 changes: 42 additions & 0 deletions src/OperatingSystemPackage/Widget/GlobalGameWidgetContainer.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import cv2
import numpy as np

from src.SharedPackage import ScreenRegion, Constants, Coordinate
from src.VendorPackage import PyAutoGui, Cv2File
Expand Down Expand Up @@ -48,6 +49,9 @@ def __init__(self, monitor: Monitor, pyautogui: PyAutoGui, initial_floor_lvl: in
Logger.info('Locating Ring Widget...')
self.__ring_region = self.__locate_ring_widget()

Logger.info('Locating Nearest Depot...')
self.__nearest_depot_region = self.__locate_depot()

def battle_list_widget(self) -> ScreenRegion:
return self.__battle_list_widget_region

Expand Down Expand Up @@ -75,6 +79,9 @@ def combat_stance_widget(self) -> ScreenRegion:
def ring_widget(self) -> ScreenRegion:
return self.__ring_region

def nearest_depot(self) -> ScreenRegion:
return self.__nearest_depot_region

def __create_looting_area_coordinates(self,) -> list[Coordinate]:
[width, _] = self.__monitor_dimensions

Expand Down Expand Up @@ -214,3 +221,38 @@ def __locate_ring_widget(self) -> ScreenRegion:
end_x = x + width

return ScreenRegion(start_x, end_x, start_y, end_y)
def __locate_depot(self) -> ScreenRegion:
frame = cv2.cvtColor(self.__initial_setup_screenshot, cv2.COLOR_BGR2GRAY)

depot_anchor = Cv2File.load_image(f'src/Wiki/Ui/Market/depot.png')

match = cv2.matchTemplate(depot_anchor, frame, cv2.TM_CCOEFF_NORMED)

multiple_loc = np.where(match >= 0.7)

depot_locations = []

for pt in zip(*multiple_loc[::-1]):
depot_locations.append(pt)

screen_player_position = Coordinate.from_screen_region(self.__game_window)

distances = []
for depot_loc in depot_locations:
distance = np.linalg.norm(np.array((screen_player_position.x, screen_player_position.y)) - np.array(depot_loc))
distances.append(distance)

# Find the index of the nearest depot
nearest_depot_index = np.argmin(distances)

# Get the coordinates of the nearest depot
(x, y) = depot_locations[nearest_depot_index]

height, width = depot_anchor.shape

return ScreenRegion(
start_x=x,
end_x=x + width,
start_y=y,
end_y=y + height
)
5 changes: 5 additions & 0 deletions src/SharedPackage/Constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ class Constants:

# APP MODE
TRAIN_MODE = "TRAIN_MODE"
TRADE_MODE = "TRADE_MODE"
DEBUG_MODE = "DEBUG_MODE"
DEV_MODE = "DEV_MODE"
PRODUCTION_MODE = "PRODUCTION_MODE"
Expand All @@ -47,3 +48,7 @@ class Constants:

# SPELLS
LIGHT_HEALING = "exura infir ico"

# TRADE
SELL_OFFER = "SELL_OFFER"
BUY_OFFER = "BUY_OFFER"
3 changes: 3 additions & 0 deletions src/SharedPackage/Exception/ManualIterationInterrupt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class ManualIterationInterrupt(Exception):
def __init__(self):
super().__init__(f'ManualIterationInterrupt')
44 changes: 44 additions & 0 deletions src/SharedPackage/GameContext.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from .Creature import Creature
from .Waypoint import Waypoint
from .MarketItem import MarketItem
from datetime import datetime
from copy import deepcopy
from src.UtilPackage import Time, LinkedList
Expand Down Expand Up @@ -37,6 +38,13 @@ def __init__(self):
self.__has_to_wear_ring = False
self.__is_ring_equipped = False

self.__trade_items = LinkedList[str]
self.__is_market_open = False
self.__is_item_searched = False
self.__is_item_selected = False
self.__is_scrapping_item_info = False
self.__scrapped_item = None

def set_health(self, health: int) -> None:
self.__health = health

Expand Down Expand Up @@ -140,3 +148,39 @@ def get_is_ring_equipped(self) -> bool:

def set_is_ring_equipped(self, is_equipped: bool) -> None:
self.__is_ring_equipped = is_equipped

def get_is_market_open(self) -> bool:
return self.__is_market_open

def set_is_market_open(self, is_market_open: bool) -> None:
self.__is_market_open = is_market_open

def get_is_item_searched(self) -> bool:
return self.__is_item_searched

def set_is_item_searched(self, is_item_searched: bool) -> None:
self.__is_item_searched = is_item_searched

def get_is_item_selected(self) -> bool:
return self.__is_item_selected

def set_is_item_selected(self, is_item_selected: bool) -> None:
self.__is_item_selected = is_item_selected

def get_is_scrapping_item_info(self) -> bool:
return self.__is_scrapping_item_info

def set_is_scrapping_item_info(self, is_scrapping_item_info: bool) -> None:
self.__is_scrapping_item_info = is_scrapping_item_info

def get_scrapped_item(self) -> MarketItem:
return self.__scrapped_item

def set_scrapped_item(self, scrapped_item: MarketItem | None) -> None:
self.__scrapped_item = scrapped_item

def get_trade_items(self) -> LinkedList[str]:
return self.__trade_items

def set_trade_items(self, items: LinkedList[str]) -> None:
self.__trade_items = items
7 changes: 7 additions & 0 deletions src/SharedPackage/MarketItem.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class MarketItem:
def __init__(self, name: str):
self.name = name
self.offers = list()

def __str__(self):
return f'MarketItem(name={self.name})'
9 changes: 9 additions & 0 deletions src/SharedPackage/Offer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
class Offer:
def __init__(self, offer_type: str):
self.offer_type = offer_type
self.unit_price = 0
self.amount = 0
self.end_date = ""

def __str__(self):
return f'Offer(offer_type={self.offer_type}, unit_price={self.unit_price}, amount={self.amount}, end_date={self.end_date})'
3 changes: 3 additions & 0 deletions src/SharedPackage/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,6 @@
from .Constants import Constants
from .Waypoint import Waypoint
from .MoveCommand import MoveCommand
from .MarketItem import MarketItem
from .Offer import Offer
from .Exception.ManualIterationInterrupt import ManualIterationInterrupt
Loading