[REQUEST] Persona 5 : The Phantom X

Ask about cheats/tables for single player games here
cicion
What is cheating?
What is cheating?
Posts: 1
Joined: Sun Jul 06, 2025 9:59 pm
Reputation: 0

Re: [REQUEST] Persona 5 : The Phantom X

Post by cicion »

I look forward to when someone makes it for a perfect score for the rhythm band minigames and for home runs for baseball mini game. Would love for that

smallorc78
Cheater
Cheater
Posts: 34
Joined: Thu Oct 21, 2021 6:46 am
Reputation: 3

Re: [REQUEST] Persona 5 : The Phantom X

Post by smallorc78 »

hmm there is probly something we can do like make it so enemies only defends and stuff

User avatar
Natsume
Expert Cheater
Expert Cheater
Posts: 87
Joined: Sat Oct 03, 2020 1:03 am
Reputation: 28

Re: [REQUEST] Persona 5 : The Phantom X

Post by Natsume »

so far I couldn't find anything useful, I am not too expert on this thing xD

sarachisauce
What is cheating?
What is cheating?
Posts: 1
Joined: Wed Jul 09, 2025 10:24 am
Reputation: 0

Re: [REQUEST] Persona 5 : The Phantom X

Post by sarachisauce »

following this. hopefully the gm/debug mode can be used soon or smth..

Tengil
What is cheating?
What is cheating?
Posts: 1
Joined: Fri Jul 11, 2025 12:01 am
Reputation: 0

Re: [REQUEST] Persona 5 : The Phantom X

Post by Tengil »

cicion wrote:
Sun Jul 06, 2025 10:02 pm
I look forward to when someone makes it for a perfect score for the rhythm band minigames and for home runs for baseball mini game. Would love for that
As I have a close friend who literally is unable to perform the rythm games. They have a disability, and unfortunely S*GA does not include any tools for accessability on this area.
We created a python-script bot that watches the game and prompts keypresses automatically.

It's essentially an overengineered autoclicker.

Code: Select all

import time
import cv2
import numpy as np
import sys
import mss
import win32gui
import threading
import msvcrt
import keyboard 
print("Starting in 3 seconds... Remember to change the games resolution to 1280*720 and run in window mode.")
time.sleep(3)
print("Running. Press 1 to start/pause detection. Press 2 to quit.")

lanes = {
    's': {
        'coords_primary': (175, 505),
        'coords_secondary': (138, 455),
        'key': 's'
    },
    'd': {
        'coords_primary': (379, 573),
        'coords_secondary': (329, 538),
        'key': 'd'
    },
    'f': {
        'coords_primary': (579, 585),
        'coords_secondary': (519, 572),
        'key': 'f'
    },
    'j': {
        'coords_primary': (776, 572),
        'coords_secondary': (714, 582),
        'key': 'j'
    },
    'k': {
        'coords_primary': (962, 537),
        'coords_secondary': (912, 565),
        'key': 'k'
    },
    'l': {
        'coords_primary': (1154, 452),
        'coords_secondary': (1108, 495),
        'key': 'l'
    }
}

lane_states = {key: {'pressed': False} for key in lanes}

yellow_rgb = (249, 244, 42)
yellow_bgr = yellow_rgb[::-1]
yellow_hsv = cv2.cvtColor(np.uint8([[yellow_bgr]]), cv2.COLOR_BGR2HSV)[0][0]
h_y, s_y, v_y = yellow_hsv
yellow_lower = np.array([max(h_y - 9, 0), 160, 160])
yellow_upper = np.array([min(h_y + 9, 179), 255, 255])

green_rgb = (83, 220, 0)
green_bgr = green_rgb[::-1]
green_hsv = cv2.cvtColor(np.uint8([[green_bgr]]), cv2.COLOR_BGR2HSV)[0][0]
h_g, s_g, v_g = green_hsv
green_lower = np.array([max(h_g - 10, 0), 160, 160])
green_upper = np.array([min(h_g + 10, 179), 255, 255])

RADIUS = 9

detection_enabled = False
exit_flag = False

use_preview = input("Show detection preview window? (y/n): ").strip().lower() == 'y'

