Start + Limit Health/Ki/Blast Stocks/Max Power Modifier [Vega] This code allows you to edit the starting amount and limit amount of your... - Health - Ki - Blast Stocks - Max Power Charge There are 2 configurations to the code. 1st config uses one set of values and you choose whether it efects both 1P or 2P/COM 2nd config uses two sets of values and first set effects 1P while second set effects 2P/COM (for 1st config only) P = Slot 0 = 1P 1 = 2P/COM (for 1st config & 2nd config 1P only) R = Health S = Health Limit T = Ki U = Ki Limit W = Blast Stocks X = Blast Stocks Limit Y = Max Power Charge Z = Max Power Charge Limit (for 2nd config 2P/COM only) r = Health s = Health Limit t = Ki u = Ki Limit w = Blast Stocks x = Blast Stocks Limit y = Max Power Charge z = Max Power Charge Limit IMPORTANT NOTES: The upper bound that you can set for all values (except Blast Stocks and Blast Stocks Limit) is 7FFFFFFF. The upper bound for Blast Stocks and Blast Stocks limit is 000AAE60 (700,000). Also, if you set the Blast Stocks Limit (Y/y value) below 000186A0 (100,000), then you will never be able to charge your Max Power bar. For the 1st config, there are two places to fill in your P value. At the first C2 code and at the last C2 code. Be sure they are equal! NTSC-U (1st config) 06000BB4 00000024 RRRRRRRR SSSSSSSS 00000000 TTTTTTTT UUUUUUUU WWWWWWWW XXXXXXXX YYYYYYYY ZZZZZZZZ 00000000 C20F391C 00000004 2C007530 2F9D000P 409E0010 3D808000 818C0BD4 7C006000 60000000 00000000 C20F392C 00000002 9003149C 409E0008 9183149C 00000000 C20F3B60 00000004 38007530 3D808000 816C0BFC 7C0B1800 40820008 800C0BD4 60000000 00000000 C20F2BF0 0000000A 3860000P 3C008004 60002A68 7C0903A6 4E800421 2C030000 41820030 7C03F800 40820028 3D808000 906C0BFC 801E0008 7FCBF378 BB8C0BB4 BF8B0000 BB8C0BC4 BF8B0010 900B0008 80010044 00000000 NTSC-U (2nd config) 06000BB4 00000048 RRRRRRRR SSSSSSSS 00000000 TTTTTTTT UUUUUUUU WWWWWWWW XXXXXXXX YYYYYYYY ZZZZZZZZ rrrrrrrr ssssssss 00000000 tttttttt uuuuuuuu wwwwwwww xxxxxxxx yyyyyyyy zzzzzzzz C20F391C 00000004 3D808000 816C0BF8 2F9D0000 409E0008 816C0BD4 7C005800 60000000 00000000 C20F392C 00000003 800C0BF8 409E0008 800C0BD4 9003149C 60000000 00000000 C20F3B60 00000004 3D808000 800C0BF8 816C0BFC 7C0B1800 40820008 800C0BD4 60000000 00000000 C20F2BF0 0000000C 38600000 3C008004 60002A68 7C0903A6 4E800421 2C030000 4182003C 3D808000 906C0BFC 7C03F800 619F0BB0 41820008 619F0BD4 3BA00008 7FA903A6 3B9EFFFC 801E0008 87BF0004 97BC0004 4200FFF8 901E0008 80010044 60000000 00000000 List of all the Sources~~~ ===EVA Notes for all sources (all word values)=== #All 1P BLOW 0x80000BB4 = Health 0x80000BB8 = Health Limit 0x80000BBC = Unused (filler for '???') 0x80000BC0 = Ki 0x80000BC4 = Ki Limit 0x80000BC8 = Blast Stocks 0x80000BCC = Blast Stocks Limit 0x80000BD0 = Max Power Charge 0x80000BD4 = Max Power Charge Limit #ALL 2P/COM BELOW 0x80000BD8 = Health 0x80000BDC = Health Limit 0x80000BE0 = Unused (filler for '???') 0x80000BE8 = Ki 0x80000BE8 = Ki Limit 0x80000BEC = Blast Stocks 0x80000BF0 = Blast Stocks Limit 0x80000BF4 = Max Power Charge 0x80000BF8 = Max Power Charge Limit #Master Pointer Save Spot 0x80000BFC = Saved Master Pointer (always P1 if 2nd config) ===1st config sources=== ASM #1: #START ASSEMBLY #Change the Max Power Limit check value amount and re-store value of max #Address #NTSC-U = 800F391C #Original Instruction, check r0 (current Max Power) against value of 30,000 (0x7530) cmpwi r0, 30000 #Check slot (r29) cmpwi cr7, r29, 0 #1P used for compilation, adjust this accordingly. Use cr7 so next ASM (just a few instructions later) can use the resutl instantly bne- cr7, end_code #Slot is a match! Re-do the Max Power Limit check with new custom value lis r12, 0x8000 lwz r12, 0xBD4 (r12) cmpw r0, r12 #End code end_code: #END ASSEMBLY ASM #2: #START ASSEMBLY #At this hook the game will restore the maximum max power value. That value will be changed if slot was a match from last ASM #Address #NTSC-U = 800F392C #Original Instruction stw r0, 0x149C (r3) #Check last ASM's cr7 result bne- cr7, end_code #Sltot is a match! Store user's new custom value (which is still residign in r12) stw r12, 0x149C (r3) #End code end_code: #END ASSEMBLY ASM #3: #START ASSEMBLY #Hooked at a child function that checks if max power limit has been hit when it has been incremented #Change that limit value if we are on correct player #Address #NTSC-U = 800F3B60 #Original instruction, set Max Power charge limit to 30,000 li r0, 30000 #Set EVA, load master pointer lis r12, 0x8000 lwz r11, 0xBFC (r12) #Check against current master poniter (what's in r3) cmpw r11, r3 bne- end_code #Master Pointers are a match!, place in new Max Power Charge Limit lwz r0, 0xBD4 (r12) #end code end_code: #END ASSEMBLY ASM #4: #START ASSEMBLY #Make sure we are on correct player. If so, save its Master Poiter to EVA #Take every stat (except Max Power Charge Limit) and write it to the Player's health & energy structure #Address #NTSC-U = 800F2BF0 #r0, r3 thru r10 safe #LR and CTR safe #r28 thru r31 safe #r30 = Real Health #r31 = Master Pointer #Set User slot li r3, 0 #1P used for compilation, adjust this accordingly #Get Master Point based on slot value lis r0, 0x8004 ori r0, r0, 0x2A68 mtctr r0 bctrl #Check return value. If null, game hasn't generated master pointer for slot yet. We'll need to wait til the hook address gets executed again. And tbh I'm not sure why. We could add 0x20A0 to P1's MP. The function call does do an incrementation of that with a slot check mechanism. But its possible the MP is dynamic in its steps of incrementation, so we won't risk doing the simple addition. cmpwi r3, 0 beq- original_instruction #Compared returned Master Pointer vs what's in r31 cmpw r3, r31 bne- original_instruction #Master Pointers are a match! #Store it to EVA lis r12, 0x8000 stw r3, 0xBFC (r12) #Save ??? (seems to always be null but just in case) lwz r0, 0x8 (r30) #Copy r30 to r11 due to upcoming stmw's where r30 is a pointer that is needed mr r11, r30 #Load up first 4 word values, write to structure lmw r28, 0xBB4 (r12) stmw r28, 0 (r11) #Load up next 4 word values, write em lmw r28, 0xBC4 (r12) stmw r28, 0x10 (r11) #Restore ??? stw r0, 0x8 (r11) #Original Instruction original_instruction: lwz r0, 0x0044 (sp) #END ASSEMBLY ------------------------------------------------------------------------------------------------------------- ===2nd config sources=== ASM #1: #START ASSEMBLY #Change the Max Power Limit check value amount and re-store value of max #Address #NTSC-U = 800F391C #No need for original instruction of cmpwi r0, 10000 #Set EVA upper lis r12, 0x8000 #Loads P2/COM's MPC Limit before doing slot check lwz r11, 0xBF8 (r12) #Check slot (r29) for 1P cmpwi cr7, r29, 0 bne- cr7, end_code #Slot is a match, replace r11's value with 1P's MPC limit instead lwz r11, 0xBD4 (r12) #End code; check loaded MPC vs MPC limit end_code: cmpw r0, r11 #END ASSEMBLY ASM #2: #START ASSEMBLY #At this hook the game will restore the maximum max power value. That value will be changed based on slot #Address #NTSC-U = 800F392C #No need for original instruction of stw r0, 0x149C (r3) #EVA already set, pre-load P2/COM's MPC limit value before doing slot check lwz r0, 0xBF8 (r12) #Check last ASM's cr7 result bne- cr7, original_instruction #Slot is a match indicating to store P1's MPC limit instead of P2's MPC limit thus we load it into r0 from EVA lwz r0, 0xBD4 (r12) #Original Instruction original_instruction: stw r0, 0x149C (r3) #END ASSEMBLY ASM #3: #START ASSEMBLY #Hooked at a child function that checks if max power limit has been hit when it has been incremented #Change that limit value if we are on correct player #Address #NTSC-U = 800F3B60 #Original instruction of li r0, 30000 not needed #Set EVA, pre-load P2/COM's MPC limit into r0 lis r12, 0x8000 lwz r0, 0xBF8 (r12) #Set EVA, load saved P1 Master Pointer lwz r11, 0xBFC (r12) #Check against current master poniter (what's in r3) cmpw r11, r3 bne- end_code #Master Pointers are a match thus indicatign we need P1's MPC limit instead, load it into r0 lwz r0, 0xBD4 (r12) #end code end_code: #END ASSEMBLY ASM #4: #START ASSEMBLY #Make sure we are on correct player. If so, save its Master Poiter to EVA #Take every stat (except Max Power Charge Limit) and write it to the Player's health & energy structure #Address #NTSC-U = 800F2BF0 #r0, r3 thru r10 safe #LR and CTR safe #r28 thru r31 safe #r30 = Real Health #r31 = Master Pointer #Get P1's Master pointer to save in EVA. 3rd ASM needs it. li r3, 0 lis r0, 0x8004 ori r0, r0, 0x2A68 mtctr r0 bctrl #Check return value. If null, game hasn't generated master pointer for slot yet. We'll need to wait til the hook address gets executed again. And tbh I'm not sure why. We could add 0x20A0 to P1's MP. The function call does do an incrementation of that with a slot check mechanism. But its possible the MP is dynamic in its steps of incrementation, so we won't risk doing the simple addition. cmpwi r3, 0 beq- original_instruction #Store P1's MP to EVA lis r12, 0x8000 stw r3, 0xBFC (r12) #Compared returned Master Pointer vs what's in r31 cmpw r3, r31 #Preset Loop first load address for P1 (minus 4) ori r31, r12, 0xBB0 #Take branch beq- set_loop_count #We're on P2/COM. Adjust loop frist load address (minus 4) ori r31, r12, 0xBD4 #Set Loop Amount set_loop_count: li r29, 8 mtctr r29 #Set Loop first store address (minus 4) addi r28, r30, -4 #Save ??? (seems to always be null but just in case) lwz r0, 0x8 (r30) #Transfer data from EVA to player's structure loop: lwzu r29, 0x4 (r31) stwu r29, 0x4 (r28) bdnz+ loop #Restore ??? stw r0, 0x8 (r30) #Original Instruction original_instruction: lwz r0, 0x0044 (sp) #END ASSEMBLY