Skip to content

Instantly share code, notes, and snippets.

@MarkusMaal
Created January 30, 2024 16:22
Show Gist options
  • Select an option

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

Select an option

Save MarkusMaal/d694c5847e0277cba9b3ba9a68b3e493 to your computer and use it in GitHub Desktop.
Free camera in Flipnic (PS2)
These are offsets in PlayStation 2 memory and for the PAL version of the game. These offsets will be different for other versions of the game.
To help you find the correct offsets for your version of the game, load the Metallurgy A stage (a 5-minute demo of this stage is immediately accessible even if you don't have a completed save file) and after letting the animation play, search for this array of bytes in memory: 4A F0 40 44 00 00 D0 41 BA 18 1D 44 00 00 80 3F 4A 30 47 44 FC FF FF 3F BA D8 16 44 00 00 80 3F 00 00 00 00 00 00 00 00 (the trailing zeroes are needed to make sure we only get a single search result)
TIP: You can pause the game if you only have access to the demo. The game will freeze the timer, while still letting you control the camera in memory!
You can edit the memory in PCSX2 nightly builds if you open the debugger under the "Debug" menu (this needs to be enabled in preferences) and go to the "Memory Search" subtab under R5900 tab. Then set type to "Array of byte", enter this value and hit the "Search" button.
The beginning of this array of byte is where the "PosRotZ 1" value is normally stored. To get the offset for FOV, subtract 0x10, to get the offset for Camera Lock, add 0x30 to the offset.
Note 1: Enable camera lock FIRST, before messing with FOV or control pairs, by setting the value stored in the offset to 0xFF! Failure to do so will cause the game to use FPC sequences, which are different accross stages.
Note 2: The endianness of the values in memory is LE. This means that the bytes are read in the direction of end to beginning to get the current value (e.g. in memory 44 F0 40 44 would be equal to 0x4440F044)
Note 3: The following method does not allow controlling camera in Evolution stages and while the multiball mode is active.
003991A0: Camera Lock
00399160: FOV
Control pairs:
00399170: PosRotZ 1
00399180: PosRotZ 2
00399174: PosRotY 1
00399184: PosRotY 2
00399178: PosRotX 1
00399188: PosRotX 2
To move around, increment the value of control pairs at the same time. E.g. if PosRotZ 1 is 0x4440F04A and PosRotZ 2 is 0x4447304A, and you want to move the camera left by 0x1000 units, set the values to 0x4441004A and 0x4447404A respectively.
To rotate without changing position, increment the value of a single value of pair (e.g. by +0x10), then reverse increment the other one (e.g. by -0x10). For example, if you want to rotate the camera left on the horizontal axis by 1000 units without affecting the position and PosRotZ 1 = 0x4440F04A, PosRotZ 2 = 0x4447304A, set PosRotZ 1 to 0x4441004A and PosRotZ 2 to 0x4447204A.
Undocumented memory offsets for values in other stages (PAL only):
BE69F0: Ball Spawn Position in Geometry?
00B90668: BallY in Geometry?
In Optics?
Player 1 controls @ 0x10ECEA0 ?
In Evolution A?
Player 1 controls @ 0xEE43C0 ?
EE43F0?
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment