diff --git a/ASM/training-mode/Misc/Character Randomness/Common.s b/ASM/training-mode/Misc/Character Randomness/Common.s index 69429cd2..3ce86eb0 100644 --- a/ASM/training-mode/Misc/Character Randomness/Common.s +++ b/ASM/training-mode/Misc/Character Randomness/Common.s @@ -5,6 +5,9 @@ .set CharRng_Setting_Luigi_Misfire, 0x2 .set CharRng_Setting_GnW_Hammer, 0x3 .set CharRng_Setting_Nana_Throw, 0x4 +.set CharRng_Setting_Nana_Pummel_Enable, 0x5 +.set CharRng_Setting_Nana_Pummel_Min, 0x6 +.set CharRng_Setting_Nana_Pummel_Max, 0x7 .macro CharRng_FetchSetting reg, setting, default_branch load \reg, EventVars_Ptr diff --git a/ASM/training-mode/Misc/Character Randomness/Nana Pummels.asm b/ASM/training-mode/Misc/Character Randomness/Nana Pummels.asm new file mode 100644 index 00000000..e230f7d1 --- /dev/null +++ b/ASM/training-mode/Misc/Character Randomness/Nana Pummels.asm @@ -0,0 +1,38 @@ +# To be inserted at 800b6dec + +.include "Common.s" + +lwz r3, 0x4(r29) +cmpwi r3, 0xb +bne Exit + +CharRng_FetchSetting r3, CharRng_Setting_Nana_Pummel_Enable, Exit +cmpwi r3, 0 +beq Exit + +lwz r4, 0x94(r31) + +CharRng_FetchSetting r3, CharRng_Setting_Nana_Pummel_Min, Exit +cmpw r4, r3 +blt ForceContinue + +CharRng_FetchSetting r5, CharRng_Setting_Nana_Pummel_Max, Exit +cmpw r4, r5 +bge ForceStop + +subf r3, r4, r5 +addi r3, r3, 1 +branchl r12, HSD_Randi +cmpwi r3, 0 +beq ForceStop +b ForceContinue + +ForceContinue: + fsubs f1, f1, f1 + b Exit + +ForceStop: + lfd f1, -0x6FD8(rtoc) + +Exit: + lwz r3, 0x94(r31) diff --git a/src/events.h b/src/events.h index 2c465e81..a3ff0a98 100644 --- a/src/events.h +++ b/src/events.h @@ -230,6 +230,9 @@ typedef struct RNGControl u8 luigi_misfire; // 0x2 u8 gnw_hammer; // 0x3 u8 nana_throw; // 0x4 + u8 nana_pummel_enable; + u8 nana_pummel_min; + u8 nana_pummel_max; } RNGControl; typedef struct HUDCamData { diff --git a/src/lab.c b/src/lab.c index dbed9393..1c2066b0 100644 --- a/src/lab.c +++ b/src/lab.c @@ -355,6 +355,48 @@ void Lab_ChangeCharacterRng_NanaThrow(GOBJ *menu_gobj, int value) { event_vars->rng->nana_throw = value; } +static EventOption *Lab_FindCharRngOption(void (*OnChange)(GOBJ *menu_gobj, int value)) { + MenuData *menu_data = event_vars->menu_gobj->userdata; + EventMenu *menu = menu_data->curr_menu; + for (int i = 0; i < menu->option_num; ++i) { + if (menu->options[i].OnChange == OnChange) + return &menu->options[i]; + } + return NULL; +} + +void Lab_ChangeCharacterRng_NanaPummelEnable(GOBJ *menu_gobj, int value) { + event_vars->rng->nana_pummel_enable = value; + + EventOption *min_opt = Lab_FindCharRngOption(Lab_ChangeCharacterRng_NanaPummelMin); + if (min_opt) min_opt->disable = !value; + EventOption *max_opt = Lab_FindCharRngOption(Lab_ChangeCharacterRng_NanaPummelMax); + if (max_opt) max_opt->disable = !value; + + if (value) { + if (min_opt) event_vars->rng->nana_pummel_min = min_opt->val; + if (max_opt) event_vars->rng->nana_pummel_max = max_opt->val; + } +} + +void Lab_ChangeCharacterRng_NanaPummelMin(GOBJ *menu_gobj, int value) { + event_vars->rng->nana_pummel_min = value; + if (value > event_vars->rng->nana_pummel_max) { + event_vars->rng->nana_pummel_max = value; + EventOption *max_opt = Lab_FindCharRngOption(Lab_ChangeCharacterRng_NanaPummelMax); + if (max_opt) max_opt->val = value; + } +} + +void Lab_ChangeCharacterRng_NanaPummelMax(GOBJ *menu_gobj, int value) { + event_vars->rng->nana_pummel_max = value; + if (value < event_vars->rng->nana_pummel_min) { + event_vars->rng->nana_pummel_min = value; + EventOption *min_opt = Lab_FindCharRngOption(Lab_ChangeCharacterRng_NanaPummelMin); + if (min_opt) min_opt->val = value; + } +} + // -------------------------------------------------------- void Lab_StartMoveCPU(GOBJ *menu_gobj) { diff --git a/src/lab.h b/src/lab.h index 4b3ab1f7..98756335 100644 --- a/src/lab.h +++ b/src/lab.h @@ -1511,7 +1511,39 @@ static EventOption LabOptions_CharacterRngIcies[] = { .value_num = countof(LabValues_CharacterRng_NanaThrow), .values = LabValues_CharacterRng_NanaThrow, .OnChange = Lab_ChangeCharacterRng_NanaThrow, - } + }, + { + .kind = OPTKIND_TOGGLE, + .name = "Custom Pummel RNG", + .desc = {"Force Nana to pummel a random number of", + "times within the range below, instead", + "of her default AI behaviour."}, + .OnChange = Lab_ChangeCharacterRng_NanaPummelEnable, + }, + { + .kind = OPTKIND_INT, + .disable = 1, + .value_min = 0, + .value_num = 21, + .val = 0, + .name = "Nana Min Pummels", + .desc = {"Adjust the minimum number of times", + "Nana will pummel."}, + .format = "%d", + .OnChange = Lab_ChangeCharacterRng_NanaPummelMin, + }, + { + .kind = OPTKIND_INT, + .disable = 1, + .value_min = 0, + .value_num = 21, + .val = 3, + .name = "Nana Max Pummels", + .desc = {"Adjust the maximum number of times", + "Nana will pummel."}, + .format = "%d", + .OnChange = Lab_ChangeCharacterRng_NanaPummelMax, + }, }; #define OPTCHARRNG_MAXCOUNT 8 diff --git a/src/lab_common.h b/src/lab_common.h index 7061227a..5fbd64c2 100644 --- a/src/lab_common.h +++ b/src/lab_common.h @@ -429,6 +429,9 @@ void Lab_ChangeCharacterRng_PeachFSmash(GOBJ *menu_gobj, int value); void Lab_ChangeCharacterRng_Hammer(GOBJ *menu_gobj, int value); void Lab_ChangeCharacterRng_Misfire(GOBJ *menu_gobj, int value); void Lab_ChangeCharacterRng_NanaThrow(GOBJ *menu_gobj, int value); +void Lab_ChangeCharacterRng_NanaPummelEnable(GOBJ *menu_gobj, int value); +void Lab_ChangeCharacterRng_NanaPummelMin(GOBJ *menu_gobj, int value); +void Lab_ChangeCharacterRng_NanaPummelMax(GOBJ *menu_gobj, int value); void Lab_ChangeFrameAdvanceButton(GOBJ *menu_gobj, int value); void Lab_ChangeFrameDecrementButton(GOBJ *menu_gobj, int value); void Lab_ChangeCPUPercent(GOBJ *menu_gobj, int value);