Skip to content

Commit

Permalink
Party Menu Field Moves
Browse files Browse the repository at this point in the history
Credit to segabl @ exalted-emerald - I took the general idea and then improved on it imo. No more HM slaves.
  • Loading branch information
00mn00 committed May 31, 2022
1 parent ab23f97 commit 87995c8
Show file tree
Hide file tree
Showing 7 changed files with 81 additions and 14 deletions.
6 changes: 6 additions & 0 deletions asm/macros/event.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1469,6 +1469,12 @@
.2byte \localId
.endm

@ Checks if the player has a pokemon that can learn a specific tm/hm and returns the index if so. If not, VAR_RESULT is set to PARTY_SIZE.
.macro checkpartytmhm move:req
.byte 0xd9
.2byte \move
.endm

@ Supplementary

.macro goto_if_unset flag:req, dest:req
Expand Down
1 change: 1 addition & 0 deletions data/script_cmd_table.inc
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,7 @@ gScriptCmdTable:: @ 815F9B4
.4byte ScrCmd_fadescreenswapbuffers
.4byte ScrCmd_setobjectmovementtypeinstant
.4byte ScrCmd_resetobjectmovementtype
.4byte ScrCmd_checkpartytmhm

gScriptCmdTableEnd:: @ 815FD08
.4byte ScrCmd_nop
33 changes: 24 additions & 9 deletions data/scripts/field_moves.inc
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@ EventScript_CutTree:: @ 81BDF13
goto_if_questlog EventScript_ReleaseEnd
lockall
goto_if_unset FLAG_BADGE02_GET, EventScript_CantCutTree
checkpartymove MOVE_CUT
checkitem ITEM_HM01, 1
compare VAR_RESULT, FALSE
goto_if_eq EventScript_CantCutTree
checkpartytmhm ITEM_HM01
compare VAR_RESULT, PARTY_SIZE
goto_if_eq EventScript_CantCutTree
setfieldeffectarg 0, VAR_RESULT
Expand All @@ -12,7 +15,6 @@ EventScript_CutTree:: @ 81BDF13
compare VAR_RESULT, NO
goto_if_eq EventScript_DontCutTree
msgbox Text_MonUsedMove
closemessage
dofieldeffect FLDEFF_USE_CUT_ON_TREE
waitstate
goto EventScript_CutTreeDown
Expand Down Expand Up @@ -62,7 +64,10 @@ EventScript_RockSmash:: @ 81BE00C
goto_if_questlog EventScript_ReleaseEnd
lockall
goto_if_unset FLAG_BADGE06_GET, EventScript_CantSmashRock
checkpartymove MOVE_ROCK_SMASH
checkitem ITEM_HM06, 1
compare VAR_RESULT, FALSE
goto_if_eq EventScript_CantSmashRock
checkpartytmhm ITEM_HM06
compare VAR_RESULT, PARTY_SIZE
goto_if_eq EventScript_CantSmashRock
setfieldeffectarg 0, VAR_RESULT
Expand All @@ -72,7 +77,6 @@ EventScript_RockSmash:: @ 81BE00C
compare VAR_RESULT, NO
goto_if_eq EventScript_DontSmashRock
msgbox Text_MonUsedMove
closemessage
dofieldeffect FLDEFF_USE_ROCK_SMASH
waitstate
goto EventScript_UseRockSmash
Expand Down Expand Up @@ -125,15 +129,17 @@ EventScript_StrengthBoulder:: @ 81BE11D
goto_if_questlog EventScript_ReleaseEnd
lockall
goto_if_unset FLAG_BADGE04_GET, EventScript_CantMoveBoulder
checkitem ITEM_HM04, 1
compare VAR_RESULT, FALSE
goto_if_eq EventScript_CantMoveBoulder
goto_if_set FLAG_SYS_USE_STRENGTH, EventScript_AlreadyUsedStrength
checkpartymove MOVE_STRENGTH
checkpartytmhm ITEM_HM04
compare VAR_RESULT, PARTY_SIZE
goto_if_eq EventScript_CantMoveBoulder
setfieldeffectarg 0, VAR_RESULT
msgbox Text_UseStrength, MSGBOX_YESNO
compare VAR_RESULT, NO
goto_if_eq EventScript_DontUseStrength
closemessage
dofieldeffect FLDEFF_USE_STRENGTH
waitstate
goto EventScript_UseStrength
Expand Down Expand Up @@ -185,7 +191,10 @@ Text_StrengthMadeMovingBouldersPossible:: @ 81BE284
EventScript_Waterfall:: @ 81BE2B7
goto_if_questlog EventScript_ReleaseEnd
lockall
checkpartymove MOVE_WATERFALL
checkitem ITEM_HM07, 1
compare VAR_RESULT, FALSE
goto_if_eq EventScript_WaterCrashingDown
checkpartytmhm ITEM_HM07
compare VAR_RESULT, PARTY_SIZE
goto_if_eq EventScript_WaterCrashingDown
getpartymonname 0, VAR_RESULT
Expand Down Expand Up @@ -219,7 +228,10 @@ Text_MonUsedWaterfall:: @ 81BE378

