Proper classes
This commit is contained in:
7
aoe_bot.py
Normal file
7
aoe_bot.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import aoe_commands
|
||||||
|
import aoe_start_routine
|
||||||
|
import aoe_recognition
|
||||||
|
|
||||||
|
aoe_recognition.wait_for_start()
|
||||||
|
aoe_start_routine.run_start_routine()
|
||||||
|
aoe_recognition.collect_screenshots()
|
||||||
17
aoe_commands.py
Normal file
17
aoe_commands.py
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
from pyautogui import *
|
||||||
|
import pyautogui
|
||||||
|
import keyboard
|
||||||
|
|
||||||
|
WAIT4CLICK = 0.04
|
||||||
|
|
||||||
|
def order_peasants(number):
|
||||||
|
print(f"Trying to order {number} peasants.")
|
||||||
|
select_town_center()
|
||||||
|
for i in range(number):
|
||||||
|
pyautogui.press('q')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
def select_town_center():
|
||||||
|
pyautogui.press('h')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
36
aoe_recognition.py
Normal file
36
aoe_recognition.py
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
from pyautogui import *
|
||||||
|
import pyautogui
|
||||||
|
import time
|
||||||
|
import keyboard
|
||||||
|
import random
|
||||||
|
import win32api, win32con
|
||||||
|
import time
|
||||||
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
|
import aoe_commands
|
||||||
|
|
||||||
|
def wait_for_start():
|
||||||
|
start_started = False
|
||||||
|
while 1:
|
||||||
|
if pyautogui.locateOnScreen('images/startscreen.png', confidence=0.9) != None:
|
||||||
|
print("Startscreen found")
|
||||||
|
start_started = True
|
||||||
|
time.sleep(0.5)
|
||||||
|
elif start_started:
|
||||||
|
print("Proceeding")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
print("Startscreen not found")
|
||||||
|
time.sleep(0.5)
|
||||||
|
|
||||||
|
def collect_screenshots():
|
||||||
|
cnt = 0
|
||||||
|
while True: #keyboard.is_pressed('q') == False:
|
||||||
|
time.sleep(10)
|
||||||
|
pic = pyautogui.screenshot()
|
||||||
|
pic.save(f"image_{cnt}.png")
|
||||||
|
cnt += 1
|
||||||
|
|
||||||
|
def initial_scout_trace():
|
||||||
|
aoe_commands.select_town_center()
|
||||||
|
# TODO
|
||||||
65
aoe_start_routine.py
Normal file
65
aoe_start_routine.py
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
from pyautogui import *
|
||||||
|
import pyautogui
|
||||||
|
import keyboard
|
||||||
|
|
||||||
|
WAIT4CLICK = 0.04
|
||||||
|
|
||||||
|
import aoe_commands
|
||||||
|
|
||||||
|
def assign_hotkeys():
|
||||||
|
pyautogui.press(',')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.hotkey('ctrl', '1')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
pyautogui.press('.')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.hotkey('ctrl', '2')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
pyautogui.press('.')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.hotkey('ctrl', '3')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
pyautogui.press('.')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.hotkey('ctrl', '4')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
def build_houses():
|
||||||
|
pyautogui.press('h')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.press('up')
|
||||||
|
time.sleep(0.5)
|
||||||
|
pyautogui.press('2')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
pyautogui.press('q')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.press('q')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.click(650, 90)
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
pyautogui.press('3')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.rightClick(650, 90)
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
pyautogui.press('4')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
pyautogui.press('q')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.press('q')
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
pyautogui.click(300, 200)
|
||||||
|
time.sleep(WAIT4CLICK)
|
||||||
|
|
||||||
|
def run_start_routine():
|
||||||
|
aoe_commands.order_peasants(4)
|
||||||
|
assign_hotkeys()
|
||||||
|
build_houses()
|
||||||
|
pyautogui.press('1')
|
||||||
|
pyautogui.press('1')
|
||||||
BIN
images/startscreen.png
Normal file
BIN
images/startscreen.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 913 KiB |
35
readme.md
Normal file
35
readme.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
AoE Bot
|
||||||
|
=======
|
||||||
|
|
||||||
|
Preparation
|
||||||
|
-----------
|
||||||
|
|
||||||
|
- Install python > 3.8
|
||||||
|
- Install these libraries from an administrator terminal (windows):
|
||||||
|
- pip install pywin32
|
||||||
|
- pip install keyboard
|
||||||
|
- pip install pyautogui
|
||||||
|
- pip install opencv-python
|
||||||
|
|
||||||
|
|
||||||
|
Start
|
||||||
|
------
|
||||||
|
run aoe_bot.py before starting the game. It will wait for the startscreen and do some standard actions when the game has started:
|
||||||
|
|
||||||
|
- order 4 villagers
|
||||||
|
- assign hotkeys: 1: scout, 2-4: villagers
|
||||||
|
- build first house with villagers 1+2
|
||||||
|
- build second house with villager 3
|
||||||
|
- jump to scout
|
||||||
|
|
||||||
|
After this it will collect screenshots during the game to train data
|
||||||
|
|
||||||
|
Interesting Links
|
||||||
|
------------------
|
||||||
|
- [Tutorial video + notes](https://github.com/KianBrose/Image-Recognition-Botting-Tutorial/blob/master/README.txt)
|
||||||
|
- [Pyautogui Doc](https://pyautogui.readthedocs.io/en/latest/keyboard.html)
|
||||||
|
- [PIL doc](https://pillow.readthedocs.io/en/stable/reference/Image.html)
|
||||||
|
- [Draw Image api](https://pillow.readthedocs.io/en/stable/reference/ImageDraw.html)
|
||||||
|
- [Draw Image Example](http://effbot.org/imagingbook/imagedraw.htm)
|
||||||
|
- [AoE Hotykey editor](https://aokhotkeys.appspot.com/editor)
|
||||||
|
- [Structureing your python project](https://python-docs.readthedocs.io/en/latest/writing/structure.html)
|
||||||
11
test.py
11
test.py
@@ -7,7 +7,7 @@ import win32api, win32con
|
|||||||
import time
|
import time
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
|
|
||||||
WAIT4CLICK = 0.04
|
|
||||||
# see https://github.com/KianBrose/Image-Recognition-Botting-Tutorial/blob/master/README.txt
|
# see https://github.com/KianBrose/Image-Recognition-Botting-Tutorial/blob/master/README.txt
|
||||||
|
|
||||||
#def click(x,y):
|
#def click(x,y):
|
||||||
@@ -62,6 +62,7 @@ def wait_for_start():
|
|||||||
|
|
||||||
|
|
||||||
def zoomout():
|
def zoomout():
|
||||||
|
"Tut nicht"
|
||||||
time.sleep(0.5)
|
time.sleep(0.5)
|
||||||
print("Zooming out")
|
print("Zooming out")
|
||||||
pyautogui.click(x=500, y=500)
|
pyautogui.click(x=500, y=500)
|
||||||
@@ -81,13 +82,7 @@ def find_peasants():
|
|||||||
print(f"Für Bild {img_path} wurden {len(matches)} matches gefunden: {matches}")
|
print(f"Für Bild {img_path} wurden {len(matches)} matches gefunden: {matches}")
|
||||||
return all_matches
|
return all_matches
|
||||||
|
|
||||||
def order_peasants(number):
|
|
||||||
print(f"Trying to order {number} peasants.")
|
|
||||||
pyautogui.press('h')
|
|
||||||
time.sleep(WAIT4CLICK)
|
|
||||||
for i in range(number):
|
|
||||||
pyautogui.press('q')
|
|
||||||
time.sleep(WAIT4CLICK)
|
|
||||||
|
|
||||||
def assign_hotkeys():
|
def assign_hotkeys():
|
||||||
pyautogui.press(',')
|
pyautogui.press(',')
|
||||||
|
|||||||
Reference in New Issue
Block a user