Ki-Control [Vega] The Ultimate Ki Blast Code!! With this code, you can freeze a Ki Blast an move it (via desired Stick) anywhere you want. At any moment in time, you can unfreeze the Ki Blast and it will resume its normal path. Also, you can refreeze-move-unfreeze any amount of times until you keep it unfrozen long enough to where it contacts the opponent. By default, you can only freeze a max amount of 5 Ki Blasts simultaneously. Once you try to go beyond 5, the Ki blast will simply not be generated. However, the limit can be increased via my Ki Blast Modifier code. The highest limit possible that the game allows for frozen Ki Blasts is 20 (which is strange because there is literally NO limit if you are shooting Ki Blasts normally). Therefore, the Ki Blast Modifier Code (set to full max) is provided. That way you can freeze up to 20 blasts and shoot an unlimited amount. There are three Controller/Button lines (XXXX YYYY ZZZZ) lines. First two lines are activators and the final line is a Master Deactivator. 1st Line = Button to press to enable desired Stick to take control of the Ki Blast & move it along its X and Z Coordinates. Move stick left/right for X coord, and up/down for Z coord. Fyi, Z coord is forward/backward motion. 2nd Line = Button to press to enable desired Stick to take control of the Ki Blast & move it along its Y Coordinate (move blast up/down). This is controlled by your chosen Stick via up/down movements. 3rd Line = Master Deactivator. Press it any time to allow Ki Blasts to operate normally again (unfreeze them if they are frozen mid-air). Link to X,Y,Z values - https://mariokartwii.com/nonmkwcodes/dbzbt3/bt3gecko.txt There are two different configurations to the code. 1st config effects both 1P and 2P/COM. 2nd config allows you to choose between 1P or 2P/COM, via the P value. P values (2nd config only): 0 = 1P 1 = 2P/COM TTTT = Controller Stick to use that will move the Ki Blast around at will WWWW = TTTT + 4 TTTT values: 0E2C = GCN Analog Stick 0E34 = GCN C Stick 0E94 = Classic Left Analog Stick & Wii Chuck Analog Stick 0E9C = Classic Right Analog Stick NTSC-U (1st config) C20D79DC 00000002 3C607FFF 6063FFFF 60000000 00000000 021643F2 00000000 283BXXXX YYYYZZZZ C21643D0 00000006 C01F0010 C03F0018 10000C60 3CC0803B 60C6TTTT E0260000 1000082A D01F0010 100004A0 D01F0018 60000000 00000000 E0000000 00000000 283BXXXX YYYYZZZZ C21643D0 00000003 C01F0014 3CC0803B C026WWWW EC00082A D01F0014 00000000 E0000000 00000000 283BXXXX YYYYZZZZ 041643D0 4BEA4E49 E0000000 80008000 NTSC-U (2nd config; fill in BOTH P values, ofc make sure they are both the SAME) C20D79DC 00000002 3C607FFF 6063FFFF 60000000 00000000 021643F2 00000000 283BXXXX YYYYZZZZ C21643D0 0000000A A81F0050 2C00000P 41820018 3C008000 60009218 7C0803A6 4E800021 4800002C C01F0010 C03F0018 10000C60 3CC0803B 60C6TTTT E0260000 1000082A D01F0010 100004A0 D01F0018 60000000 00000000 E0000000 00000000 283BXXXX YYYYZZZZ C21643D0 00000007 A81F0050 2C00000P 41820018 3C008000 60009218 7C0803A6 4E800021 48000018 C01F0014 3CC0803B C026WWWW EC00082A D01F0014 00000000 E0000000 00000000 283BXXXX YYYYZZZZ 041643D0 4BEA4E49 E0000000 80008000 Code creator: Vega Sources~ 1st Config Sources: Ki Blast Mod ASM (present in both configs so it will only be listed here): #Address #NTSC-U = 800D79DC #Set Ki Blast Limit in r3. r3 is a return value given back to Parent function to let it know what the Ki Blast cycle limit is. #Original instruction of mr r3, r30 is not needed. #Limit value signed so max is 0x7FFFFFFF lis r3, 0x7FFF #Ki Blasts Unlimited (well techincally 2 billion limit lol) set for compilation ori r3, r3, 0xFFFF --- 16-bit RAM Write (present in both configs so it will only be listed here): At address 801643F0, there is a subic. r0, r3, 1. This is a timer that starts off as 0x78 and decrements while Ki is in the air traveling. If it hits 0 before reaching the opponent, it disappears. The instruction is changed to subic. r0, r3, 0' (via its lower 16 bits with a 16-bit RAM Write at address + 0x2) to prevent the timer decrementing so the Ki will never disappear. I don't see a reason to ever have the Ki Timer decrement in any circumstance, so this 16-bit RAM Write is always on. --- 1st ASM (Update Ki Blast X and Z coords; turned OFF via 32-bit RAM Write with Original Instruction via Deactivator): #START ASSEMBLY #Address #NTSC-U = 801643D0 #r31 = KiXYZStructPointer #r0 & r6 safe for use #f0 and f1 safe #Load Ki Current XZs from KIXYZStruct lfs f0, 0x10 (r31) lfs f1, 0x18 (r31) #Merge X and Z together in f0 ps_merge01 f0, f0, f1 #Load Stick Left/Right & Up/Down lis r6, 0x803B ori r6, r6, 0x0E34 #Have to do this due to 12-bit signed range of Paired Single loads/stores psq_l f1, 0 (r6), 0, 0 #Update XZ with current float values of the Stick ps_add f0, f0, f1 #Write new XZ, store X first stfs f0, 0x10 (r31) #Place Z in ps0 of f0 so we can store it ps_merge10 f0, f0, f0 #Store Z now; End Code; default instruction of calling 80009218 func is not needed stfs f0, 0x18 (r31) #END ASSEMBLY ---- 2nd ASM (Update Ki Blast Y coord; turned OFF via 32-bit RAM Write with Original Instruction via Deactivator) #Address #NTSC-U = 801643D0 #r31 = KiXYZStructPointer #r0 & r6 safe for use #f0 and f1 safe #Load Ki Current Y from KIXYZStruct lfs f0, 0x14 (r31) #Load Stick Up/Down lis r6, 0x803B lfs f1, 0x0E38 (r6) #Update Y with current float value of the Stick fadds f0, f0, f1 #Store new Y; End Code; default instruction of calling 80009218 func is not needed stfs f0, 0x14 (r31) #END ASSEMBLY ===================== 2nd config ASM's: 1st ASM #START ASSEMBLY #Address #NTSC-U = 801643D0 #r31 = KiXYZStructPointer #r31 + 0x50 (half) = Slot #r31 + 0x52 (half) = Slot as well #LR, r0 & r6 safe for use #f0 and f1 safe #No idea why the game loads the slot as signed halfwords. Also not sure why slot is at 2 diff spots right next to each other. I tried doing team battle to see maybe if the second halfword was member-out-of-team based, but it's not. #Check Slot lha r0, 0x0050 (r31) #Might as well load it like the game does, lul cmpwi r0, 0 #1P used for compilation, adjust this accordingly beq- load_ki #Skip legit writes/updates to KI XYZ #Slot not a match, call the function (80009218) that does the legit writes/updates to the Ki Blast lis r0, 0x8000 ori r0, r0, 0x9218 mtlr r0 blrl b end_code #Load Ki Current XZs from KIXYZStruct load_ki: lfs f0, 0x10 (r31) lfs f1, 0x18 (r31) #Merge X and Z together in f0 ps_merge01 f0, f0, f1 #Load Stick Left/Right & Up/Down lis r6, 0x803B ori r6, r6, 0x0E34 #Have to do this due to 12-bit signed range of Paired Single loads/stores psq_l f1, 0 (r6), 0, 0 #Update XZ with current float values of the Stick ps_add f0, f0, f1 #Write new XZ, store X first stfs f0, 0x10 (r31) #Place Z in ps0 of f0 so we can store it ps_merge10 f0, f0, f0 #Store Z now stfs f0, 0x18 (r31) #End code end_code: #END ASSEMBLY --- 2nd ASM #Address #NTSC-U = 801643D0 #r31 = KiXYZStructPointer #r31 + 0x50 (half) = Slot #r31 + 0x52 (half) = Slot as well #LR, r0 & r6 safe for use #f0 and f1 safe #No idea why the game loads the slot as signed halfwords. Also not sure why slot is at 2 diff spots right next to each other. I tried doing team battle to see maybe if the second halfword was member-out-of-team based, but it's not. #Check Slot lha r0, 0x0050 (r31) #Might as well load it like the game does, lul cmpwi r0, 0 #1P used for compilation, adjust this accordingly beq- load_ki #Skip legit writes/updates to KI XYZ #Slot not a match, call the function (80009218) that does the legit writes/updates to the Ki Blast lis r0, 0x8000 ori r0, r0, 0x9218 mtlr r0 blrl b end_code #Load Ki Current Y from KIXYZStruct load_ki: lfs f0, 0x14 (r31) #Load Stick Up/Down lis r6, 0x803B lfs f1, 0x0E38 (r6) #Update Y with current float value of the Stick fadds f0, f0, f1 #Store new Y stfs f0, 0x14 (r31) #End code end_code: #END ASSEMBLY