if use_preview:
    cv2.namedWindow("Detection Preview", cv2.WINDOW_NORMAL)
    cv2.resizeWindow("Detection Preview", 1366, 768)

def get_window_rect(window_name="Persona5: The Phantom X"):
    hwnd = win32gui.FindWindow(None, window_name)
    if hwnd == 0:
        return None
    rect = win32gui.GetWindowRect(hwnd)
    return rect  # (left, top, right, bottom)

def cleanup_and_exit():
    global exit_flag
    exit_flag = True
    print("Shutting down...")
    # Release any keys still pressed
    for key, state in lane_states.items():
        if state['pressed']:
            keyboard.release(lanes[key]['key'])
            state['pressed'] = False
    if use_preview:
        cv2.destroyAllWindows()
    sys.exit(0)

def key_listener():
    global detection_enabled
    while not exit_flag:
        if msvcrt.kbhit():
            key = msvcrt.getch()
            if key == b'1':
                detection_enabled = not detection_enabled
                print("Detection", "enabled." if detection_enabled else "paused.")
            elif key == b'2':
                cleanup_and_exit()
        time.sleep(0.05)

listener_thread = threading.Thread(target=key_listener, daemon=True)
listener_thread.start()

try:
    with mss.mss() as sct:
        while not exit_flag:
            rect = get_window_rect()
            if rect is None:
                print("P5X window not found. Waiting...")
                time.sleep(1)
                continue

            left, top, right, bottom = rect
            width = right - left
            height = bottom - top

            capture_width = min(1366, width)
            capture_height = min(768, height)

            monitor = {
                "top": top,
                "left": left,
                "width": capture_width,
                "height": capture_height
            }

            screenshot = sct.grab(monitor)
            frame = np.array(screenshot)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)
            hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

            if use_preview:
                for data in lanes.values():
                    x1, y1 = data['coords_primary']
                    x2, y2 = data['coords_secondary']
                    if 0 <= x1 < capture_width and 0 <= y1 < capture_height:
                        cv2.circle(frame, (x1, y1), RADIUS, (255, 255, 255), 2)
                    if 0 <= x2 < capture_width and 0 <= y2 < capture_height:
                        cv2.circle(frame, (x2, y2), RADIUS, (255, 255, 255), 2)

            if detection_enabled:
                for key, data in lanes.items():
                    x1, y1 = data['coords_primary']
                    x2, y2 = data['coords_secondary']
                    lane_key = data['key']
                    state = lane_states[key]

                    def get_roi(hsv_img, x, y):
                        x_min = max(0, x - RADIUS)
                        x_max = min(hsv_img.shape[1], x + RADIUS)
                        y_min = max(0, y - RADIUS)
                        y_max = min(hsv_img.shape[0], y + RADIUS)
                        return hsv_img[y_min:y_max, x_min:x_max]

                    roi_primary = get_roi(hsv, x1, y1)
                    roi_secondary = get_roi(hsv, x2, y2)

                    yellow_mask_primary = cv2.inRange(roi_primary, yellow_lower, yellow_upper)
                    yellow_mask_secondary = cv2.inRange(roi_secondary, yellow_lower, yellow_upper)
                    green_mask_primary = cv2.inRange(roi_primary, green_lower, green_upper)
                    green_mask_secondary = cv2.inRange(roi_secondary, green_lower, green_upper)

                    note_detected = (cv2.countNonZero(yellow_mask_primary) > 100 or
                                     cv2.countNonZero(yellow_mask_secondary) > 100 or
                                     cv2.countNonZero(green_mask_primary) > 100 or
                                     cv2.countNonZero(green_mask_secondary) > 100)

                    if note_detected and not state['pressed']:
                        keyboard.press(lane_key)
                        state['pressed'] = True
                    elif not note_detected and state['pressed']:
                        keyboard.release(lane_key)
                        state['pressed'] = False

            if use_preview:
                cv2.imshow("Detection Preview", frame)
                if cv2.waitKey(1) & 0xFF == 27:  # ESC key quits
                    cleanup_and_exit()

