mirror of https://github.com/pret/pokeemerald.git
New step (var2 bugfix) added, updated Task_UseRepel code
parent
a38200afe5
commit
001ef3ffbe
|
@ -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
|
||||
...
|
||||
```
|
||||
|
|
Loading…
Reference in New Issue