EventScript_UseDive::
lockall
checkpartymove MOVE_DIVE
checkitem ITEM_HM08, 1
compare VAR_RESULT, FALSE
goto_if_eq EventScript_CantDive
checkpartytmhm ITEM_HM08
compare VAR_RESULT, PARTY_SIZE
goto_if_eq EventScript_CantDive
getpartymonname 0, VAR_RESULT
Expand All @@ -244,7 +256,10 @@ EventScript_EndDive::

EventScript_UseDiveUnderwater:: @ 8290B5A
lockall
checkpartymove MOVE_DIVE
checkitem ITEM_HM08, 1
compare VAR_RESULT, FALSE
goto_if_eq EventScript_CantSurface
checkpartytmhm ITEM_HM08
compare VAR_RESULT, PARTY_SIZE
goto_if_eq EventScript_CantSurface
getpartymonname 0, VAR_RESULT
Expand Down
5 changes: 4 additions & 1 deletion data/scripts/surf.inc
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
EventScript_UseSurf:: @ 81A6AC8
goto_if_questlog EventScript_UseSurfEnd
checkpartymove MOVE_SURF
checkitem ITEM_HM03, 1
compare VAR_RESULT, FALSE
goto_if_eq EventScript_UseSurfEnd
checkpartytmhm ITEM_HM03
compare VAR_RESULT, PARTY_SIZE
goto_if_eq EventScript_UseSurfEnd
getpartymonname 0, VAR_RESULT
Expand Down
4 changes: 3 additions & 1 deletion src/field_player_avatar.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "field_effect_helpers.h"
#include "field_player_avatar.h"
#include "help_system.h"
#include "item.h"
#include "metatile_behavior.h"
#include "new_menu_helpers.h"
#include "overworld.h"
Expand All @@ -26,6 +27,7 @@
#include "constants/songs.h"
#include "constants/metatile_behaviors.h"
#include "constants/moves.h"
#include "constants/items.h"

