From d223bac89e04c5f8d0c1a2781e03251e8b0638e3 Mon Sep 17 00:00:00 2001 From: Sam Lefforge Date: Sat, 30 May 2026 14:22:46 -0700 Subject: [PATCH] Add 'Allow Nana' option to Powershield Training --- src/events.c | 5 +++-- src/powershield.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/src/events.c b/src/events.c index 69528274..79b51b0f 100644 --- a/src/events.c +++ b/src/events.c @@ -334,7 +334,7 @@ EventDesc Powershield = { .cpuKind = CKIND_FALCO, .stage = GRKINDEXT_FD, .disable_hazards = true, - .force_sopo = true, + .force_sopo = false, .scoreType = SCORETYPE_KO, .callbackPriority = 3, .matchData = &Powershield_MatchData, @@ -1193,8 +1193,9 @@ void EventInit(int page, int eventID, MatchInit *matchData) matchData->playerData[0].portNumberOverride = hmn_port; // Force Popo if required - if (event->force_sopo && matchData->playerData[0].c_kind == CKIND_ICECLIMBERS) + if (event->force_sopo && matchData->playerData[0].c_kind == CKIND_ICECLIMBERS) { matchData->playerData[0].c_kind = CKIND_POPO; + } // Determine the correct HUD position for this amount of players int hudPos = 0; diff --git a/src/powershield.c b/src/powershield.c index cffac104..268bb8dd 100644 --- a/src/powershield.c +++ b/src/powershield.c @@ -12,6 +12,7 @@ void Reset(void); void ChangeRandomFireDelayMin(GOBJ *event_menu, int value); void ChangeRandomFireDelayMax(GOBJ *event_menu, int value); int GetRandomLaserDelay(void); +void ChangeAllowNana(GOBJ *event_menu, int value); enum menu_options { OPT_FIRE_SPEED, @@ -20,6 +21,8 @@ enum menu_options { OPT_LASER_HEIGHT, OPT_DIRECTION, OPT_MOVEMENT, + OPT_ALLOW_NANA, + OPT_EXIT, }; enum fire_speed { @@ -105,6 +108,13 @@ static EventOption Options_Main[] = { .desc = {"Change how falco lasers around the stage."}, .values = Options_Movement, }, + { + .kind = OPTKIND_TOGGLE, + .val = 1, // Default to both climbers + .name = "Nana", + .desc = {"Toggle Nana on or off."}, + .OnChange = ChangeAllowNana, + }, { .kind = OPTKIND_FUNC, .name = "Exit", @@ -136,6 +146,9 @@ void Event_Think(GOBJ *menu) { FighterData *falco_data = falco->userdata; if (event_vars->game_timer == 1) { + // Disable Nana option for non-Ice Climbers + Options_Main[OPT_ALLOW_NANA].disable = (player_data->kind != FTKIND_POPO); + player_data->facing_direction = -1; PutOnGround(player); PutOnGround(falco); @@ -149,6 +162,21 @@ void Event_Think(GOBJ *menu) { falco_data->flags.no_reaction_always = true; falco_data->grab.vuln = 0x1FF; player_data->shield.health = 60; + + // Manage Nana based on option + if (player_data->kind == FTKIND_POPO) { + GOBJ *nana = Fighter_GetSubcharGObj(0, 1); + int nana_option = Options_Main[OPT_ALLOW_NANA].val; + + if (nana_option == 0 && nana) { + FighterData *nana_data = nana->userdata; + if (nana_data->state_id != ASID_SLEEP) { + Fighter_EnterSleep(nana, 1); + } + nana_data->phys.pos.X = 999.f; + nana_data->phys.pos.Y = -999.f; + } + } int new_direction = -1; if (player_data->input.down & HSD_BUTTON_DPAD_LEFT) { @@ -452,4 +480,21 @@ int GetRandomLaserDelay(void) { return HSD_Randi(random_fire_delay_max - random_fire_delay_min) + random_fire_delay_min; } +void ChangeAllowNana(GOBJ *event_menu, int value) { + GOBJ *player = Fighter_GetGObj(0); + if (!player) return; + + FighterData *player_data = player->userdata; + if (player_data->kind != FTKIND_POPO) return; + + GOBJ *nana = Fighter_GetSubcharGObj(0, 1); + + if (value == 1 && nana) { + FighterData *nana_data = nana->userdata; + if (nana_data->state_id == ASID_SLEEP) { + Fighter_EnterDeadDown(player); + } + } +} + EventMenu *Event_Menu = &Menu_Main;