Free Character Rotation [Vega] Use the desired stick on Controller to freely spin the character along in any longitude + lateral direction. Press your activator to enable the 'Free Rotation' mode. Press deactivator at any time to resume normal character rotation. Note to other coder/devs: 'Drill rotation' is right after Latitude rotation in memory, but there's really no need to include it the code since we have full control over both longitude and latitude rotation. XXXX,YYYY,ZZZZ values -> https://mariokartwii.com/nonmkwcodes/dbzbt3/bt3gecko.txt TTTT values: 1BEC = GCN Analog Stick 1BF4 = GCN C Stick 1C54 = Classic Left Analog Stick & Wii Chuck Analog Stick 1C5C = Classic Right Analog Stick W (slot) values: 0 = effects 1P 1 = effects 2P/COM NTSC-U Rev1 04000A00 3DD65B7A 283BXXXX YYYYZZZZ 040455B0 60000000 C20455AC 00000008 389E0010 819D000C 2C0C000W 40820030 3D808000 C00C0A00 3D80803B 618CTTTT E18C0000 E1A30000 11AD6CA0 118C0032 11AD602A 11AD6CA0 F1A30000 00000000 E0000000 00000000 283BXXXX YYYYZZZZ 040455B0 4BFC3D99 040455AC 389E0010 E0000000 80008000 Code creator: Vega List of Sources~ RAM Writes: At address 0x80000A00 is the single precision float of value of 0x3DD65B7A. It is 3.14 (lazy rough estimte of Pi) divided by 30. It is the multiplier use to calculate the long/lat updates based on the Stick values. Pi is relevant because -Pi or Pi is exactly 180 degrees in long/lat rotation. At address 0x800455B0, when code is active, is a nop. It prevents a small function call which does a paired load then store to what is r3 in the C2 Assembly Code. By nopping that function call, all legit updates to character rotation (plus drill) are cancelled. --- ASM: #START ASSEMBLY (C2) #Address #NTSC-U = 800455AC #Register Notes #f0 and f1 safe #r3 points to Character Long/Lat/'Drill' words #r29 = Master Pointer #r29 + 0xC = Slot #Stick stuff #Left = decrease float #Right = increase float #Up = decrease float #Down = increase float #Long/Lat stuff #Long: 'Tilt up' = increase float #Lat: Counter-clockwise = decrease float, Clockwise = increase float #Original Instruction addi r4, r30, 16 #Check Slot of Master Pointer lwz r12, 0xC (r29) cmpwi r12, 0 bne- end_code #Load Float Constant 3dd65b7a (0.104666665196; its 3.14 / 30) lis r12, 0x8000 lfs f0, 0x0A00 (r12) #Load Stick Up/Down + Left/Right into f12 lis r12, 0x803B ori r12, r12, 0x1BF4 #Must be done because of 12-bit signed range for Paired Single loads/stores psq_l f12, 0 (r12), 0, 0 #Load Long/Lat psq_l f13, 0 (r3), 0, 0 #Swap ps's to change long/lat to lat/long ps_merge10 f13, f13, f13 #Multiply the Constant by the Stick Values to get amount to update lat/long ps_mul f12, f12, f0 #Update Lat/long ps_add f13, f13, f12 #Change lat/long back to long/lat ps_merge10 f13, f13, f13 #Store it! psq_st f13, 0 (r3), 0, 0 #End code end_code: #END ASSEMBLY