Skip to content

Commit

Permalink
Improved Repel / Lure Menu (rh-hideout#3594)
Browse files Browse the repository at this point in the history
* First draft of repel lure

* Updated all lure and repel scripts

* Optimized inc file

* Updated y coord

* optimized sprays.c

* Removed spray.inc

* Updated cosnt use

* Removed dead repel and lure code

* Updated debug for testing

* testing new inc file

* turn on debug and options

* playground generated inc file without ifs

* pory generated inc with ifdef complete

* Updated spray.c with new inc

* reverted item config

* Reverted event scripts

* Reverted event scripts

* Revert config

* Added testing scripts for debug

* Added back specials

* reverted debug scripts

* Updated use of constants

* Addressed tabs > spaces feedback
https://github.com/rh-hideout/pokeemerald-expansion/pull/3594\#discussion_r1402917676

* Updated constant names to avoid confusion
Made inc file changes
https://github.com/rh-hideout/pokeemerald-expansion/pull/3594\#pullrequestreview-1746418044

* Updated constant name of NUM_SPRAY_TYPES to NUM_SPRAY_STRENGTH to be more accurate
  • Loading branch information
pkmnsnfrn authored and PCG06 committed Nov 25, 2023
1 parent a7bc4a7 commit 2d65b02
Show file tree
Hide file tree
Showing 6 changed files with 250 additions and 210 deletions.
215 changes: 125 additions & 90 deletions data/scripts/repel.inc
Original file line number Diff line number Diff line change
@@ -1,117 +1,152 @@
EventScript_RepelWoreOff::
.if I_REPEL_LURE_MENU == TRUE
checkitem ITEM_REPEL, 1
goto_if_eq VAR_RESULT, TRUE, EventScript_RepelUseAnother
checkitem ITEM_SUPER_REPEL, 1
goto_if_eq VAR_RESULT, TRUE, EventScript_RepelUseAnother
checkitem ITEM_MAX_REPEL, 1
goto_if_eq VAR_RESULT, TRUE, EventScript_RepelUseAnother
.else
checkitem VAR_LAST_REPEL_LURE_USED, 1
goto_if_eq VAR_RESULT, TRUE, EventScript_RepelUseAnother
.set LOCAL_VAR_SPRAY, VAR_0x8004
.set LOCAL_VAR_NUM_SPRAY_STRENGTH, VAR_0x8005
.set LOCAL_VAR_SPRAY_TYPE, VAR_0x8009
.set LOCAL_VAR_NEW_SPRAY, VAR_0x8007

EventScript_BufferSprayName::
.if VAR_LAST_REPEL_LURE_USED != 0
bufferitemname STR_VAR_1, VAR_LAST_REPEL_LURE_USED
return
.endif
lock
msgbox Text_RepelWoreOff, MSGBOX_SIGN
release
end
specialvar LOCAL_VAR_SPRAY_TYPE, GetLastUsedSprayType
compare LOCAL_VAR_SPRAY_TYPE, ITEM_REPEL
goto_if_eq EventScript_BufferSprayName_2
bufferitemname STR_VAR_1, ITEM_LURE
EventScript_BufferSprayName_1:
return

EventScript_RepelUseAnother:
EventScript_BufferSprayName_2:
bufferitemname STR_VAR_1, ITEM_REPEL
goto EventScript_BufferSprayName_1


EventScript_SprayWoreOff::
lock
msgbox Text_UseAnotherRepel, MSGBOX_YESNO
call EventScript_BufferSprayName
specialvar LOCAL_VAR_NUM_SPRAY_STRENGTH, GetNumberSprayStrength
switch LOCAL_VAR_NUM_SPRAY_STRENGTH
case 0, EventScript_SprayWoreOffMessage
case 1, EventScript_UseSingleSpray
goto EventScript_HandleMultipleSprays
return

EventScript_HandleMultipleSprays::
.if I_REPEL_LURE_MENU == TRUE
goto_if_eq VAR_RESULT, NO, EventScript_RepelWoreOff_End
callnative TryDrawRepelMenu
goto_if_eq VAR_RESULT, FALSE, EventScript_RepelWoreOff_Chose
waitstate
goto_if_eq VAR_RESULT, 127, EventScript_RepelWoreOff_End
EventScript_RepelWoreOff_Chose:
callnative HandleRepelMenuChoice
bufferitemname 1, VAR_0x8004
removeitem VAR_0x8004, 1
playse SE_REPEL
msgbox Text_UsedNewRepelLure, MSGBOX_SIGN
goto EventScript_ChooseWhichSpray
.else
goto_if_eq VAR_RESULT, YES, EventScript_UsedRepel
goto EventScript_UseSingleSpray
.endif
EventScript_RepelWoreOff_End:
release
end
return

EventScript_UsedRepel:
bufferitemname 1, VAR_LAST_REPEL_LURE_USED
playse SE_REPEL
lock
msgbox Text_UsedNewRepelLure, MSGBOX_SIGN
removeitem VAR_LAST_REPEL_LURE_USED, 1
waitse
callnative HandleUseExpiredRepel
release

EventScript_SprayWoreOffMessage::
msgbox Text_SprayWoreOff, MSGBOX_SIGN
releaseall
end

EventScript_LureWoreOff::
.if I_REPEL_LURE_MENU == TRUE
checkitem ITEM_LURE, 1
goto_if_eq VAR_RESULT, TRUE, EventScript_LureUseAnother
checkitem ITEM_SUPER_LURE, 1
goto_if_eq VAR_RESULT, TRUE, EventScript_LureUseAnother
checkitem ITEM_MAX_LURE, 1
goto_if_eq VAR_RESULT, TRUE, EventScript_LureUseAnother

EventScript_UseSingleSpray::
.if VAR_LAST_REPEL_LURE_USED == 0
call EventScript_UseDifferentSpray
.else
checkitem VAR_LAST_REPEL_LURE_USED, 1
goto_if_eq VAR_RESULT, TRUE, EventScript_LureUseAnother
compare VAR_RESULT, TRUE
goto_if_eq EventScript_UseSingleSpray_2
call EventScript_UseDifferentSpray
.endif
lock
msgbox Text_LureWoreOff, MSGBOX_SIGN
release
EventScript_UseSingleSpray_1:
closemessage
releaseall
end

EventScript_LureUseAnother:
lock
msgbox Text_UseAnotherLure, MSGBOX_YESNO
.if VAR_LAST_REPEL_LURE_USED != 0
EventScript_UseSingleSpray_2:
call EventScript_UseLastUsedSpray
goto EventScript_UseSingleSpray_1
.endif


EventScript_SetSingleSprayAndUse::
setvar VAR_RESULT, 0
call EventScript_UseSpray
return


EventScript_UseDifferentSpray::
specialvar LOCAL_VAR_NEW_SPRAY, GetSprayId
bufferitemname STR_VAR_2, LOCAL_VAR_NEW_SPRAY
msgbox Text_SprayWoreOffAskUseX, MSGBOX_YESNO
compare VAR_RESULT, YES
goto_if_eq EventScript_UseDifferentSpray_2
EventScript_UseDifferentSpray_1:
return

EventScript_UseDifferentSpray_2:
copyvar LOCAL_VAR_SPRAY, LOCAL_VAR_NEW_SPRAY
call EventScript_SetSingleSprayAndUse
goto EventScript_UseDifferentSpray_1


.if VAR_LAST_REPEL_LURE_USED != 0
EventScript_UseLastUsedSpray::
msgbox Text_SprayWoreOffAskUseAnother, MSGBOX_YESNO
compare VAR_RESULT, YES
goto_if_eq EventScript_UseLastUsedSpray_2
EventScript_UseLastUsedSpray_1:
return

EventScript_UseLastUsedSpray_2:
copyvar LOCAL_VAR_SPRAY, VAR_LAST_REPEL_LURE_USED
call EventScript_SetSingleSprayAndUse
goto EventScript_UseLastUsedSpray_1
.endif


.if I_REPEL_LURE_MENU == TRUE
goto_if_eq VAR_RESULT, NO, EventScript_LureWoreOff_End
callnative TryDrawLureMenu
goto_if_eq VAR_RESULT, FALSE, EventScript_LureWoreOff_Chose
EventScript_ChooseWhichSpray::
message Text_SprayWoreOffAskUseAnother
waitmessage
callnative DrawSprayMenu
waitstate
goto_if_eq VAR_RESULT, 127, EventScript_LureWoreOff_End
EventScript_LureWoreOff_Chose:
callnative HandleLureMenuChoice
bufferitemname 1, VAR_0x8004
removeitem VAR_0x8004, 1
playse SE_REPEL
msgbox Text_UsedNewRepelLure, MSGBOX_SIGN
.else
goto_if_eq VAR_RESULT, YES, EventScript_UsedLure
.endif
EventScript_LureWoreOff_End:
release
compare VAR_RESULT, MULTI_B_PRESSED
goto_if_ne EventScript_ChooseWhichSpray_3
EventScript_ChooseWhichSpray_1:
closemessage
releaseall
end

EventScript_UsedLure:
bufferitemname 1, VAR_LAST_REPEL_LURE_USED
EventScript_ChooseWhichSpray_2:
call EventScript_UseSpray
goto EventScript_ChooseWhichSpray_1

EventScript_ChooseWhichSpray_3:
compare VAR_RESULT, VAR_0x8003
goto_if_ne EventScript_ChooseWhichSpray_2
goto EventScript_ChooseWhichSpray_1
.endif


EventScript_UseSpray::
playse SE_REPEL
lock
msgbox Text_UsedNewRepelLure, MSGBOX_SIGN
removeitem VAR_LAST_REPEL_LURE_USED, 1
waitse
callnative HandleUseExpiredLure
release
end
callnative HandleSprayMenuChoice
removeitem LOCAL_VAR_SPRAY, 1
bufferitemname STR_VAR_2, LOCAL_VAR_SPRAY
msgbox Text_SprayWoreOffUseX, MSGBOX_SIGN
return

Text_RepelWoreOff:
.string "Repel's effect wore off…$"

Text_UseAnotherRepel::
.string "Repel's effect wore off!\n"
.string "Use another?$"
Text_SprayWoreOff::
.string "{STR_VAR_1}'s effect wore off…$"

Text_LureWoreOff:
.string "Lure's effect wore off…$"

Text_UseAnotherLure::
.string "Lure's effect wore off!\n"
Text_SprayWoreOffAskUseAnother::
.string "{STR_VAR_1}'s effect wore off!\n"
.string "Use another?$"

Text_UsedNewRepelLure::
Text_SprayWoreOffAskUseX::
.string "{STR_VAR_1}'s effect wore off…\n"
.string "Use a {STR_VAR_2}?$"

Text_SprayWoreOffUseX::
.string "{PLAYER} used the\n"
.string "{STR_VAR_2}.$"
5 changes: 3 additions & 2 deletions data/specials.inc
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,8 @@ gSpecials::
def_special TrySetBattleTowerLinkType
def_special SetTotemBoost
def_special TrySpecialOverworldEvo
def_special GetBaseSpecies
def_special SetCurrentSpecies
def_special CreateWonderTradePokemon
def_special ShowEvIvScreen
def_special GetNumberSprayStrength
def_special GetSprayId
def_special GetLastUsedSprayType
2 changes: 2 additions & 0 deletions include/script_menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@
#define GUARD_SCRIPT_MENU_H

#include "constants/script_menu.h"
#include "menu.h"

extern const u8 *const gStdStrings[];

bool8 ScriptMenu_Multichoice(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress);
bool8 ScriptMenu_MultichoiceWithDefault(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress, u8 defaultChoice);
void DrawMultichoiceMenuInternal(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress, u8 cursorPos, const struct MenuAction *actions, int count);
bool8 ScriptMenu_YesNo(u8 left, u8 top);
bool8 ScriptMenu_MultichoiceGrid(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress, u8 columnCount);
bool8 ScriptMenu_ShowPokemonPic(u16 species, u8 x, u8 y);
Expand Down
115 changes: 1 addition & 114 deletions src/script_menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ static u16 UNUSED GetLengthWithExpandedPlayerName(const u8 *str)
return length;
}

static void DrawMultichoiceMenuInternal(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress, u8 cursorPos, const struct MenuAction *actions, int count)
void DrawMultichoiceMenuInternal(u8 left, u8 top, u8 multichoiceId, bool8 ignoreBPress, u8 cursorPos, const struct MenuAction *actions, int count)
{
int i;
u8 windowId;
Expand All @@ -126,119 +126,6 @@ static void DrawMultichoiceMenu(u8 left, u8 top, u8 multichoiceId, bool8 ignoreB
DrawMultichoiceMenuInternal(left, top, multichoiceId, ignoreBPress, cursorPos, sMultichoiceLists[multichoiceId].list, sMultichoiceLists[multichoiceId].count);
}

#if I_REPEL_LURE_MENU == TRUE
void TryDrawRepelMenu(struct ScriptContext *ctx)
{
static const u16 repelItems[] = {ITEM_REPEL, ITEM_SUPER_REPEL, ITEM_MAX_REPEL};
struct MenuAction menuItems[ARRAY_COUNT(repelItems) + 1] = {NULL};
int i, count = 0, menuPos = 0;

for (i = 0; i < ARRAY_COUNT(repelItems); i++)
{
if (CheckBagHasItem(repelItems[i], 1))
{
VarSet(VAR_0x8004 + count, repelItems[i]);
#if VAR_LAST_REPEL_LURE_USED != 0
if (VarGet(VAR_LAST_REPEL_LURE_USED) == repelItems[i])
menuPos = count;
#endif
menuItems[count].text = ItemId_GetName(repelItems[i]);
count++;
}
}

if (count > 1)
DrawMultichoiceMenuInternal(0, 0, 0, FALSE, menuPos, menuItems, count);

gSpecialVar_Result = (count > 1);
}

void HandleRepelMenuChoice(struct ScriptContext *ctx)
{
gSpecialVar_0x8004 = VarGet(VAR_0x8004 + gSpecialVar_Result); // Get item Id;
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_0x8004));
#if VAR_LAST_REPEL_LURE_USED != 0
VarSet(VAR_LAST_REPEL_LURE_USED, gSpecialVar_0x8004);
#endif
}

void TryDrawLureMenu(struct ScriptContext *ctx)
{
static const u16 lureItems[] = {ITEM_LURE, ITEM_SUPER_LURE, ITEM_MAX_LURE};
struct MenuAction menuItems[ARRAY_COUNT(lureItems) + 1] = {NULL};
int i, count = 0, menuPos = 0;


for (i = 0; i < ARRAY_COUNT(lureItems); i++)
{
if (CheckBagHasItem(lureItems[i], 1))
{
VarSet(VAR_0x8004 + count, lureItems[i]);
#if VAR_LAST_REPEL_LURE_USED != 0
if (VarGet(VAR_LAST_REPEL_LURE_USED) == lureItems[i])
menuPos = count;
#endif
menuItems[count].text = ItemId_GetName(lureItems[i]);
count++;
}
}

if (count > 1)
DrawMultichoiceMenuInternal(0, 0, 0, FALSE, menuPos, menuItems, count);

gSpecialVar_Result = (count > 1);
}

void HandleLureMenuChoice(struct ScriptContext *ctx)
{
gSpecialVar_0x8004 = VarGet(VAR_0x8004 + gSpecialVar_Result); // Get item Id;
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_0x8004) | REPEL_LURE_MASK);
#if VAR_LAST_REPEL_LURE_USED != 0
VarSet(VAR_LAST_REPEL_LURE_USED, gSpecialVar_0x8004);
#endif
}
#endif //I_REPEL_LURE_MENU == TRUE
void DrawObjEventNameBox(u8 left, u8 top, const u8 *text)
{
u32 i;
static u8 windowId;
u8 newWidth;
u8 count = 1;
u8 width = 0;
u8 marginSpace;

//These 3 vars are used to repeat the function when needed
u8 tempLeft = left;
u8 tempTop = top;
tempText = text;

width = DisplayTextAndGetWidth(text, width);
newWidth = ConvertPixelWidthToTileWidth(width);
left = ScriptMenu_AdjustLeftCoordFromWidth(left, newWidth);
windowId = CreateWindowFromRect(left, top, newWidth, count * 2);

if (isNameBoxActive == FALSE) { //Newly loading name box

SetStandardWindowBorderStyle(windowId, FALSE);
StringExpandPlaceholders(gStringVar4, text);
AddTextPrinterParameterized(windowId, 1, gStringVar4, 6, 0, TEXT_SKIP_DRAW, NULL);
CopyWindowToVram(windowId, COPYWIN_GFX);
ScheduleBgCopyTilemapToVram(2);

} else { //Loading a name box over another one

ClearToTransparentAndRemoveWindow(windowId); //what this else condtional does is to make it look as if it buffered. looks better imo
for (i = 0; i <= 125500; i++) { //just a delay lol
isNameBoxActive = FALSE;
}
DrawObjEventNameBox(tempLeft, tempTop, tempText); //reload function
}

nameBoxWindowId = windowId; //I use an EWRAM_DATA to access the value in the closemessage function to remove the namebox
isNameBoxActive = TRUE;
}


#define tLeft data[0]
#define tTop data[1]
#define tRight data[2]
Expand Down
Loading

0 comments on commit 2d65b02

Please sign in to comment.