gametitle=Rugrats: Royal Ransom (U)(SLUS-20443) [Widescreen 16:9] gsaspectratio=16:9 author=ICUP321 description=Widescreen hack patch=1,EE,002D6EF0,word,3c013fe3 //3c013faa patch=1,EE,002D6EF4,word,34218e38 //3421aaab [60 FPS] author=asasega and Souzooka description=Unlocks internal FPS. Might need EE Overclock at 130%. // ------------ // Change framerate divisor 2 -> 1 patch=1,EE,2041A4A0,extended,00000001 //00000002 // ------------ // Fix gravity so jump heights are the same as in 30fps // The issue with gravity at 60fps is that it's a fixed update, with a function (@ 0x00119DF8) processing gravity in 1/60th second chunks // (0.0166667f). The function iterates gravity until it's greater than the delta time provided to the function which, for some reason, // is rounded to the nearest thousandth (so for 60fps, this will be 0.017f). This means that gravity will always be processed twice a // frame at 60fps. We'll correct this by hooking at the end of the function to save the remaining time, and hooking at the beginning of the function // to start iterating from the remaining time rather than 0. This means that on most frames, gravity should only be processed once at 60fps, and will // make framerates which aren't divisors of 60 also more accurate. // Grab the extra time from the last time gravity was processed patch=0,EE,20119E58,extended,0C0ABAE6 // jal 0x2AEB98 // was mtc1 zero, f21 // Save the extra time at end of function patch=0,EE,2011A280,extended,080ABAEA // j 0x002AEBA8 ($ra is already restored here) // was lwc1 f27, 0xE8(sp) // Now set up some code to handle the extra time left over from processing gravity // (This area seems to be junk code, just "sqc2 vf06,0x0(a0)" then "nop" over and over) // read extra time patch=0,EE,202AEB98,extended,3C01002B // lui at,0x002B patch=0,EE,202AEB9C,extended,03E00008 // jr ra patch=0,EE,202AEBA0,extended,C435EBA4 // lwc1 f21,-0x145C(at) // Read from 0x2AEBA4 // initialize extra time patch=0,EE,202AEBA4,extended,00000000 // write extra time patch=0,EE,202AEBA8,extended,C7BB00E8 // lwc1 f27,0xE8(sp) // Restore part of the epilogue we overwrote patch=0,EE,202AEBAC,extended,4619A801 // sub.s f00,f21,f25 // f0 = (sum of 1/60 second chunks) - deltatime patch=0,EE,202AEBB0,extended,3C01002B // lui at,0x002B patch=0,EE,202AEBB4,extended,080468A2 // j 0x0011A288 // Jump back to original function patch=0,EE,202AEBB8,extended,E420EBA4 // swc1 f00,-0x145C(at) // ------------ // Fix horizontal camera speed (delta-time is applied twice by accident; vertical is fine) // Overwrite dt access for second application to a jump to a code cave // (we unfortunately can't just overwrite the pointer+access getting loaded, // as the pointer is used later in the function) patch=0,EE,202B61CC,extended,080ADA78 // j z_un_002b69e0; overwrites dt access // Code cave where we load (1f/30) into f0, where the dt access would have ended up // (These were just the instructions addiu sp, 0x80; nop; nop; nop; presumably junk) patch=0,EE,202B69E0,extended,3C013D08 // lui at,0x3D08 patch=0,EE,202B69E4,extended,34218889 // ori at,at,0x8889 patch=0,EE,202B69E8,extended,080AD875 // j 0x002B61D4 patch=0,EE,202B69EC,extended,44810000 // mtc1 at,f00 // The game dampens horizontal camera movement by subtracting the result of the 2nd dt application // from the movement speed. As such unchanged now the horizontal movement is dampened twice as fast at 60fps after above fix. // Optimize away an instruction to create a gap of two instructions patch=0,EE,202B61E4,extended,00831024 // and v0,a0,v1 ; combines a "daddu v0,a0,zero" and "and v0,v0,v1" instruction patch=0,EE,202B61E8,extended,C6A0001C // lwc1 f00,0x1C(s5) ; load dt patch=0,EE,202B61F0,extended,46000942 // mul.s f05,f01,f00 ; recreate dampen value in f5 patch=0,EE,202B6234,extended,46051081 // sub.s f02,f02,f05 ; apply dampen value [Normal Camera] author=Souzooka description=Uninverts horizontal and vertical camera axes. Setting "Aiming" to Reversed inverts horizontal axis. patch=0,EE,002602E8,word,46006307 // neg.s f12,f12 ; horizontal axis patch=0,EE,002602CC,word,460C0301 // sub.s f12,f00,f12 ; vertical axis patch=0,EE,0025DD4C,word,00000000 // nop ; vertical axis (first-person); removes existing inversion // NOTE: First-person horizontal axis is already normal by default, regardless of "Aiming" setting.