static EWRAM_DATA struct ObjectEvent * sPlayerObjectPtr = NULL;
static EWRAM_DATA u8 sTeleportSavedFacingDirection = DIR_NONE;
Expand Down Expand Up @@ -1252,7 +1254,7 @@ bool8 PartyHasMonWithSurf(void)
{
if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) == SPECIES_NONE)
break;
if (MonKnowsMove(&gPlayerParty[i], MOVE_SURF))
if (CheckBagHasItem(ITEM_HM03, 1))
return TRUE;
}
}
Expand Down
27 changes: 25 additions & 2 deletions src/party_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -3026,11 +3026,34 @@ static void SetPartyMonFieldSelectionActions(struct Pokemon *mons, u8 slotId)
{
if (GetMonData(&mons[slotId], i + MON_DATA_MOVE1) == sFieldMoves[j])
{
AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, j + MENU_FIELD_MOVES);
break;
if (sFieldMoves[j] != MOVE_FLASH) // If Mon already knows FLASH, prevent it from being added to action list
if (sFieldMoves[j] != MOVE_CUT) // If Mon already knows CUT, prevent it from being added to action list
if (sFieldMoves[j] != MOVE_FLY) // If Mon already knows FLY, prevent it from being added to action list
if (sFieldMoves[j] != MOVE_STRENGTH) // If Mon already knows STRENGTH, prevent it from being added to action list
if (sFieldMoves[j] != MOVE_SURF) // If Mon already knows SURF, prevent it from being added to action list
if (sFieldMoves[j] != MOVE_ROCK_SMASH) // If Mon already knows ROCK SMASH, prevent it from being added to action list
if (sFieldMoves[j] != MOVE_WATERFALL) // If Mon already knows WATERFALL, prevent it from being added to action list
if (sFieldMoves[j] != MOVE_DIVE) // If Mon already knows DIVE, prevent it from being added to action list
if (sFieldMoves[j] != MOVE_DIG) // If Mon already knows DIG, prevent it from being added to action list
AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, j + MENU_FIELD_MOVES);
break;
}
}
}
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_HM05, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_HM05 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn HM05 and action list consists of < 4 moves, add FLASH to action list
AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, 0 + MENU_FIELD_MOVES);
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_HM01, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_HM01 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn HM01 and action list consists of < 4 moves, add CUT to action list
AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, 1 + MENU_FIELD_MOVES);
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_HM02, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_HM02 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn HM02 and action list consists of < 4 moves, add FLY to action list
AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, 2 + MENU_FIELD_MOVES);
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_HM04, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_HM04 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn HM04 and action list consists of < 4 moves, add STRENGTH to action list
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_HM03, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_HM03 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn HM03 and action list consists of < 4 moves, add SURF to action list
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_HM06, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_HM06 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn HM06 and action list consists of < 4 moves, add ROCK SMASH to action list
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_HM07, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_HM07 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn HM07 and action list consists of < 4 moves, add WATERFALL to action list
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_HM08, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_HM08 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn HM08 and action list consists of < 4 moves, add DIVE to action list
if (sPartyMenuInternal->numActions < 6 && CheckBagHasItem(ITEM_TM28, 1) && CanMonLearnTMHM(&mons[slotId], ITEM_TM28 - ITEM_TM01_FOCUS_PUNCH)) // If Mon can learn TM28 and action list consists of < 4 moves, add DIG to action list
AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, 8 + MENU_FIELD_MOVES);

if (GetMonData(&mons[1], MON_DATA_SPECIES) != SPECIES_NONE)
AppendToList(sPartyMenuInternal->actions, &sPartyMenuInternal->numActions, MENU_SWITCH);
if (ItemIsMail(GetMonData(&mons[slotId], MON_DATA_HELD_ITEM)))
Expand Down
19 changes: 18 additions & 1 deletion src/scrcmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2306,4 +2306,21 @@ bool8 ScrCmd_resetobjectmovementtype(struct ScriptContext * ctx)

Overworld_ResetObjEventTemplateMovementType(localId);
return FALSE;
}
}

bool8 ScrCmd_checkpartytmhm(struct ScriptContext * ctx)
{
u8 i;
u16 machineId = ScriptReadHalfword(ctx);

gSpecialVar_Result = PARTY_SIZE;
for (i = 0; i < PARTY_SIZE; i++)
{
if (CanMonLearnTMHM(&gPlayerParty[i], machineId - ITEM_TM01))
{
gSpecialVar_Result = i;
break;
}
}
return FALSE;
}

0 comments on commit 87995c8

Please sign in to comment.