Skip to content

Commit ea26125

Browse files
committed
refactor getCutsceneID
1 parent 8a1a806 commit ea26125

File tree

4 files changed

+106
-14
lines changed

4 files changed

+106
-14
lines changed

area/zanarkand.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import battle.main
22
import logs
3+
import memory.get
34
import memory.main
45
import menu
56
import rngTrack
@@ -461,7 +462,7 @@ def post_Yunalesca(checkpoint=0):
461462
elif memory.main.diagSkipPossible() and not memory.main.battleActive():
462463
xbox.tapB()
463464
elif memory.main.cutsceneSkipPossible():
464-
print(memory.main.getCutsceneID())
465-
if memory.main.getCutsceneID() == (5673, 2850, 3):
465+
print(memory.get.cutsceneID())
466+
if memory.get.cutsceneID() == (5673, 2850, 3):
466467
memory.main.waitFrames(10)
467468
xbox.skipScene()

memory/get.py

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
import ctypes
2+
import ctypes.wintypes
3+
import os.path
4+
5+
from ReadWriteMemory import Process, ReadWriteMemory
6+
7+
import memory.main
8+
9+
PROCESS_QUERY_INFORMATION = 0x0400
10+
MAX_PATH = 260
11+
baseValue = 0
12+
13+
14+
class LocProcess(Process):
15+
def __init__(self, *args, **kwargs):
16+
super(LocProcess, self).__init__(*args, **kwargs)
17+
18+
def readBytes(self, lp_base_address: int, size: int = 4):
19+
"""
20+
See the original ReadWriteMemory values for details on how this works. This version allows us to pass
21+
the number of bytes to be retrieved instead of a static 4-byte size. Default is 4 for reverse-compatibility
22+
"""
23+
try:
24+
read_buffer = ctypes.c_uint()
25+
lp_buffer = ctypes.byref(read_buffer)
26+
lp_number_of_bytes_read = ctypes.c_ulong(0)
27+
ctypes.windll.kernel32.ReadProcessMemory(self.handle, lp_base_address, lp_buffer,
28+
size, lp_number_of_bytes_read)
29+
return read_buffer.value
30+
except (BufferError, ValueError, TypeError) as error:
31+
if self.handle:
32+
self.close()
33+
self.error_code = self.get_last_error()
34+
error = {'msg': str(error), 'Handle': self.handle, 'PID': self.pid,
35+
'Name': self.name, 'ErrorCode': self.error_code}
36+
ReadWriteMemoryError(error)
37+
38+
def writeBytes(self, lp_base_address: int, value: int, size: int = 4) -> bool:
39+
"""
40+
Same as above, write a passed number of bytes instead of static 4 bytes. Default is 4 for reverse-compatibility
41+
"""
42+
try:
43+
write_buffer = ctypes.c_uint(value)
44+
lp_buffer = ctypes.byref(write_buffer)
45+
lp_number_of_bytes_written = ctypes.c_ulong(0)
46+
ctypes.windll.kernel32.WriteProcessMemory(self.handle, lp_base_address, lp_buffer,
47+
size, lp_number_of_bytes_written)
48+
return True
49+
except (BufferError, ValueError, TypeError) as error:
50+
if self.handle:
51+
self.close()
52+
self.error_code = self.get_last_error()
53+
error = {'msg': str(error), 'Handle': self.handle, 'PID': self.pid,
54+
'Name': self.name, 'ErrorCode': self.error_code}
55+
ReadWriteMemoryError(error)
56+
57+
58+
class FFXMemory(ReadWriteMemory):
59+
def __init__(self, *args, **kwargs):
60+
super(FFXMemory, self).__init__(*args, **kwargs)
61+
self.process = LocProcess()
62+
63+
def get_process_by_name(self, process_name: str | bytes) -> "Process":
64+
"""
65+
:description: Get the process by the process executabe\'s name and return a Process object.
66+
67+
:param process_name: The name of the executable file for the specified process for example, my_program.exe.
68+
69+
:return: A Process object containing the information from the requested Process.
70+
"""
71+
if not process_name.endswith('.exe'):
72+
self.process.name = process_name + '.exe'
73+
74+
process_ids = self.enumerate_processes()
75+
76+
for process_id in process_ids:
77+
self.process.handle = ctypes.windll.kernel32.OpenProcess(PROCESS_QUERY_INFORMATION, False, process_id)
78+
if self.process.handle:
79+
image_file_name = (ctypes.c_char * MAX_PATH)()
80+
if ctypes.windll.psapi.GetProcessImageFileNameA(self.process.handle, image_file_name, MAX_PATH) > 0:
81+
filename = os.path.basename(image_file_name.value)
82+
if filename.decode('utf-8') == process_name:
83+
self.process.pid = process_id
84+
self.process.name = process_name
85+
return self.process
86+
self.process.close()
87+
88+
raise ReadWriteMemoryError(f'Process "{self.process.name}" not found!')
89+
90+
91+
rwm = FFXMemory()
92+
process = rwm.get_process_by_name('FFX.exe')
93+
94+
95+
def cutsceneID():
96+
global baseValue
97+
key = baseValue + 0xD27C88
98+
cutscene_alt = process.readBytes(key, 4)
99+
storyline_prog = memory.main.getStoryProgress()
100+
dialogue = memory.main.diagProgressFlag()
101+
return (cutscene_alt, storyline_prog, dialogue)

memory/main.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ def readBytes(self, lp_base_address: int, size: int = 4):
3939
try:
4040
read_buffer = ctypes.c_uint()
4141
lp_buffer = ctypes.byref(read_buffer)
42-
n_size = ctypes.sizeof(read_buffer)
4342
lp_number_of_bytes_read = ctypes.c_ulong(0)
4443
ctypes.windll.kernel32.ReadProcessMemory(self.handle, lp_base_address, lp_buffer,
4544
size, lp_number_of_bytes_read)
@@ -59,7 +58,6 @@ def writeBytes(self, lp_base_address: int, value: int, size: int = 4) -> bool:
5958
try:
6059
write_buffer = ctypes.c_uint(value)
6160
lp_buffer = ctypes.byref(write_buffer)
62-
n_size = ctypes.sizeof(write_buffer)
6361
lp_number_of_bytes_written = ctypes.c_ulong(0)
6462
ctypes.windll.kernel32.WriteProcessMemory(self.handle, lp_base_address, lp_buffer,
6563
size, lp_number_of_bytes_written)
@@ -143,15 +141,6 @@ def float_from_integer(integer):
143141
return struct.unpack('!f', struct.pack('!I', integer))[0]
144142

145143

146-
def getCutsceneID():
147-
global baseValue
148-
key = baseValue + 0xD27C88
149-
cutscene_alt = process.readBytes(key, 4)
150-
storyline_prog = getStoryProgress()
151-
dialogue = diagProgressFlag()
152-
return (cutscene_alt, storyline_prog, dialogue)
153-
154-
155144
def waitFrames(frames: int):
156145
frames = max(round(frames), 1)
157146
global baseValue

xbox.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import vgamepad as vg
66

7+
import memory.get
78
import memory.main
89
import vars
910

@@ -119,7 +120,7 @@ def controllerHandle():
119120

120121

121122
def skipScene(fast_mode: bool = False):
122-
cutsceneID = memory.main.getCutsceneID()
123+
cutsceneID = memory.get.cutsceneID()
123124
print(cutsceneID)
124125
if not fast_mode or cutsceneID not in processed_cutscenes:
125126
print("Skip cutscene")

0 commit comments

Comments
 (0)