Merge pull request #563 from cbt6/item-use

Document item use
This commit is contained in:
GriffinR
2022-10-03 14:38:39 -04:00
committed by GitHub
9 changed files with 543 additions and 540 deletions
+5
View File
@@ -448,6 +448,11 @@
#define NUM_TECHNICAL_MACHINES 50 #define NUM_TECHNICAL_MACHINES 50
#define NUM_HIDDEN_MACHINES 8 #define NUM_HIDDEN_MACHINES 8
// Secondary IDs for rods
#define OLD_ROD 0
#define GOOD_ROD 1
#define SUPER_ROD 2
// Check if the item is one that can be used on a Pokemon. // Check if the item is one that can be used on a Pokemon.
#define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2) #define IS_POKEMON_ITEM(item) ((item) >= ITEM_POTION && (item) <= ITEM_0B2)
+11 -2
View File
@@ -16,11 +16,11 @@ struct Item
u8 importance; u8 importance;
u8 exitsBagOnUse; u8 exitsBagOnUse;
u8 pocket; u8 pocket;
u8 type; u8 type; // unused for balls
ItemUseFunc fieldUseFunc; ItemUseFunc fieldUseFunc;
u8 battleUsage; u8 battleUsage;
ItemUseFunc battleUseFunc; ItemUseFunc battleUseFunc;
u8 secondaryId; u8 secondaryId; // only used for fishing rods
}; };
struct BagPocket struct BagPocket
@@ -29,6 +29,15 @@ struct BagPocket
u8 capacity; u8 capacity;
}; };
// Item type IDs (used to determine the exit callback)
enum {
ITEM_TYPE_MAIL,
ITEM_TYPE_PARTY_MENU,
ITEM_TYPE_FIELD,
ITEM_TYPE_UNUSED, // Used for Pokeblock case in RSE
ITEM_TYPE_BAG_MENU, // No exit callback, stays in bag menu
};
extern const struct Item gItems[]; extern const struct Item gItems[];
extern struct BagPocket gBagPockets[]; extern struct BagPocket gBagPockets[];
+7 -7
View File
@@ -6,9 +6,9 @@
void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8); void Task_ItemUse_CloseMessageBoxAndReturnToField_VsSeeker(u8);
void ItemUse_SetQuestLogEvent(u8, struct Pokemon *, u16, u16); void ItemUse_SetQuestLogEvent(u8, struct Pokemon *, u16, u16);
void FieldUseFunc_OrangeMail(u8 taskId); void FieldUseFunc_Mail(u8 taskId);
void FieldUseFunc_MachBike(u8 taskId); void FieldUseFunc_Bike(u8 taskId);
void FieldUseFunc_OldRod(u8 taskId); void FieldUseFunc_Rod(u8 taskId);
void FieldUseFunc_CoinCase(u8 taskId); void FieldUseFunc_CoinCase(u8 taskId);
void FieldUseFunc_PowderJar(u8 taskId); void FieldUseFunc_PowderJar(u8 taskId);
void FieldUseFunc_PokeFlute(u8 taskId); void FieldUseFunc_PokeFlute(u8 taskId);
@@ -22,14 +22,14 @@ void FieldUseFunc_TmCase(u8 taskId);
void FieldUseFunc_BerryPouch(u8 taskId); void FieldUseFunc_BerryPouch(u8 taskId);
void BattleUseFunc_BerryPouch(u8 taskId); void BattleUseFunc_BerryPouch(u8 taskId);
void FieldUseFunc_TeachyTv(u8 taskId); void FieldUseFunc_TeachyTv(u8 taskId);
void FieldUseFunc_SuperRepel(u8 taskId); void FieldUseFunc_Repel(u8 taskId);
void FieldUseFunc_BlackFlute(u8 taskId); void FieldUseFunc_BlackWhiteFlute(u8 taskId);
void FieldUseFunc_TownMap(u8 taskId); void FieldUseFunc_TownMap(u8 taskId);
void FieldUseFunc_FameChecker(u8 taskId); void FieldUseFunc_FameChecker(u8 taskId);
void FieldUseFunc_VsSeeker(u8 taskId); void FieldUseFunc_VsSeeker(u8 taskId);
void BattleUseFunc_PokeBallEtc(u8 taskId); void BattleUseFunc_PokeBallEtc(u8 taskId);
void BattleUseFunc_PokeFlute(u8 taskId); void BattleUseFunc_PokeFlute(u8 taskId);
void BattleUseFunc_GuardSpec(u8 taskId); void BattleUseFunc_StatBooster(u8 taskId);
void BattleUseFunc_Medicine(u8 taskId); void BattleUseFunc_Medicine(u8 taskId);
void BattleUseFunc_Ether(u8 taskId); void BattleUseFunc_Ether(u8 taskId);
void BattleUseFunc_PokeDoll(u8 taskId); void BattleUseFunc_PokeDoll(u8 taskId);
@@ -38,7 +38,7 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId);
void ItemUseOutOfBattle_EnigmaBerry(u8 taskId); void ItemUseOutOfBattle_EnigmaBerry(u8 taskId);
void ItemUseInBattle_EnigmaBerry(u8 taskId); void ItemUseInBattle_EnigmaBerry(u8 taskId);
void ItemUseOutOfBattle_Itemfinder(u8 taskId); void ItemUseOutOfBattle_Itemfinder(u8 taskId);
void sub_80A1C44(u8 taskId); void Task_UseDigEscapeRopeOnField(u8 taskId);
u8 CanUseEscapeRopeOnCurrMap(void); u8 CanUseEscapeRopeOnCurrMap(void);
u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId); u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId);
+1 -1
View File
@@ -1074,7 +1074,7 @@ static void Task_BerryPouch_Use(u8 taskId)
else else
ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId);
} }
else if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1) else if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == ITEM_TYPE_PARTY_MENU)
Task_Give_PrintThereIsNoPokemon(taskId); Task_Give_PrintThereIsNoPokemon(taskId);
else else
ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
+396 -396
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -41,6 +41,6 @@ static void StartDigFieldEffect(void)
u8 taskId; u8 taskId;
FieldEffectActiveListRemove(FLDEFF_USE_DIG); FieldEffectActiveListRemove(FLDEFF_USE_DIG);
taskId = CreateTask(sub_80A1C44, 8); taskId = CreateTask(Task_UseDigEscapeRopeOnField, 8);
gTasks[taskId].data[0] = 0; gTasks[taskId].data[0] = 0;
} }
+1 -1
View File
@@ -1475,7 +1475,7 @@ static void Task_ItemMenuAction_Use(u8 taskId)
PutWindowTilemap(0); PutWindowTilemap(0);
PutWindowTilemap(1); PutWindowTilemap(1);
ScheduleBgCopyTilemapToVram(0); ScheduleBgCopyTilemapToVram(0);
if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1) if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == ITEM_TYPE_PARTY_MENU)
Task_PrintThereIsNoPokemon(taskId); Task_PrintThereIsNoPokemon(taskId);
else else
ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
+121 -125
View File
@@ -33,6 +33,7 @@
#include "vs_seeker.h" #include "vs_seeker.h"
#include "constants/sound.h" #include "constants/sound.h"
#include "constants/items.h" #include "constants/items.h"
#include "constants/item_effects.h"
#include "constants/maps.h" #include "constants/maps.h"
#include "constants/moves.h" #include "constants/moves.h"
#include "constants/songs.h" #include "constants/songs.h"
@@ -43,14 +44,14 @@ static EWRAM_DATA void (*sItemUseOnFieldCB)(u8 taskId) = NULL;
static void FieldCB_FadeInFromBlack(void); static void FieldCB_FadeInFromBlack(void);
static void Task_WaitFadeIn_CallItemUseOnFieldCB(u8 taskId); static void Task_WaitFadeIn_CallItemUseOnFieldCB(u8 taskId);
static void Task_ItemUse_CloseMessageBoxAndReturnToField(u8 taskId); static void Task_ItemUse_CloseMessageBoxAndReturnToField(u8 taskId);
static void sub_80A11C0(u8 taskId); static void Task_ItemUseWaitForFade(u8 taskId);
static bool8 sub_80A1194(void); static bool8 FieldCB2_UseItemFromField(void);
static void sub_80A1208(void); static void CB2_CheckMail(void);
static void ItemUseOnFieldCB_Bicycle(u8 taskId); static void ItemUseOnFieldCB_Bicycle(u8 taskId);
static bool8 ItemUseCheckFunc_Rod(void); static bool8 CanFish(void);
static void ItemUseOnFieldCB_Rod(u8 taskId); static void ItemUseOnFieldCB_Rod(u8 taskId);
static void sub_80A1648(u8 taskId); static void Task_PlayPokeFlute(u8 taskId);
static void sub_80A1674(u8 taskId); static void Task_DisplayPokeFluteMessage(u8 taskId);
static void InitTMCaseFromBag(void); static void InitTMCaseFromBag(void);
static void Task_InitTMCaseFromField(u8 taskId); static void Task_InitTMCaseFromField(u8 taskId);
static void InitBerryPouchFromBag(void); static void InitBerryPouchFromBag(void);
@@ -58,14 +59,14 @@ static void Task_InitBerryPouchFromField(u8 taskId);
static void InitBerryPouchFromBattle(void); static void InitBerryPouchFromBattle(void);
static void InitTeachyTvFromBag(void); static void InitTeachyTvFromBag(void);
static void Task_InitTeachyTvFromField(u8 taskId); static void Task_InitTeachyTvFromField(u8 taskId);
static void sub_80A19E8(u8 taskId); static void Task_UseRepel(u8 taskId);
static void sub_80A1A44(void); static void RemoveUsedItem(void);
static void sub_80A1B48(u8 taskId); static void Task_UsedBlackWhiteFlute(u8 taskId);
static void sub_80A1C08(u8 taskId); static void ItemUseOnFieldCB_EscapeRope(u8 taskId);
static void sub_80A1CAC(void); static void UseTownMapFromBag(void);
static void sub_80A1CC0(u8 taskId); static void Task_UseTownMapFromField(u8 taskId);
static void sub_80A1D58(void); static void UseFameCheckerFromBag(void);
static void sub_80A1D68(u8 taskId); static void Task_UseFameCheckerFromField(u8 taskId);
static void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId); static void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId);
static void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId); static void Task_BattleUse_StatBooster_WaitButton_ReturnToBattle(u8 taskId);
@@ -126,13 +127,13 @@ static const u8 sUnref_83E27B4[] = {
}; };
static void (*const sExitCallbackByItemType[])(void) = { static void (*const sExitCallbackByItemType[])(void) = {
CB2_ShowPartyMenuForItemUse, [ITEM_TYPE_PARTY_MENU - 1] = CB2_ShowPartyMenuForItemUse,
CB2_ReturnToField, [ITEM_TYPE_FIELD - 1] = CB2_ReturnToField,
NULL, [ITEM_TYPE_UNUSED - 1] = NULL,
NULL [ITEM_TYPE_BAG_MENU - 1] = NULL,
}; };
static void Task_FadeOuFromBackToField(u8 taskId) static void SetUpItemUseCallback(u8 taskId)
{ {
u8 itemType; u8 itemType;
if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY) if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY)
@@ -147,18 +148,18 @@ static void Task_FadeOuFromBackToField(u8 taskId)
else else
{ {
ItemMenu_SetExitCallback(sExitCallbackByItemType[itemType]); ItemMenu_SetExitCallback(sExitCallbackByItemType[itemType]);
if (itemType == 1) if (itemType == ITEM_TYPE_FIELD - 1)
Bag_BeginCloseWin0Animation(); Bag_BeginCloseWin0Animation();
ItemMenu_StartFadeToExitCallback(taskId); ItemMenu_StartFadeToExitCallback(taskId);
} }
} }
static void sub_80A103C(u8 taskId) static void SetUpItemUseOnFieldCallback(u8 taskId)
{ {
if (gTasks[taskId].data[3] != 1) if (gTasks[taskId].data[3] != 1)
{ {
gFieldCallback = FieldCB_FadeInFromBlack; gFieldCallback = FieldCB_FadeInFromBlack;
Task_FadeOuFromBackToField(taskId); SetUpItemUseCallback(taskId);
} }
else else
sItemUseOnFieldCB(taskId); sItemUseOnFieldCB(taskId);
@@ -173,12 +174,10 @@ static void FieldCB_FadeInFromBlack(void)
static void Task_WaitFadeIn_CallItemUseOnFieldCB(u8 taskId) static void Task_WaitFadeIn_CallItemUseOnFieldCB(u8 taskId)
{ {
if (IsWeatherNotFadingIn() == TRUE) if (IsWeatherNotFadingIn() == TRUE)
{
sItemUseOnFieldCB(taskId); sItemUseOnFieldCB(taskId);
}
} }
static void DisplayItemMessageInCurrentContext(u8 taskId, bool8 inField, u8 fontId, const u8 * str) static void DisplayItemMessageInCurrentContext(u8 taskId, bool8 inField, u8 fontId, const u8 *str)
{ {
StringExpandPlaceholders(gStringVar4, str); StringExpandPlaceholders(gStringVar4, str);
if (inField == FALSE) if (inField == FALSE)
@@ -210,22 +209,22 @@ u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId)
return 0; return 0;
} }
static void sub_80A1184(void) static void SetFieldCallback2ForItemUse(void)
{ {
gFieldCallback2 = sub_80A1194; gFieldCallback2 = FieldCB2_UseItemFromField;
} }
static bool8 sub_80A1194(void) static bool8 FieldCB2_UseItemFromField(void)
{ {
FreezeObjectEvents(); FreezeObjectEvents();
LockPlayerFieldControls(); LockPlayerFieldControls();
FadeInFromBlack(); FadeInFromBlack();
CreateTask(sub_80A11C0, 10); CreateTask(Task_ItemUseWaitForFade, 10);
gExitStairsMovementDisabled = FALSE; gExitStairsMovementDisabled = FALSE;
return TRUE; return TRUE;
} }
static void sub_80A11C0(u8 taskId) static void Task_ItemUseWaitForFade(u8 taskId)
{ {
if (IsWeatherNotFadingIn() == TRUE) if (IsWeatherNotFadingIn() == TRUE)
{ {
@@ -235,21 +234,21 @@ static void sub_80A11C0(u8 taskId)
} }
} }
void FieldUseFunc_OrangeMail(u8 taskId) void FieldUseFunc_Mail(u8 taskId)
{ {
ItemMenu_SetExitCallback(sub_80A1208); ItemMenu_SetExitCallback(CB2_CheckMail);
ItemMenu_StartFadeToExitCallback(taskId); ItemMenu_StartFadeToExitCallback(taskId);
} }
static void sub_80A1208(void) static void CB2_CheckMail(void)
{ {
struct Mail mail; struct Mail mail;
mail.itemId = gSpecialVar_ItemId; mail.itemId = gSpecialVar_ItemId;
ReadMail(&mail, CB2_BagMenuFromStartMenu, 0); ReadMail(&mail, CB2_BagMenuFromStartMenu, FALSE);
} }
void FieldUseFunc_MachBike(u8 taskId) void FieldUseFunc_Bike(u8 taskId)
{ {
s16 x, y; s16 x, y;
u8 behavior; u8 behavior;
@@ -266,7 +265,7 @@ void FieldUseFunc_MachBike(u8 taskId)
else if (Overworld_IsBikingAllowed() == TRUE && !IsBikingDisallowedByPlayer()) else if (Overworld_IsBikingAllowed() == TRUE && !IsBikingDisallowedByPlayer())
{ {
sItemUseOnFieldCB = ItemUseOnFieldCB_Bicycle; sItemUseOnFieldCB = ItemUseOnFieldCB_Bicycle;
sub_80A103C(taskId); SetUpItemUseOnFieldCallback(taskId);
} }
else else
PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);
@@ -282,18 +281,18 @@ static void ItemUseOnFieldCB_Bicycle(u8 taskId)
DestroyTask(taskId); DestroyTask(taskId);
} }
void FieldUseFunc_OldRod(u8 taskId) void FieldUseFunc_Rod(u8 taskId)
{ {
if (ItemUseCheckFunc_Rod() == TRUE) if (CanFish() == TRUE)
{ {
sItemUseOnFieldCB = ItemUseOnFieldCB_Rod; sItemUseOnFieldCB = ItemUseOnFieldCB_Rod;
sub_80A103C(taskId); SetUpItemUseOnFieldCallback(taskId);
} }
else else
PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);
} }
static bool8 ItemUseCheckFunc_Rod(void) static bool8 CanFish(void)
{ {
s16 x, y; s16 x, y;
u16 behavior; u16 behavior;
@@ -330,7 +329,7 @@ void ItemUseOutOfBattle_Itemfinder(u8 taskId)
{ {
IncrementGameStat(GAME_STAT_USED_ITEMFINDER); IncrementGameStat(GAME_STAT_USED_ITEMFINDER);
sItemUseOnFieldCB = ItemUseOnFieldCB_Itemfinder; sItemUseOnFieldCB = ItemUseOnFieldCB_Itemfinder;
sub_80A103C(taskId); SetUpItemUseOnFieldCallback(taskId);
} }
void FieldUseFunc_CoinCase(u8 taskId) void FieldUseFunc_CoinCase(u8 taskId)
@@ -362,7 +361,7 @@ void FieldUseFunc_PokeFlute(u8 taskId)
for (i = 0; i < CalculatePlayerPartyCount(); i++) for (i = 0; i < CalculatePlayerPartyCount(); i++)
{ {
if (!ExecuteTableBasedItemEffect(&gPlayerParty[i], ITEM_AWAKENING, i, MOVE_NONE)) if (!ExecuteTableBasedItemEffect(&gPlayerParty[i], ITEM_AWAKENING, i, 0))
wokeSomeoneUp = TRUE; wokeSomeoneUp = TRUE;
} }
@@ -370,9 +369,9 @@ void FieldUseFunc_PokeFlute(u8 taskId)
{ {
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);
if (gTasks[taskId].data[3] == 0) if (gTasks[taskId].data[3] == 0)
DisplayItemMessageInBag(taskId, FONT_2, gText_PlayedPokeFlute, sub_80A1648); DisplayItemMessageInBag(taskId, FONT_2, gText_PlayedPokeFlute, Task_PlayPokeFlute);
else else
DisplayItemMessageOnField(taskId, FONT_2, gText_PlayedPokeFlute, sub_80A1648); DisplayItemMessageOnField(taskId, FONT_2, gText_PlayedPokeFlute, Task_PlayPokeFlute);
} }
else else
{ {
@@ -383,13 +382,13 @@ void FieldUseFunc_PokeFlute(u8 taskId)
} }
} }
static void sub_80A1648(u8 taskId) static void Task_PlayPokeFlute(u8 taskId)
{ {
PlayFanfareByFanfareNum(FANFARE_POKE_FLUTE); PlayFanfareByFanfareNum(FANFARE_POKE_FLUTE);
gTasks[taskId].func = sub_80A1674; gTasks[taskId].func = Task_DisplayPokeFluteMessage;
} }
static void sub_80A1674(u8 taskId) static void Task_DisplayPokeFluteMessage(u8 taskId)
{ {
if (WaitFanfare(FALSE)) if (WaitFanfare(FALSE))
{ {
@@ -400,45 +399,45 @@ static void sub_80A1674(u8 taskId)
} }
} }
static void sub_80A16D0(u8 taskId) static void DoSetUpItemUseCallback(u8 taskId)
{ {
Task_FadeOuFromBackToField(taskId); SetUpItemUseCallback(taskId);
} }
void FieldUseFunc_Medicine(u8 taskId) void FieldUseFunc_Medicine(u8 taskId)
{ {
gItemUseCB = ItemUseCB_Medicine; gItemUseCB = ItemUseCB_Medicine;
sub_80A16D0(taskId); DoSetUpItemUseCallback(taskId);
} }
void FieldUseFunc_Ether(u8 taskId) void FieldUseFunc_Ether(u8 taskId)
{ {
gItemUseCB = ItemUseCB_TryRestorePP; gItemUseCB = ItemUseCB_TryRestorePP;
sub_80A16D0(taskId); DoSetUpItemUseCallback(taskId);
} }
void FieldUseFunc_PpUp(u8 taskId) void FieldUseFunc_PpUp(u8 taskId)
{ {
gItemUseCB = ItemUseCB_PPUp; gItemUseCB = ItemUseCB_PPUp;
sub_80A16D0(taskId); DoSetUpItemUseCallback(taskId);
} }
void FieldUseFunc_RareCandy(u8 taskId) void FieldUseFunc_RareCandy(u8 taskId)
{ {
gItemUseCB = ItemUseCB_RareCandy; gItemUseCB = ItemUseCB_RareCandy;
sub_80A16D0(taskId); DoSetUpItemUseCallback(taskId);
} }
void FieldUseFunc_EvoItem(u8 taskId) void FieldUseFunc_EvoItem(u8 taskId)
{ {
gItemUseCB = ItemUseCB_EvolutionStone; gItemUseCB = ItemUseCB_EvolutionStone;
sub_80A16D0(taskId); DoSetUpItemUseCallback(taskId);
} }
void FieldUseFunc_SacredAsh(u8 taskId) void FieldUseFunc_SacredAsh(u8 taskId)
{ {
gItemUseCB = ItemUseCB_SacredAsh; gItemUseCB = ItemUseCB_SacredAsh;
Task_FadeOuFromBackToField(taskId); SetUpItemUseCallback(taskId);
} }
void FieldUseFunc_TmCase(u8 taskId) void FieldUseFunc_TmCase(u8 taskId)
@@ -466,7 +465,7 @@ static void Task_InitTMCaseFromField(u8 taskId)
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
CleanupOverworldWindowsAndTilemaps(); CleanupOverworldWindowsAndTilemaps();
sub_80A1184(); SetFieldCallback2ForItemUse();
InitTMCase(0, CB2_ReturnToField, 1); InitTMCase(0, CB2_ReturnToField, 1);
DestroyTask(taskId); DestroyTask(taskId);
} }
@@ -497,7 +496,7 @@ static void Task_InitBerryPouchFromField(u8 taskId)
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
CleanupOverworldWindowsAndTilemaps(); CleanupOverworldWindowsAndTilemaps();
sub_80A1184(); SetFieldCallback2ForItemUse();
InitBerryPouch(BERRYPOUCH_FROMFIELD, CB2_ReturnToField, 1); InitBerryPouch(BERRYPOUCH_FROMFIELD, CB2_ReturnToField, 1);
DestroyTask(taskId); DestroyTask(taskId);
} }
@@ -540,36 +539,36 @@ static void Task_InitTeachyTvFromField(u8 taskId)
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
CleanupOverworldWindowsAndTilemaps(); CleanupOverworldWindowsAndTilemaps();
sub_80A1184(); SetFieldCallback2ForItemUse();
InitTeachyTvController(0, CB2_ReturnToField); InitTeachyTvController(0, CB2_ReturnToField);
DestroyTask(taskId); DestroyTask(taskId);
} }
} }
void FieldUseFunc_SuperRepel(u8 taskId) void FieldUseFunc_Repel(u8 taskId)
{ {
if (VarGet(VAR_REPEL_STEP_COUNT) == 0) if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
{ {
PlaySE(SE_REPEL); PlaySE(SE_REPEL);
gTasks[taskId].func = sub_80A19E8; gTasks[taskId].func = Task_UseRepel;
} }
else else
// An earlier repel is still in effect // An earlier repel is still in effect
DisplayItemMessageInBag(taskId, FONT_2, gText_RepelEffectsLingered, Task_ReturnToBagFromContextMenu); DisplayItemMessageInBag(taskId, FONT_2, gText_RepelEffectsLingered, Task_ReturnToBagFromContextMenu);
} }
static void sub_80A19E8(u8 taskId) static void Task_UseRepel(u8 taskId)
{ {
if (!IsSEPlaying()) if (!IsSEPlaying())
{ {
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);
VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId)); VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
sub_80A1A44(); RemoveUsedItem();
DisplayItemMessageInBag(taskId, FONT_2, gStringVar4, Task_ReturnToBagFromContextMenu); DisplayItemMessageInBag(taskId, FONT_2, gStringVar4, Task_ReturnToBagFromContextMenu);
} }
} }
static void sub_80A1A44(void) static void RemoveUsedItem(void)
{ {
RemoveBagItem(gSpecialVar_ItemId, 1); RemoveBagItem(gSpecialVar_ItemId, 1);
Pocket_CalculateNItemsAndMaxShowed(ItemId_GetPocket(gSpecialVar_ItemId)); Pocket_CalculateNItemsAndMaxShowed(ItemId_GetPocket(gSpecialVar_ItemId));
@@ -578,7 +577,7 @@ static void sub_80A1A44(void)
StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2); StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2);
} }
void FieldUseFunc_BlackFlute(u8 taskId) void FieldUseFunc_BlackWhiteFlute(u8 taskId)
{ {
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);
if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE) if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE)
@@ -587,7 +586,7 @@ void FieldUseFunc_BlackFlute(u8 taskId)
FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE); FlagClear(FLAG_SYS_BLACK_FLUTE_ACTIVE);
CopyItemName(gSpecialVar_ItemId, gStringVar2); CopyItemName(gSpecialVar_ItemId, gStringVar2);
StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured); StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured);
gTasks[taskId].func = sub_80A1B48; gTasks[taskId].func = Task_UsedBlackWhiteFlute;
gTasks[taskId].data[8] = 0; gTasks[taskId].data[8] = 0;
} }
else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE) else if (gSpecialVar_ItemId == ITEM_BLACK_FLUTE)
@@ -596,12 +595,12 @@ void FieldUseFunc_BlackFlute(u8 taskId)
FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE); FlagClear(FLAG_SYS_WHITE_FLUTE_ACTIVE);
CopyItemName(gSpecialVar_ItemId, gStringVar2); CopyItemName(gSpecialVar_ItemId, gStringVar2);
StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildRepelled); StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildRepelled);
gTasks[taskId].func = sub_80A1B48; gTasks[taskId].func = Task_UsedBlackWhiteFlute;
gTasks[taskId].data[8] = 0; gTasks[taskId].data[8] = 0;
} }
} }
static void sub_80A1B48(u8 taskId) static void Task_UsedBlackWhiteFlute(u8 taskId)
{ {
if (++gTasks[taskId].data[8] > 7) if (++gTasks[taskId].data[8] > 7)
{ {
@@ -623,22 +622,22 @@ void ItemUseOutOfBattle_EscapeRope(u8 taskId)
if (CanUseEscapeRopeOnCurrMap() == TRUE) if (CanUseEscapeRopeOnCurrMap() == TRUE)
{ {
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, gMapHeader.regionMapSectionId); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, gMapHeader.regionMapSectionId);
sItemUseOnFieldCB = sub_80A1C08; sItemUseOnFieldCB = ItemUseOnFieldCB_EscapeRope;
sub_80A103C(taskId); SetUpItemUseOnFieldCallback(taskId);
} }
else else
PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);
} }
static void sub_80A1C08(u8 taskId) static void ItemUseOnFieldCB_EscapeRope(u8 taskId)
{ {
Overworld_ResetStateAfterDigEscRope(); Overworld_ResetStateAfterDigEscRope();
sub_80A1A44(); RemoveUsedItem();
gTasks[taskId].data[0] = 0; gTasks[taskId].data[0] = 0;
DisplayItemMessageOnField(taskId, FONT_2, gStringVar4, sub_80A1C44); DisplayItemMessageOnField(taskId, FONT_2, gStringVar4, Task_UseDigEscapeRopeOnField);
} }
void sub_80A1C44(u8 taskId) void Task_UseDigEscapeRopeOnField(u8 taskId)
{ {
ResetInitialPlayerAvatarState(); ResetInitialPlayerAvatarState();
StartEscapeRopeFieldEffect(); StartEscapeRopeFieldEffect();
@@ -649,28 +648,28 @@ void FieldUseFunc_TownMap(u8 taskId)
{ {
if (gTasks[taskId].data[3] == 0) if (gTasks[taskId].data[3] == 0)
{ {
ItemMenu_SetExitCallback(sub_80A1CAC); ItemMenu_SetExitCallback(UseTownMapFromBag);
ItemMenu_StartFadeToExitCallback(taskId); ItemMenu_StartFadeToExitCallback(taskId);
} }
else else
{ {
StopPokemonLeagueLightingEffectTask(); StopPokemonLeagueLightingEffectTask();
FadeScreen(FADE_TO_BLACK, 0); FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = sub_80A1CC0; gTasks[taskId].func = Task_UseTownMapFromField;
} }
} }
static void sub_80A1CAC(void) static void UseTownMapFromBag(void)
{ {
InitRegionMapWithExitCB(REGIONMAP_TYPE_NORMAL, CB2_BagMenuFromStartMenu); InitRegionMapWithExitCB(REGIONMAP_TYPE_NORMAL, CB2_BagMenuFromStartMenu);
} }
static void sub_80A1CC0(u8 taskId) static void Task_UseTownMapFromField(u8 taskId)
{ {
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
CleanupOverworldWindowsAndTilemaps(); CleanupOverworldWindowsAndTilemaps();
sub_80A1184(); SetFieldCallback2ForItemUse();
InitRegionMapWithExitCB(REGIONMAP_TYPE_NORMAL, CB2_ReturnToField); InitRegionMapWithExitCB(REGIONMAP_TYPE_NORMAL, CB2_ReturnToField);
DestroyTask(taskId); DestroyTask(taskId);
} }
@@ -681,28 +680,28 @@ void FieldUseFunc_FameChecker(u8 taskId)
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, NULL, gSpecialVar_ItemId, 0xFFFF);
if (gTasks[taskId].data[3] == 0) if (gTasks[taskId].data[3] == 0)
{ {
ItemMenu_SetExitCallback(sub_80A1D58); ItemMenu_SetExitCallback(UseFameCheckerFromBag);
ItemMenu_StartFadeToExitCallback(taskId); ItemMenu_StartFadeToExitCallback(taskId);
} }
else else
{ {
StopPokemonLeagueLightingEffectTask(); StopPokemonLeagueLightingEffectTask();
FadeScreen(FADE_TO_BLACK, 0); FadeScreen(FADE_TO_BLACK, 0);
gTasks[taskId].func = sub_80A1D68; gTasks[taskId].func = Task_UseFameCheckerFromField;
} }
} }
static void sub_80A1D58(void) static void UseFameCheckerFromBag(void)
{ {
UseFameChecker(CB2_BagMenuFromStartMenu); UseFameChecker(CB2_BagMenuFromStartMenu);
} }
static void sub_80A1D68(u8 taskId) static void Task_UseFameCheckerFromField(u8 taskId)
{ {
if (!gPaletteFade.active) if (!gPaletteFade.active)
{ {
CleanupOverworldWindowsAndTilemaps(); CleanupOverworldWindowsAndTilemaps();
sub_80A1184(); SetFieldCallback2ForItemUse();
UseFameChecker(CB2_ReturnToField); UseFameChecker(CB2_ReturnToField);
DestroyTask(taskId); DestroyTask(taskId);
} }
@@ -724,7 +723,7 @@ void FieldUseFunc_VsSeeker(u8 taskId)
else else
{ {
sItemUseOnFieldCB = Task_VsSeeker_0; sItemUseOnFieldCB = Task_VsSeeker_0;
sub_80A103C(taskId); SetUpItemUseOnFieldCallback(taskId);
} }
} }
@@ -742,9 +741,7 @@ void BattleUseFunc_PokeBallEtc(u8 taskId)
ItemMenu_StartFadeToExitCallback(taskId); ItemMenu_StartFadeToExitCallback(taskId);
} }
else else
{
DisplayItemMessageInBag(taskId, FONT_2, gText_BoxFull, Task_ReturnToBagFromContextMenu); DisplayItemMessageInBag(taskId, FONT_2, gText_BoxFull, Task_ReturnToBagFromContextMenu);
}
} }
void BattleUseFunc_PokeFlute(u8 taskId) void BattleUseFunc_PokeFlute(u8 taskId)
@@ -753,12 +750,10 @@ void BattleUseFunc_PokeFlute(u8 taskId)
ItemMenu_StartFadeToExitCallback(taskId); ItemMenu_StartFadeToExitCallback(taskId);
} }
void BattleUseFunc_GuardSpec(u8 taskId) void BattleUseFunc_StatBooster(u8 taskId)
{ {
if (ExecuteTableBasedItemEffect(&gPlayerParty[gBattlerPartyIndexes[gBattlerInMenuId]], gSpecialVar_ItemId, gBattlerPartyIndexes[gBattlerInMenuId], 0)) if (ExecuteTableBasedItemEffect(&gPlayerParty[gBattlerPartyIndexes[gBattlerInMenuId]], gSpecialVar_ItemId, gBattlerPartyIndexes[gBattlerInMenuId], 0))
{
DisplayItemMessageInBag(taskId, FONT_2, gText_WontHaveEffect, Task_ReturnToBagFromContextMenu); DisplayItemMessageInBag(taskId, FONT_2, gText_WontHaveEffect, Task_ReturnToBagFromContextMenu);
}
else else
{ {
gTasks[taskId].data[8] = 0; gTasks[taskId].data[8] = 0;
@@ -768,7 +763,7 @@ void BattleUseFunc_GuardSpec(u8 taskId)
static void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId) static void Task_BattleUse_StatBooster_DelayAndPrint(u8 taskId)
{ {
s16 * data = gTasks[taskId].data; s16 *data = gTasks[taskId].data;
if (++data[8] > 7) if (++data[8] > 7)
{ {
@@ -808,7 +803,8 @@ void BattleUseFunc_Medicine(u8 taskId)
ItemUse_SwitchToPartyMenuInBattle(taskId); ItemUse_SwitchToPartyMenuInBattle(taskId);
} }
static void sub_80A1FD8(u8 taskId) // Unused. Sacred Ash cannot be used in battle
static void BattleUseFunc_SacredAsh(u8 taskId)
{ {
gItemUseCB = ItemUseCB_SacredAsh; gItemUseCB = ItemUseCB_SacredAsh;
ItemUse_SwitchToPartyMenuInBattle(taskId); ItemUse_SwitchToPartyMenuInBattle(taskId);
@@ -824,7 +820,7 @@ void BattleUseFunc_PokeDoll(u8 taskId)
{ {
if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER)) if (!(gBattleTypeFlags & BATTLE_TYPE_TRAINER))
{ {
sub_80A1A44(); RemoveUsedItem();
ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xFFFF); ItemUse_SetQuestLogEvent(QL_EVENT_USED_ITEM, 0, gSpecialVar_ItemId, 0xFFFF);
DisplayItemMessageInBag(taskId, FONT_2, gStringVar4, ItemMenu_StartFadeToExitCallback); DisplayItemMessageInBag(taskId, FONT_2, gStringVar4, ItemMenu_StartFadeToExitCallback);
} }
@@ -834,38 +830,38 @@ void BattleUseFunc_PokeDoll(u8 taskId)
void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
{ {
switch (GetItemEffectType(gSpecialVar_ItemId) - 1) switch (GetItemEffectType(gSpecialVar_ItemId))
{ {
case 1: case ITEM_EFFECT_HEAL_HP:
case 2: case ITEM_EFFECT_CURE_POISON:
case 3: case ITEM_EFFECT_CURE_SLEEP:
case 4: case ITEM_EFFECT_CURE_BURN:
case 5: case ITEM_EFFECT_CURE_FREEZE:
case 6: case ITEM_EFFECT_CURE_PARALYSIS:
case 10: case ITEM_EFFECT_CURE_ALL_STATUS:
case 11: case ITEM_EFFECT_ATK_EV:
case 12: case ITEM_EFFECT_HP_EV:
case 13: case ITEM_EFFECT_SPATK_EV:
case 14: case ITEM_EFFECT_SPDEF_EV:
case 15: case ITEM_EFFECT_SPEED_EV:
case 16: case ITEM_EFFECT_DEF_EV:
gTasks[taskId].data[4] = 1; gTasks[taskId].data[4] = 1;
FieldUseFunc_Medicine(taskId); FieldUseFunc_Medicine(taskId);
break; break;
case 9: case ITEM_EFFECT_SACRED_ASH:
gTasks[taskId].data[4] = 1; gTasks[taskId].data[4] = 1;
FieldUseFunc_SacredAsh(taskId); FieldUseFunc_SacredAsh(taskId);
break; break;
case 0: case ITEM_EFFECT_RAISE_LEVEL:
gTasks[taskId].data[4] = 1; gTasks[taskId].data[4] = 1;
FieldUseFunc_RareCandy(taskId); FieldUseFunc_RareCandy(taskId);
break; break;
case 18: case ITEM_EFFECT_PP_UP:
case 19: case ITEM_EFFECT_PP_MAX:
gTasks[taskId].data[4] = 1; gTasks[taskId].data[4] = 1;
FieldUseFunc_PpUp(taskId); FieldUseFunc_PpUp(taskId);
break; break;
case 20: case ITEM_EFFECT_HEAL_PP:
gTasks[taskId].data[4] = 1; gTasks[taskId].data[4] = 1;
FieldUseFunc_Ether(taskId); FieldUseFunc_Ether(taskId);
break; break;
@@ -879,21 +875,21 @@ void ItemUseInBattle_EnigmaBerry(u8 taskId)
{ {
switch (GetItemEffectType(gSpecialVar_ItemId)) switch (GetItemEffectType(gSpecialVar_ItemId))
{ {
case 0: case ITEM_EFFECT_X_ITEM:
BattleUseFunc_GuardSpec(taskId); BattleUseFunc_StatBooster(taskId);
break; break;
case 2: case ITEM_EFFECT_HEAL_HP:
case 3: case ITEM_EFFECT_CURE_POISON:
case 4: case ITEM_EFFECT_CURE_SLEEP:
case 5: case ITEM_EFFECT_CURE_BURN:
case 6: case ITEM_EFFECT_CURE_FREEZE:
case 7: case ITEM_EFFECT_CURE_PARALYSIS:
case 8: case ITEM_EFFECT_CURE_CONFUSION:
case 9: case ITEM_EFFECT_CURE_INFATUATION:
case 11: case ITEM_EFFECT_CURE_ALL_STATUS:
BattleUseFunc_Medicine(taskId); BattleUseFunc_Medicine(taskId);
break; break;
case 21: case ITEM_EFFECT_HEAL_PP:
BattleUseFunc_Ether(taskId); BattleUseFunc_Ether(taskId);
break; break;
default: default:
@@ -912,7 +908,7 @@ void FieldUseFunc_OakStopsYou(u8 taskId)
PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]); PrintNotTheTimeToUseThat(taskId, gTasks[taskId].data[3]);
} }
void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon * pokemon, u16 itemId, u16 param) void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon *pokemon, u16 itemId, u16 param)
{ {
struct UnkStruct_ItemUseQuestLog struct UnkStruct_ItemUseQuestLog
{ {
@@ -920,7 +916,7 @@ void ItemUse_SetQuestLogEvent(u8 eventId, struct Pokemon * pokemon, u16 itemId,
u16 unk2; u16 unk2;
u16 species; u16 species;
u16 param; u16 param;
} * questLog = Alloc(sizeof(*questLog)); } *questLog = Alloc(sizeof(*questLog));
questLog->itemId = itemId; questLog->itemId = itemId;
questLog->param = param; questLog->param = param;
-7
View File
@@ -110,13 +110,6 @@ static u8 ChooseWildMonIndex_WaterRock(void)
return 4; return 4;
} }
enum
{
OLD_ROD,
GOOD_ROD,
SUPER_ROD
};
static u8 ChooseWildMonIndex_Fishing(u8 rod) static u8 ChooseWildMonIndex_Fishing(u8 rod)
{ {
u8 wildMonIndex = 0; u8 wildMonIndex = 0;