Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@LeftBased
Last active June 8, 2021 07:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LeftBased/970bd86bc47f9b30e0e1e3e3e9b10a04 to your computer and use it in GitHub Desktop.
Save LeftBased/970bd86bc47f9b30e0e1e3e3e9b10a04 to your computer and use it in GitHub Desktop.
PokeMMO encounter_counter with "always on top"
import pyautogui as pag
from ctypes import windll
from pynput import mouse
import pygame
import math
SCREEN_WIDTH = 430
SCREEN_HEIGHT = 61
FPS = 30
FPS_MS = math.floor(1000 / FPS)
refresh_seconds = 1
global clicked
clicked = False
def alwaysOnTop():
SetWindowPos = windll.user32.SetWindowPos
HWND_TOPMOST = -1
SWP_NOACTIVATE = 0x0010
SWP_NOSIZE = 0x0001
SWP_SHOWWINDOW = 0x0040
SWP_NOMOVE = 0x0002
#FLAGS = SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE
zorder = (HWND_TOPMOST) # choose a flag according to bool
hwnd = pygame.display.get_wm_info()['window'] # handle to the window
SetWindowPos(hwnd, zorder, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_SHOWWINDOW|SWP_NOMOVE|SWP_NOSIZE)
def on_click(x, y, button, pressed):
global clicked
if pressed:
clicked = True
def render_text(screen, font, text, text_pos, color=(0, 0, 0), center=False):
sentence_text = font.render(text, True, color)
text_rect = sentence_text.get_rect()
if not center:
text_rect.x = text_pos[0]
text_rect.y = text_pos[1]
else:
text_rect.center = text_pos
screen.blit(sentence_text, text_rect)
def get_click():
global clicked
listener = mouse.Listener(on_click=on_click)
listener.start()
while True:
start_tick = pygame.time.get_ticks()
pygame.event.get()
if clicked:
clicked = False
listener.stop()
return pag.position()
pygame.time.wait(FPS_MS - (pygame.time.get_ticks() - start_tick))
pygame.display.flip()
def settings_click(screen, main_screen):
font = pygame.font.Font('freesansbold.ttf', 12)
text_pos = (0, SCREEN_HEIGHT - 12)
render_text(screen, font, "Click top left corner of HP", text_pos, (170, 170, 170))
top_left = get_click()
screen.blit(main_screen, (0, 0))
render_text(screen, font, "Click bottom right corner of HP", text_pos, (170, 170, 170))
bottom_right = get_click()
screen.blit(main_screen, (0, 0))
return pag.screenshot(region=(top_left[0], top_left[1], bottom_right[0] - top_left[0], bottom_right[1] - top_left[1]))
def reset_click(screen, main_screen):
update_encounters(screen, main_screen, 0)
return 0
def update_encounters(screen, main_screen, encounters):
font = pygame.font.Font('freesansbold.ttf', 20)
screen.blit(main_screen, (0, 0))
render_text(screen, font, str(encounters), (309, 19), (200, 200, 200), True)
def search_for_hp(hp_img):
try:
loc = list(pag.locateAllOnScreen(hp_img, confidence=0.98))
return loc
except Exception:
return []
def main():
pygame.init()
pygame.display.set_caption("Encounter Counter")
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
try:
config_file = open("ec_resources/encounter.config", "r")
encounters = int(config_file.read())
config_file.close()
except FileNotFoundError:
encounters = 0
in_encounter = False
frame = 0
try:
main_screen = pygame.image.load("ec_resources/main_screen.png")
except pygame.error:
print("error finding main_screen")
update_encounters(screen, main_screen, encounters)
pygame.display.flip()
running = True
while running:
start_tick = pygame.time.get_ticks()
a = 0 # milliseconds from start
for event in pygame.event.get():
if event.type == pygame.QUIT:
config_file = open("ec_resources/encounter.config", "w")
config_file.write(str(encounters))
config_file.close()
return 0
elif event.type == pygame.MOUSEBUTTONUP:
pos = pygame.mouse.get_pos()
if 412 < pos[0] < 426 and 2 < pos[1] < 16:
hp_img = settings_click(screen, main_screen)
hp_img.save("ec_resources/hp_img.png", "PNG")
update_encounters(screen, main_screen, encounters)
elif 353 < pos[0] < 376 and 9 < pos[1] < 29:
encounters = reset_click(screen, main_screen)
elif 380 < pos[0] < 400:
if 5 < pos[1] < 15:
encounters += 1
update_encounters(screen, main_screen, encounters)
elif 20 < pos[1] < 30:
encounters -= 1
update_encounters(screen, main_screen, encounters)
if frame == FPS * refresh_seconds:
matches = len(search_for_hp("ec_resources/hp_img.png"))
if matches > 0:
if not in_encounter:
encounters += matches
in_encounter = True
update_encounters(screen, main_screen, encounters)
else:
in_encounter = False
frame = 0
print(in_encounter)
print(encounters)
pygame.time.wait(FPS_MS - (pygame.time.get_ticks() - start_tick) - a)
pygame.display.flip()
frame += 1
main()
alwaysOnTop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment