Last active
December 31, 2025 02:59
-
-
Save MarkusMaal/bc9b2d7497d67cb1a17e1ad1d61ca0eb to your computer and use it in GitHub Desktop.
Cheat Engine Cheat Table for Flipnic running on PCSX2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?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("<f", fpcL:read(4))) | |
| writeFloat(address+camOriginY, string.unpack("<f", fpcL:read(4))) | |
| writeFloat(address+camOriginX, string.unpack("<f", fpcL:read(4))) | |
| writeFloat(address+camFOV, string.unpack("<f", fpcL:read(4))) | |
| writeFloat(address+camTargetZ, string.unpack("<f", fpcL:read(4))) | |
| writeFloat(address+camTargetY, string.unpack("<f", fpcL:read(4))) | |
| writeFloat(address+camTargetX, string.unpack("<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("<f", readFloat(address+camOriginZ))) | |
| fpc:write(string.pack("<f", readFloat(address+camOriginY))) | |
| fpc:write(string.pack("<f", readFloat(address+camOriginX))) | |
| fpc:write(string.pack("<f", readFloat(address+camFOV))) | |
| fpc:write(string.pack("<f", readFloat(address+camTargetZ))) | |
| fpc:write(string.pack("<f", readFloat(address+camTargetY))) | |
| fpc:write(string.pack("<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