except KeyboardInterrupt:
    cleanup_and_exit()

except Exception as e:
    print(f"Error: {e}")
    cleanup_and_exit()
# All Makt åt Tengil, vår befriare!

MarOnic
What is cheating?
What is cheating?
Posts: 1
Joined: Fri Jul 04, 2025 5:30 pm
Reputation: 0

Re: [REQUEST] Persona 5 : The Phantom X

Post by MarOnic »

Hoping we get something good out of this at some point, especially with the new update and boss out.

qwereder
Noobzor
Noobzor
Posts: 12
Joined: Fri Aug 05, 2022 3:37 am
Reputation: 1

Re: [REQUEST] Persona 5 : The Phantom X

Post by qwereder »

Tengil wrote:
Fri Jul 11, 2025 12:28 am
cicion wrote:
Sun Jul 06, 2025 10:02 pm
I look forward to when someone makes it for a perfect score for the rhythm band minigames and for home runs for baseball mini game. Would love for that
As I have a close friend who literally is unable to perform the rythm games. They have a disability, and unfortunely S*GA does not include any tools for accessability on this area.
We created a python-script bot that watches the game and prompts keypresses automatically.

It's essentially an overengineered autoclicker.

Code: Select all

import time
import cv2
import numpy as np
import sys
import mss
import win32gui
import threading
import msvcrt
import keyboard 
print("Starting in 3 seconds... Remember to change the games resolution to 1280*720 and run in window mode.")
time.sleep(3)
print("Running. Press 1 to start/pause detection. Press 2 to quit.")

lanes = {
    's': {
        'coords_primary': (175, 505),
        'coords_secondary': (138, 455),
        'key': 's'
    },
    'd': {
        'coords_primary': (379, 573),
        'coords_secondary': (329, 538),
        'key': 'd'
    },
    'f': {
        'coords_primary': (579, 585),
        'coords_secondary': (519, 572),
        'key': 'f'
    },
    'j': {
        'coords_primary': (776, 572),
        'coords_secondary': (714, 582),
        'key': 'j'
    },
    'k': {
        'coords_primary': (962, 537),
        'coords_secondary': (912, 565),
        'key': 'k'
    },
    'l': {
        'coords_primary': (1154, 452),
        'coords_secondary': (1108, 495),
        'key': 'l'
    }
}

lane_states = {key: {'pressed': False} for key in lanes}

yellow_rgb = (249, 244, 42)
yellow_bgr = yellow_rgb[::-1]
yellow_hsv = cv2.cvtColor(np.uint8([[yellow_bgr]]), cv2.COLOR_BGR2HSV)[0][0]
h_y, s_y, v_y = yellow_hsv
yellow_lower = np.array([max(h_y - 9, 0), 160, 160])
yellow_upper = np.array([min(h_y + 9, 179), 255, 255])

green_rgb = (83, 220, 0)
green_bgr = green_rgb[::-1]
green_hsv = cv2.cvtColor(np.uint8([[green_bgr]]), cv2.COLOR_BGR2HSV)[0][0]
h_g, s_g, v_g = green_hsv
green_lower = np.array([max(h_g - 10, 0), 160, 160])
green_upper = np.array([min(h_g + 10, 179), 255, 255])

RADIUS = 9

detection_enabled = False
exit_flag = False

use_preview = input("Show detection preview window? (y/n): ").strip().lower() == 'y'

if use_preview:
    cv2.namedWindow("Detection Preview", cv2.WINDOW_NORMAL)
    cv2.resizeWindow("Detection Preview", 1366, 768)

def get_window_rect(window_name="Persona5: The Phantom X"):
    hwnd = win32gui.FindWindow(None, window_name)
    if hwnd == 0:
        return None
    rect = win32gui.GetWindowRect(hwnd)
    return rect  # (left, top, right, bottom)

def cleanup_and_exit():
    global exit_flag
    exit_flag = True
    print("Shutting down...")
    # Release any keys still pressed
    for key, state in lane_states.items():
        if state['pressed']:
            keyboard.release(lanes[key]['key'])
            state['pressed'] = False
    if use_preview:
        cv2.destroyAllWindows()
    sys.exit(0)

