Skip to content

Instantly share code, notes, and snippets.

@MarkusMaal
Last active December 31, 2025 02:59
Show Gist options
  • Select an option

  • Save MarkusMaal/bc9b2d7497d67cb1a17e1ad1d61ca0eb to your computer and use it in GitHub Desktop.

Select an option

Save MarkusMaal/bc9b2d7497d67cb1a17e1ad1d61ca0eb to your computer and use it in GitHub Desktop.
Cheat Engine Cheat Table for Flipnic running on PCSX2
<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="45">
<Forms>
<FlipnicFreecam Class="TCEForm" Encoding="Ascii85">rC3^U8b:gfAZ8aZj[o8)n(vW1/6N4:N$fTcma5hU6I-$a3Z$]-,i1KDF!C{)X9gTseX9D/sxN**59lwcs.aMj;r4Mg]qJ48usbZU+s^d3-ZST%=_kRB^Ch;yDy6}]y@]B3P{Z6(Sh!8FSzrj6uyt,,*kWe=Ho1jxqbU,BmZ.En.[vv)Yg]jed7oW31?598C4x}*(+U}M44Ow9kge,L#B5T:Gc*i:p3=LjYzs[D@1NpRcvfa{7Dhz$ZDid0o^39RITs9KBKYzyeA{11s5{TifXRphnDh=J/xw4WEU]-o7L?7fT5DGd+#Sw{A7yc3Aw5(*WdTo$M1n}cNx4an@}:F^y;X:FgSir962b/}/6T-qhEbv%,u-$uHZ2_##B9l(6hSO(AJ]?p$nCJ^Iu_cc7qRqCZs$wHxE)QlW!e6FqNOBH8yz7iN%g*wbx4ZOdK_@yw/)I;bQy{?;qkAl[ed]i8Cvs5zpl95+X2B)FOpr[.plY{AuCUhiGF94d^A!AfACdXzdiZbtF{;rhecLHEUsx][+Pte]N^YmOvJb1JRVq#X[[G_=!ZH2rOE:eoo{webkAVc$?$foXYp!3uaoe_mNeke29=?dgAAXsb++LGB+..VGQ+E.c3(o6hr2hS@nErAZ,{1@P}iF1jbQNpm=Ps!yc[AHpU1c#Yi7S;1*:6ALme:AQ=*,Orf]]ESglU5]qi-2;S)Lgkyg,7GRW_+UPaCY5-4tX77Klg+(?RYOdeDqYapRy%aB(L4iZ0U.c7u(Z8B8fAT_qou7DDu#2=x.CAOr5Xh@9Ns2RTti}Fv$S[X-qwQ1?:ZA-(iM@wY)i3i8m#G?)B]zs=E.9*-,5914DDcqHjJm;**[9F5yew@G1(xPrE+gGQ,dl7jE*Wc#mVi3Z5#@?kaPaA}l8G{%b7:%/H8LQEfaeUug3U[5;GNv@xQyHv]zU_TLp=c5y=Q;glYfC:bqQ^]sF]Gb8)4t*gL:ypN3NZ*{l;awv3y--ew@7R),y!rNC,e_.ToMz1X?,#S2{uJD4N^,dSE9eS#pCMO+WuAi,qJ;=AK:Q2#I,KR;*I{52)%e8F-M;a8HPjvS[fP%5*O:[email protected][*r,I1dAi^EFlskuf=0(Sk:T63/icH1M*Ru.^Mr{)(2d8XHW6t_4G8,:]Ph8}bSoqk#F(O*/kuhW66.Lbu@VpfjzN%EI?VVgFkI3tkWB.[g=w@s?^fNAt503q4JWM)EC-5+IoOls:m}!HsmWS#Yd8kI?VIes2qVX^0#GAmw.;gLcs!j%^v.Lz6r]Ip=f:N6UrTecc-9PcWHck7#5Yml4Rh*F(_DV0}zY)GR(lNDTYW8gFVst#[CAm8ElAN9/JJq.Ur,-PVp86%ZIx!b7hD7)70]s}P-S2xT?J;@HQd3COjP.J7W(ABN]Vo2fT/%7o;.8[k21?HY.ND9lAhzzO%K_pg8rZ-x[Kg#.QX0v^]R!JlGEpey^B(gcbht}+/4r8LF$U[4wm]$STgMjSfHFXdyq=g]UAeI{5Ru!OKs5+5Z?t]k*Au;.S[9HtpUsby04okDRd(g)vRo6%LZEMFw^Q(:%X#PCt?5RQl]nW3SlN@-+h65[j^Tz=e,VqxMe;4#x$JoQYtPd!2CIy%7*Z@!qZ-vxgSz{s?!0Q!D;5Sq5J+p%hu-M^fcJs]vYP{RTBwloAuv/}(t7B8lF:1[Aud0Un{_5.u_q^ou9h]Pg4}/:F(6fw;{/^4!S,KB,t-6Sb!_#E9sffR-ck=-oSX;pvOmG+6,XT7pQ^:6ilchR0)F@EqKP=;dp;RpJHs51En2H#)g5uaYg3N,s0@EZ=(V-0$8L_$v8PIsU2!Y8f?K(D?A{l)wzH:Tt.CNPq,.iv]nBN{=Fc*cnwFJXifu(l7_KG-,Fzwn[im/wg?uyNKW%57k{=YN/AnsAyp;x!kllsxgBD}+9e$9fW}U]/m;(ql#j-q,l*{:b/c.31=m72usf?nqAYvl@-N(_AdYi}00j*e^$+ZHay55#y7rFk}kyM=Xw.uz?(+tw3il1(XnbKM9e+</FlipnicFreecam>
</Forms>
<CheatEntries>
<CheatEntry>
<ID>0</ID>
<Description>"EEmemPointer"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>4 Bytes</VariableType>
<Address>eemem</Address>
<Offsets>
<Offset>0</Offset>
</Offsets>
<CheatEntries>
<CheatEntry>
<ID>10</ID>
<Description>"Camera"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>12</ID>
<Description>"Origin X"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>+399178</Address>
</CheatEntry>
<CheatEntry>
<ID>13</ID>
<Description>"Origin Y"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>+399174</Address>
</CheatEntry>
<CheatEntry>
<ID>14</ID>
<Description>"Origin Z"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>+399170</Address>
</CheatEntry>
<CheatEntry>
<ID>15</ID>
<Description>"Target X"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>+399188</Address>
</CheatEntry>
<CheatEntry>
<ID>16</ID>
<Description>"Target Y"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>+399184</Address>
</CheatEntry>
<CheatEntry>
<ID>17</ID>
<Description>"Target Z"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>+399180</Address>
</CheatEntry>
<CheatEntry>
<ID>18</ID>
<Description>"Field Of View"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Float</VariableType>
<Address>+399160</Address>
</CheatEntry>
<CheatEntry>
<ID>11</ID>
<Description>"Camera Lock"</Description>
<ShowAsHex>1</ShowAsHex>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Byte</VariableType>
<Address>+3991a0</Address>
</CheatEntry>
</CheatEntries>
</CheatEntry>
<CheatEntry>
<ID>21</ID>
<Description>"Utility"</Description>
<GroupHeader>1</GroupHeader>
<CheatEntries>
<CheatEntry>
<ID>20</ID>
<Description>"OSD"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>Byte</VariableType>
<Address>+112911c</Address>
</CheatEntry>
<CheatEntry>
<ID>19</ID>
<Description>"Stage Directory"</Description>
<ShowAsSigned>0</ShowAsSigned>
<VariableType>String</VariableType>
<Length>32</Length>
<Unicode>0</Unicode>
<CodePage>0</CodePage>
<ZeroTerminate>1</ZeroTerminate>
<Address>+2b0014</Address>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
</CheatEntry>
</CheatEntries>
<UserdefinedSymbols/>
<LuaScript>-- name of the pcsx2 executable
PROCESS_NAME = "pcsx2-qt.exe"
-- set to EEmem
--local address = 0x7FF7B0000000
address = getAddressList().getMemoryRecordByDescription("EEmemPointer").CurrentAddress
-- set to camera lock location for your
-- version of the game
local camLoc = 0x3991A0
-- don't touch these
step = 0.5
substep = 1
local camOriginX = camLoc - 0x28
local camOriginY = camLoc - 0x2C
local camOriginZ = camLoc - 0x30
local camTargetX = camLoc - 0x18
local camTargetY = camLoc - 0x1C
local camTargetZ = camLoc - 0x20
local camFOV = camLoc - 0x40
stageDirAddr = camLoc - 0xE918C
local region = "N/A"
enabled = false
frm = nil
for i = 0, getFormCount() - 1 do
if (getForm(i).Caption == 'Flipnic Freecam') then
frm = getForm(i)
end
end
if (frm == nil) then
frm.CELabel6.Caption = "Please hook PCSX2 before running this script!"
return
end
function UpdateValue(originAddr, increment)
local originX = readFloat(address+originAddr) + increment
local targetX = readFloat(address+originAddr+0x10) + increment
writeFloat(address+originAddr, originX)
writeFloat(address+originAddr+0x10, targetX)
end
function UpdateTarget(targetAddr, increment)
local targetX = readFloat(address+targetAddr) + increment
writeFloat(address+targetAddr, targetX)
end
function UpdateOrigin(originAddr, increment)
local originX = readFloat(address+originAddr) + increment
writeFloat(address+originAddr, originX)
end
function FlipnicFreecam_CEButton1Click(sender)
UpdateValue(camOriginX, -step * substep)
end
function FlipnicFreecam_CEButton2Click(sender)
UpdateValue(camOriginX, step * substep)
end
function FlipnicFreecam_CETrackBar1Change(sender)
step = sender.Position * 0.5
end
function FlipnicFreecam_YMinusButtonClick(sender)
UpdateValue(camOriginY, -step * substep)
end
function FlipnicFreecam_YPlusButtonClick(sender)
UpdateValue(camOriginY, step * substep)
end
function FlipnicFreecam_ZMinusButtonClick(sender)
UpdateValue(camOriginZ, -step * substep)
end
function FlipnicFreecam_ZPlusButtonClick(sender)
UpdateValue(camOriginZ, step * substep)
end
function FlipnicFreecam_XTargetMinusButtonClick(sender)
UpdateTarget(camTargetX, -step * substep)
end
function FlipnicFreecam_XTargetPlusButtonClick(sender)
UpdateTarget(camTargetX, step * substep)
end
function FlipnicFreecam_YTargetMinusButtonClick(sender)
UpdateTarget(camTargetY, -step * substep)
end
function FlipnicFreecam_YTargetPlusButtonClick(sender)
UpdateTarget(camTargetY, step * substep)
end
function FlipnicFreecam_ZTargetMinusButtonClick(sender)
UpdateTarget(camTargetZ, -step * substep)
end
function FlipnicFreecam_ZTargetPlusButtonClick(sender)
UpdateTarget(camTargetZ, step * substep)
end
function FlipnicFreecam_CETrackBar2Change(sender)
substep = sender.Position * 0.01
end
function FlipnicFreecam_CEButton3Click(sender)
writeByte(address+camLoc, 0xFF)
end
function FlipnicFreecam_CEButton4Click(sender)
writeByte(address+camLoc, 0x0)
end
function FlipnicFreecam_XOriginMinusButtonClick(sender)
UpdateOrigin(camOriginX, -step * substep)
end
function FlipnicFreecam_XOriginPlusButtonClick(sender)
UpdateOrigin(camOriginX, step * substep)
end
function FlipnicFreecam_YOriginMinusButtonClick(sender)
UpdateOrigin(camOriginY, -step * substep)
end
function FlipnicFreecam_YOriginPlusButtonClick(sender)
UpdateOrigin(camOriginY, step * substep)
end
function FlipnicFreecam_ZOriginMinusButtonClick(sender)
UpdateOrigin(camOriginZ, -step * substep)
end
function FlipnicFreecam_ZOriginPlusButtonClick(sender)
UpdateOrigin(camOriginZ, step * substep)
end
function FlipnicFreecam_CETrackBar3Change(sender)
if (frm.EnableFCCheck.Checked == true) then
writeFloat(address+camFOV, sender.Position * 0.25)
end
end
function FlipnicFreecam_CEButton1MouseWheelDown(sender, x, y)
UpdateValue(camOriginX, -step * substep)
end
function FlipnicFreecam_CEButton1MouseWheelUp(sender, x, y)
UpdateValue(camOriginX, step * substep)
end
function FlipnicFreecam_YMinusButtonMouseWheelDown(sender, x, y)
UpdateValue(camOriginY, -step * substep)
end
function FlipnicFreecam_YMinusButtonMouseWheelUp(sender, x, y)
UpdateValue(camOriginY, step * substep)
end
function FlipnicFreecam_ZMinusButtonMouseWheelDown(sender, x, y)
UpdateValue(camOriginZ, -step * substep)
end
function FlipnicFreecam_ZMinusButtonMouseWheelUp(sender, x, y)
UpdateValue(camOriginZ, step * substep)
end
function FlipnicFreecam_XTargetMinusButtonMouseWheelDown(sender, x, y)
UpdateTarget(camTargetX, -step * substep)
end
function FlipnicFreecam_XTargetMinusButtonMouseWheelUp(sender, x, y)
UpdateTarget(camTargetX, step * substep)
end
function FlipnicFreecam_YTargetMinusButtonMouseWheelDown(sender, x, y)
UpdateTarget(camTargetY, -step * substep)
end
function FlipnicFreecam_YTargetMinusButtonMouseWheelUp(sender, x, y)
UpdateTarget(camTargetY, step * substep)
end
function FlipnicFreecam_ZTargetMinusButtonMouseWheelDown(sender, x, y)
UpdateTarget(camTargetZ, -step * substep)
end
function FlipnicFreecam_ZTargetMinusButtonMouseWheelUp(sender, x, y)
UpdateTarget(camTargetZ, step * substep)
end
function FlipnicFreecam_XOriginMinusButtonMouseWheelDown(sender, x, y)
UpdateOrigin(camOriginX, -step * substep)
end
function FlipnicFreecam_XOriginMinusButtonMouseWheelUp(sender, x, y)
UpdateOrigin(camOriginX, step * substep)
end
function FlipnicFreecam_YOriginMinusButtonMouseWheelDown(sender, x, y)
UpdateOrigin(camOriginY, -step * substep)
end
function FlipnicFreecam_YOriginMinusButtonMouseWheelUp(sender, x, y)
UpdateOrigin(camOriginY, step * substep)
end
function FlipnicFreecam_ZOriginMinusButtonMouseWheelDown(sender, x, y)
UpdateOrigin(camOriginZ, -step * substep)
end
function FlipnicFreecam_ZOriginMinusButtonMouseWheelUp(sender, x, y)
UpdateOrigin(camOriginZ, step * substep)
end
function CheckRegion()
if (readString(address + 0x00022CBC4, 32) == "cdrom0:\\SLES_520.65;1") then
region = "PAL (Retail)"
camLoc = 0x3991A0
elseif (readString(address + 0x00022CC44, 32) == "cdrom0:\\SLUS_211.57;1") then
region = "NTSC-U (Retail)"
camLoc = 0x399220
elseif (readString(address + 0x00022C544, 32) == "cdrom0:\\SLUS_291.49;1") then
region = "NTSC-U (Demo)"
camLoc = 0x397B20
elseif (readString(address + 0x00022A6C4, 32) == "cdrom0:\\SCPS_150.50;1") then
region = "NTSC-J (Retail)"
camLoc = 0x396B20
else
region = "N/A"
end
if (region ~= "N/A") then
LocateMemory()
if (enabled == false) then
enabled = true
ToggleGray()
end
elseif (enabled == true) then
enabled = false
ToggleGray()
end
end
function LocateMemory()
camOriginX = camLoc - 0x28
camOriginY = camLoc - 0x2C
camOriginZ = camLoc - 0x30
camTargetX = camLoc - 0x18
camTargetY = camLoc - 0x1C
camTargetZ = camLoc - 0x20
camFOV = camLoc - 0x40
if (region == "NTSC-J (Retail)") then
stageDirAddr = 0x2ADAE4
elseif (region == "NTSC-U (Demo)") then
stageDirAddr = 0x2AF994
else
stageDirAddr = camLoc - 0xE918C
end
getAddressList().getMemoryRecordByDescription("Field Of View").address = "+" .. string.format("%x", camFOV)
getAddressList().getMemoryRecordByDescription("Camera Lock").address = "+" .. string.format("%x", camLoc)
getAddressList().getMemoryRecordByDescription("Origin X").address = "+" .. string.format("%x", camOriginX)
getAddressList().getMemoryRecordByDescription("Origin Y").address = "+" .. string.format("%x", camOriginY)
getAddressList().getMemoryRecordByDescription("Origin Z").address = "+" .. string.format("%x", camOriginZ)
getAddressList().getMemoryRecordByDescription("Target X").address = "+" .. string.format("%x", camTargetX)
getAddressList().getMemoryRecordByDescription("Target Y").address = "+" .. string.format("%x", camTargetY)
getAddressList().getMemoryRecordByDescription("Target Z").address = "+" .. string.format("%x", camTargetZ)
getAddressList().getMemoryRecordByDescription("Stage Directory").address = "+" .. string.format("%x", stageDirAddr)
getAddressList().getMemoryRecordByDescription("OSD").address = "+" .. string.format("%x", GetOSDOffset())
end
function FlipnicFreecam_CETimer1Timer(sender)
local OSDVal = readByte(address + GetOSDOffset())
if (OSDVal == nil) then
frm.CELabel6.Caption = "Error accessing EE memory region.\nDid you enable MEM_MAPPED in scan settings?"
return
end
CheckRegion()
UpdateTrackbar()
local stage = GetStage()
if (region ~= "N/A") then
frm.CELabel6.Caption = "Game version: " .. region .. "\nStage: " .. stage
else
frm.CELabel6.Caption = "Game not running"
end
if (stage == "Menu") then
frm.HideOSDCheck.Enabled = false
else
frm.HideOSDCheck.Enabled = true
end
if (OSDVal == 0x01) then
frm.HideOSDCheck.Checked = false
else
frm.HideOSDCheck.Checked = true
end
if (readByte(address+camLoc) ~= 0xFF) then
frm.EnableFCCheck.Checked = false
end
end
function GetStage()
local stageName = "N/A"
local stageDir = readString(address+stageDirAddr, 16)
if (stageDir == "MENU\\") then stageName = "Menu"
elseif (stageDir == "JUNGLE1\\") then stageName = "Biology A"
elseif (stageDir == "JUNGLE2\\") then stageName = "Biology B"
elseif (stageDir == "ISEKI1\\") then stageName = "Metallurgy A"
elseif (stageDir == "ISEKI2\\") then stageName = "Metallurgy B"
elseif (stageDir == "HIKARI1\\") then stageName = "Optics A"
elseif (stageDir == "HIKARI2\\") then stageName = "Optics B"
elseif (stageDir == "RETRO1\\") then stageName = "Geometry A"
elseif (stageDir == "BOSS1\\") then stageName = "Evolution A"
elseif (stageDir == "BOSS2\\") then stageName = "Evolution B"
elseif (stageDir == "BOSS3\\") then stageName = "Evolution C"
elseif (stageDir == "BOSS4\\") then stageName = "Evolution D"
elseif (stageDir == "VS1\\") then stageName = "Biology 2P"
elseif (stageDir == "VS2\\") then stageName = "Metallurgy 2P"
elseif (stageDir == "VS3\\") then stageName = "Optics 2P"
elseif (stageDir == "VS4\\") then stageName = "Geometry 2P"
end
if (region == "NTSC-J (Retail)") then
stageName = string.gsub(stageName, "Evolution", "Theology")
end
return stageName
end
function UpdateTrackbar()
local fov = readFloat(address+camFOV) * 4
frm.CETrackBar3.Position = fov
frm.CETrackBar2.Position = substep * 100
frm.CETrackBar1.Position = step * 2
end
function GetOSDOffset()
local offset = 0x0
local stageName = GetStage()
if (region == "PAL (Retail)") then offset = 0x112911C
elseif (region == "NTSC-U (Retail)") then offset = 0x112919C
elseif (region == "NTSC-U (Demo)") then offset = 0x112323D
elseif (region == "NTSC-J (Retail)") then
if (stageName == "Biology A") then offset = 0x112729C
elseif (stageName == "Metallurgy A") then offset = 0x1228EBC
elseif (stageName == "Optics A") then offset = 0xF37A5C
elseif (stageName == "Geometry A") then offset = 0x9271BC
elseif (stageName == "Theology A") then offset = 0xD8C64C
elseif (stageName == "Theology B") then offset = 0x10F72BC
elseif (stageName == "Theology C") then offset = 0xB042BC
elseif (stageName == "Theology D") then offset = 0x10D52BC
elseif (stageName == "Biology B") then offset = 0x117621C
elseif (stageName == "Metallurgy B") then offset = 0x122A8FC
elseif (stageName == "Optics B") then offset = 0xF2B25C
end
return offset
end
-- this part doesn't work properly on NTSC-J (Retail), different offsets are defined above
if (stageName == "Biology B") then offset = offset + 0x4F780
elseif (stageName == "Evolution A") then offset = offset - 0x39A450
elseif (stageName == "Evolution B") then offset = offset - 0x2F7E0
elseif (stageName == "Evolution C") then offset = offset - 0x6227E0
elseif (stageName == "Evolution D") then offset = offset - 0x517E0
elseif (stageName == "Metallurgy A") then offset = offset + 0x101C20
elseif (stageName == "Metallurgy B") then offset = offset + 0x103E60
elseif (stageName == "Optics A") then offset = offset - 0x1EF040
elseif (stageName == "Optics B") then offset = offset - 0x1FB840
elseif (stageName == "Geometry A") then offset = offset - 0x7FF8E0
end
return offset
end
function ToggleGray()
frm.CEButton1.Enabled = enabled
frm.CEButton2.Enabled = enabled
frm.EnableFCCheck.Enabled = enabled
frm.CETrackBar1.Enabled = enabled
frm.CETrackBar2.Enabled = enabled
frm.CETrackBar3.Enabled = enabled
frm.YMinusButton.Enabled = enabled
frm.ZMinusButton.Enabled = enabled
frm.YPlusButton.Enabled = enabled
frm.ZPlusButton.Enabled = enabled
frm.XTargetMinusButton.Enabled = enabled
frm.XTargetPlusButton.Enabled = enabled
frm.YTargetMinusButton.Enabled = enabled
frm.YTargetPlusButton.Enabled = enabled
frm.ZTargetMinusButton.Enabled = enabled
frm.ZTargetPlusButton.Enabled = enabled
frm.XOriginMinusButton.Enabled = enabled
frm.XOriginPlusButton.Enabled = enabled
frm.YOriginMinusButton.Enabled = enabled
frm.YOriginPlusButton.Enabled = enabled
frm.ZOriginMinusButton.Enabled = enabled
frm.ZOriginPlusButton.Enabled = enabled
frm.ImportFPCButton.Enabled = enabled
frm.HideOSDCheck.Enabled = enabled
frm.ImportFPCButton1.Enabled = enabled
end
function FlipnicFreecam_ImportFPCButtonClick(sender)
frm.OpenFPCDialog.execute()
fpcL = io.open(frm.OpenFPCDialog.FileName, "rb")
-- check if the user actually picked a file
fpcL:seek("set", 0x10)
writeFloat(address+camOriginZ, string.unpack("&lt;f", fpcL:read(4)))
writeFloat(address+camOriginY, string.unpack("&lt;f", fpcL:read(4)))
writeFloat(address+camOriginX, string.unpack("&lt;f", fpcL:read(4)))
writeFloat(address+camFOV, string.unpack("&lt;f", fpcL:read(4)))
writeFloat(address+camTargetZ, string.unpack("&lt;f", fpcL:read(4)))
writeFloat(address+camTargetY, string.unpack("&lt;f", fpcL:read(4)))
writeFloat(address+camTargetX, string.unpack("&lt;f", fpcL:read(4)))
fpcL:close()
end
function FlipnicFreecam_HideOSDCheckChange(sender)
local osdOffset = address + GetOSDOffset()
if (frm.HideOSDCheck.Checked == true) then
writeByte(osdOffset, 0x00)
else
writeByte(osdOffset, 0x01)
end
end
function FlipnicFreecam_EnableFCCheckChange(sender)
if (sender.Checked == true) then
writeByte(address+camLoc, 0xFF)
elseif (readByte(address+camLoc) == 0xFF) then
writeByte(address+camLoc, 0x00)
end
end
function FlipnicFreecam_ImportFPCButton1Click(sender)
-- show save dialog
frm.GenFPCDialog.execute()
-- check if the user actually picked a file
if (frm.GenFPCDialog.FileName == nil) then
return
end
-- only single frame is generated, animation generation is currently not supported
local fpc = io.open(frm.GenFPCDialog.FileName, "wb")
-- camera data offset (should always be 0x10)
fpc:seek("set", 0x8)
fpc:write("\16\0\0\0")
fpc:seek("set", 0x10)
-- camera data read from game memory
fpc:write(string.pack("&lt;f", readFloat(address+camOriginZ)))
fpc:write(string.pack("&lt;f", readFloat(address+camOriginY)))
fpc:write(string.pack("&lt;f", readFloat(address+camOriginX)))
fpc:write(string.pack("&lt;f", readFloat(address+camFOV)))
fpc:write(string.pack("&lt;f", readFloat(address+camTargetZ)))
fpc:write(string.pack("&lt;f", readFloat(address+camTargetY)))
fpc:write(string.pack("&lt;f", readFloat(address+camTargetX)))
-- pad 4 bytes
fpc:write(string.rep("\0", 4))
-- finalize file
fpc:close()
end
</LuaScript>
</CheatTable>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment