From 001ef3ffbe84641da2e1b559ca2ba8b0a4dfc6cf Mon Sep 17 00:00:00 2001 From: Scyrous <74797764+Scyrous@users.noreply.github.com> Date: Thu, 27 Jun 2024 21:08:17 +0200 Subject: [PATCH] New step (var2 bugfix) added, updated Task_UseRepel code --- Prompt-for-reusing-Repels.md | 38 ++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/Prompt-for-reusing-Repels.md b/Prompt-for-reusing-Repels.md index f61cb9f..8eed52c 100644 --- a/Prompt-for-reusing-Repels.md +++ b/Prompt-for-reusing-Repels.md @@ -4,8 +4,9 @@ This tutorial will ask the player, upon a Repel running out, if they want to use ## Contents 1. [Store last used Repel](#1-store-last-used-repel) -2. [Ask the player](#2-ask-the-player) -3. NEW - [Cycle through remaining repels](#3-cycle-through-repels) +2. [Copy VAR string](#2-copy-var-string) +3. [Ask the player](#3-ask-the-player) +4. [Cycle through remaining repels](#4-cycle-through-repels) ## 1. Store last used Repel @@ -27,13 +28,13 @@ Next, we need to write to the variable when a repel is used. Edit [src/item_use. + VarSet(VAR_REPEL_LAST_USED, gSpecialVar_ItemId); RemoveUsedItem(); if (!InBattlePyramid()) - DisplayItemMessage(taskId, 1, gStringVar4, BagMenu_InitListsMenu); + DisplayItemMessage(taskId, FONT_NORMAL, gStringVar4, CloseItemMessage); else DisplayItemMessageInBattlePyramid(taskId, gStringVar4, Task_CloseBattlePyramidBagMessage); } } ``` -There is one last issue. We also need a value to write to `VAR_REPEL_STEP_COUNT`. From a script, we cannot get this from the item ID alone. While we could use another unused variable, there is a way to avoid having to do this. `callnative` in scripts lets you call any function from a script. So, we can define a new function and use it with `callnative`. `callnative` is not the only way to use C code in scripts. You can also define specials and save some (but not much space), but it is largely unneeded. +We also need a value to write to `VAR_REPEL_STEP_COUNT`. From a script, we cannot get this from the item ID alone. While we could use another unused variable, there is a way to avoid having to do this. `callnative` in scripts lets you call any function from a script. So, we can define a new function and use it with `callnative`. `callnative` is not the only way to use C code in scripts. You can also define specials and save some (but not much space), but it is largely unneeded. In [src/item.c](../blob/master/src/item.c), we will declare and define a new function (note: declare the function in include/item.h): ```c @@ -45,9 +46,30 @@ void ItemId_GetHoldEffectParam_Script() VarSet(VAR_RESULT, ItemId_GetHoldEffectParam(VarGet(VAR_0x8004))); } ``` + +## 2. Copy VAR string +There is one last issue we need to solve before adding the script. We need to create a copy of gText_PlayerUsedVar2 and remove the {PAUSE_UNTIL_PRESS} portion of the string. We can't edit it directly, since gText_PlayerUsedVar2 is used in other parts of the game. If we were to use the original gText_PlayerUsedVar2 string, the player needs to press A **twice** after using a repel to get rid of the message box, which is obviously unintended. Making a copy of the string without {PAUSE_UNTIL_PRESS} bypasses this problem. + +In [src/strings.c](../blob/master/src/strings.c) and [include/strings.h](../blob/master/include/strings.h), add a new string called gText_PlayerUsedRepel. + +**strings.c** +```diff + const u8 gText_TMHMContainedVar1[] = _("It contained\n{STR_VAR_1}.\pTeach {STR_VAR_1}\nto a POKéMON?"); + const u8 gText_PlayerUsedVar2[] = _("{PLAYER} used the\n{STR_VAR_2}.{PAUSE_UNTIL_PRESS}"); ++const u8 gText_PlayerUsedRepel[] = _("{PLAYER} used the\n{STR_VAR_2}."); + const u8 gText_RepelEffectsLingered[] = _("But the effects of a REPEL\nlingered from earlier.{PAUSE_UNTIL_PRESS}"); +``` +**strings.h** +```diff + extern const u8 gText_TMHMContainedVar1[]; + extern const u8 gText_PlayerUsedVar2[]; ++extern const u8 gText_PlayerUsedRepel[]; + extern const u8 gText_RepelEffectsLingered[]; +``` + Next, we will modify the script to ask the player if they want to use another repel. -## 2. Ask the player +## 3. Ask the player Now, we have everything we need. Edit [data/scripts/repel.inc](../blob/master/data/scripts/repel.inc): ```diff EventScript_RepelWoreOff:: @@ -64,7 +86,7 @@ Now, we have everything we need. Edit [data/scripts/repel.inc](../blob/master/da + bufferitemname 1, VAR_REPEL_LAST_USED + removeitem VAR_REPEL_LAST_USED, 1 + playse SE_REPEL -+ msgbox gText_PlayerUsedVar2, MSGBOX_SIGN ++ msgbox gText_PlayerUsedRepel, MSGBOX_SIGN + goto EventScript_RepelWoreOff_End +EventScript_RepelWoreOff_ChooseNo: + closemessage @@ -91,7 +113,7 @@ And that's it! Alternatively, check out DizzyEgg's [repel](https://github.com/DizzyEggg/pokeemerald/tree/repel) branch for a version which uses a multichoice box instead. -## 3. Cycle Through Repels +## 4. Cycle Through Repels If you've still got repels in your bag the player will likely want to use those up as well. This is a modification of above to allow for that! First, we add an additional function. This can be placed right below Task_UseRepel in [src/item_use.c](../blob/master/src/item_use.c). And don't forget to declare the function up at the top!! @@ -153,7 +175,7 @@ Sweet! Now, throw in a `callnative` in the assembly script and we're there. Over bufferitemname 1, VAR_REPEL_LAST_USED removeitem VAR_REPEL_LAST_USED, 1 playse SE_REPEL - msgbox gText_PlayerUsedVar2, MSGBOX_SIGN + msgbox gText_PlayerUsedRepel, MSGBOX_SIGN goto EventScript_RepelWoreOff_End ... ```