-- Lua 5.3
-- Title: Star Wars Episode I: The Phantom Menace
-- Author: Ali Burakaz
print ("---------------------------------------------------------------------------------------")
print ("_NOTE: OPENING patches.lua")
print ("---------------------------------------------------------------------------------------")
--
-- Initialization
--
local id = EM_GetLegacyTitleId()
id = string.sub(id, 5) -- just need the identifying numbers
print ("_NOTE: ID = ", id)
local NOP = 0
local control_locked = false
local in_turret = false
local turret_control_pointer = 0
local turret_control = 0
if id == "00884" then
print ("---------------------------------------------------------------------------------------")
print ("Trophy Region: SIEA")
print ("---------------------------------------------------------------------------------------")
i_enter_turret = {0x30fa8, 0x90820003}
i_exit_turret = {0x030fc4, 0x9082000e}
i_vsync_start = {0x011248, 0x96648a34}
i_set_vsync = {0x11238, 0xACA37914}
mem_vsyncs = 0x77914
elseif id == "02034" then
print ("---------------------------------------------------------------------------------------")
print ("Patch Region: SIEE EN")
print ("---------------------------------------------------------------------------------------")
i_vsync_start = {0x011248, 0x96648a90}
--i_set_vsync = {0x11238, 0xaca37940}
mem_vsyncs = 0x77940
i_enter_turret = {0x30fd8, 0x90820003}
i_exit_turret = {0x30ff8, 0xa480000e}
credits_vpos_hack = {0x8001b780, 0x8001b798}
elseif id == "02035" then
print ("---------------------------------------------------------------------------------------")
print ("Patch Region: SIEE FR")
print ("---------------------------------------------------------------------------------------")
i_vsync_start = {0x011248, 0x96648fa4}
--i_set_vsync = {0x11238, 0xaca3795c}
mem_vsyncs = 0x07795C
i_enter_turret = {0x30fdc, 0x90820003}
i_exit_turret = {0x30ffc, 0xa480000e}
credits_vpos_hack = {0x8001b770, 0x8001b788}
elseif id == "02037" then
print ("---------------------------------------------------------------------------------------")
print ("Patch Region: SIEE IT")
print ("---------------------------------------------------------------------------------------")
i_vsync_start = {0x011248, 0x96648d38}
--i_set_vsync = {0x11238, 0xaca3791c}
mem_vsyncs = 0x07791c
i_enter_turret = {0x30fb4, 0x90820003}
i_exit_turret = {0x030fd0, 0x9082000e}
credits_vpos_hack = {0x8001b748, 0x8001b760}
elseif id == "02036" then
print ("---------------------------------------------------------------------------------------")
print ("Patch Region: SIEE DE")
print ("---------------------------------------------------------------------------------------")
i_vsync_start = {0x011248, 0x96648dd4}
--i_set_vsync = {0x11238, 0xaca3791c}
mem_vsyncs = 0x07791c
i_enter_turret = {0x30fb4, 0x90820003}
i_exit_turret = {0x030fd0, 0x9082000e}
credits_vpos_hack = {0x8001b748, 0x8001b760}
elseif id == "02038" then
print ("---------------------------------------------------------------------------------------")
print ("Patch Region: SIEE ES")
print ("---------------------------------------------------------------------------------------")
i_vsync_start = {0x011248, 0x96648ea4}
--i_set_vsync = {0x01125C, 0xaca37920}
mem_vsyncs = 0x077920
i_enter_turret = {0x30fb8, 0x90820003}
i_exit_turret = {0x030FD4, 0x9082000e}
credits_vpos_hack = {0x8001b74c, 0x8001b764}
elseif id == "02153" then
print ("---------------------------------------------------------------------------------------")
print ("Patch Region: SIEJ")
print ("---------------------------------------------------------------------------------------")
i_enter_turret = {0x032980, 0x90820003}
i_exit_turret = {0x03299C, 0x9082000e}
i_vsync_start = {0x0112C4, 0x8668aacc}
--i_set_vsync = {0x0112BC, 0xac829cec}
mem_vsyncs = 0x79CEC
end
--Disable the code for dynamic framerate, and force to 30FPS (VSYNC wait of 2)
local function vsync_lock()
--If never entered turret, default to 30fps
if turret_control_pointer == 0 then
R3K_WriteMem8(mem_vsyncs, 2)
R3K_WriteMem8(mem_vsyncs + 0xC, 2)
return
end
--If in turret, do not lock FPS because game cant keep up with 30
if R3K_ReadMem16(turret_control_pointer + 0xE) == 1 and R3K_ReadMem32(turret_control_pointer + 0xA) == turret_control then
--
else
R3K_WriteMem8(mem_vsyncs, 2)
R3K_WriteMem8(mem_vsyncs + 0xC, 2)
end
end
local function enter_turret()
in_turret = true
turret_control_pointer = R3K_GetGpr(gpr.a0)
turret_control = R3K_ReadMem32(turret_control_pointer + 0xA)
print(string.format("Entering Turret ptr: %x control %x", turret_control_pointer, turret_control))
end
local function exit_turret()
in_turret = false
turret_control_pointer = R3K_GetGpr(gpr.a0)
turret_control = R3K_ReadMem32(turret_control_pointer + 0xA)
print(string.format("Exiting Turret ptr: %x control %x", turret_control_pointer, turret_control))
end
--R3K_InsnReplace(i_set_vsync[1], i_set_vsync[2], NOP)
R3K_AddHook(i_vsync_start[1], i_vsync_start[2], vsync_lock)
R3K_AddHook(i_enter_turret[1], i_enter_turret[2], enter_turret)
R3K_AddHook(i_exit_turret[1], i_exit_turret[2], exit_turret)
print("30FPS VSync lock activated. Only a Sith deals in FPS below 30.")
---------------------------------------------------------------------------
local function vpos_hack()
R3K_SetGpr(gpr.a2, 64)
end
if credits_vpos_hack ~= nil then
R3K_AddHook(credits_vpos_hack[1], 0x24070140, vpos_hack)
R3K_AddHook(credits_vpos_hack[2], 0x24070140, vpos_hack)
end