def key_listener():
    global detection_enabled
    while not exit_flag:
        if msvcrt.kbhit():
            key = msvcrt.getch()
            if key == b'1':
                detection_enabled = not detection_enabled
                print("Detection", "enabled." if detection_enabled else "paused.")
            elif key == b'2':
                cleanup_and_exit()
        time.sleep(0.05)

listener_thread = threading.Thread(target=key_listener, daemon=True)
listener_thread.start()

try:
    with mss.mss() as sct:
        while not exit_flag:
            rect = get_window_rect()
            if rect is None:
                print("P5X window not found. Waiting...")
                time.sleep(1)
                continue

            left, top, right, bottom = rect
            width = right - left
            height = bottom - top

            capture_width = min(1366, width)
            capture_height = min(768, height)

            monitor = {
                "top": top,
                "left": left,
                "width": capture_width,
                "height": capture_height
            }

            screenshot = sct.grab(monitor)
            frame = np.array(screenshot)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGRA2BGR)
            hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

            if use_preview:
                for data in lanes.values():
                    x1, y1 = data['coords_primary']
                    x2, y2 = data['coords_secondary']
                    if 0 <= x1 < capture_width and 0 <= y1 < capture_height:
                        cv2.circle(frame, (x1, y1), RADIUS, (255, 255, 255), 2)
                    if 0 <= x2 < capture_width and 0 <= y2 < capture_height:
                        cv2.circle(frame, (x2, y2), RADIUS, (255, 255, 255), 2)

            if detection_enabled:
                for key, data in lanes.items():
                    x1, y1 = data['coords_primary']
                    x2, y2 = data['coords_secondary']
                    lane_key = data['key']
                    state = lane_states[key]

                    def get_roi(hsv_img, x, y):
                        x_min = max(0, x - RADIUS)
                        x_max = min(hsv_img.shape[1], x + RADIUS)
                        y_min = max(0, y - RADIUS)
                        y_max = min(hsv_img.shape[0], y + RADIUS)
                        return hsv_img[y_min:y_max, x_min:x_max]

                    roi_primary = get_roi(hsv, x1, y1)
                    roi_secondary = get_roi(hsv, x2, y2)

                    yellow_mask_primary = cv2.inRange(roi_primary, yellow_lower, yellow_upper)
                    yellow_mask_secondary = cv2.inRange(roi_secondary, yellow_lower, yellow_upper)
                    green_mask_primary = cv2.inRange(roi_primary, green_lower, green_upper)
                    green_mask_secondary = cv2.inRange(roi_secondary, green_lower, green_upper)

                    note_detected = (cv2.countNonZero(yellow_mask_primary) > 100 or
                                     cv2.countNonZero(yellow_mask_secondary) > 100 or
                                     cv2.countNonZero(green_mask_primary) > 100 or
                                     cv2.countNonZero(green_mask_secondary) > 100)

                    if note_detected and not state['pressed']:
                        keyboard.press(lane_key)
                        state['pressed'] = True
                    elif not note_detected and state['pressed']:
                        keyboard.release(lane_key)
                        state['pressed'] = False

            if use_preview:
                cv2.imshow("Detection Preview", frame)
                if cv2.waitKey(1) & 0xFF == 27:  # ESC key quits
                    cleanup_and_exit()

except KeyboardInterrupt:
    cleanup_and_exit()

except Exception as e:
    print(f"Error: {e}")
    cleanup_and_exit()
# All Makt åt Tengil, vår befriare!
Does it work for persona?

Sindacait
What is cheating?
What is cheating?
Posts: 1
Joined: Sun Feb 07, 2021 7:59 pm
Reputation: 0

Re: [REQUEST] Persona 5 : The Phantom X

Post by Sindacait »

qwereder wrote:
Fri Jul 11, 2025 9:06 am

Does it work for persona?
Yeah. Steam release version specifically. Unless you get can Google Play to adjust resolutions properly (I can't).

Huge Thank you to Tengil for the script. Works beautifully.

Post Reply

Who is online

Users browsing this forum: demorest2, Google Adsense [Bot], Heongae, laissr