From 83d7f52f2cadd4232ee674947a93e93fc18e483a Mon Sep 17 00:00:00 2001 From: ProjectRevoTPP Date: Sun, 9 Apr 2017 01:05:20 +0000 Subject: finish decompiling item_use.c (#244) * nonmatching sub_80C9720 and decompile sub_80C9838 * finish decompiling Itemfinder functions. * decompile ItemUseOutOfBattle_PokeblockCase and ItemUseOutOfBattle_CoinCase * rename field_doortransition * rename weather file * decompile more of item_use.c * decompile up to repel code * decompile up to stat increase code * finish decompiling item_use.c * remove item_use from ld_script --- src/battle_setup.c | 2 +- src/berry.c | 6 +- src/field_doortransition.c | 97 ----- src/field_effect.c | 2 +- src/field_fadetransition.c | 97 +++++ src/field_screeneffect.c | 368 ++++++++++++++++++ src/item_use.c | 948 ++++++++++++++++++++++++++++++++++++++++++--- src/player_pc.c | 2 +- src/rom4.c | 2 +- src/scrcmd.c | 2 +- src/shop.c | 2 +- src/start_menu.c | 2 +- src/weather.c | 368 ------------------ 13 files changed, 1373 insertions(+), 525 deletions(-) delete mode 100644 src/field_doortransition.c create mode 100644 src/field_fadetransition.c create mode 100644 src/field_screeneffect.c delete mode 100644 src/weather.c (limited to 'src') diff --git a/src/battle_setup.c b/src/battle_setup.c index c9839bb87..a8f94baed 100644 --- a/src/battle_setup.c +++ b/src/battle_setup.c @@ -20,7 +20,7 @@ #include "task.h" #include "text.h" #include "trainer.h" -#include "weather.h" +#include "field_screeneffect.h" #include "map_constants.h" #include "opponent_constants.h" #include "script_pokemon_80C4.h" diff --git a/src/berry.c b/src/berry.c index e81c7a5ff..99c9f6342 100644 --- a/src/berry.c +++ b/src/berry.c @@ -897,7 +897,7 @@ bool32 FieldObjectInteractionWaterBerryTree(void) return TRUE; } -bool32 IsPlayerFacingPlantedBerryTree(void) +bool8 IsPlayerFacingPlantedBerryTree(void) { if (GetFieldObjectScriptPointerForComparison() == &BerryTreeScript && GetStageByBerryTreeId(FieldObjectGetBerryTreeId(gSelectedMapObject)) == 0) @@ -906,10 +906,10 @@ bool32 IsPlayerFacingPlantedBerryTree(void) return FALSE; } -u8 TryToWaterBerryTree(void) +bool8 TryToWaterBerryTree(void) { if (GetFieldObjectScriptPointerForComparison() != &BerryTreeScript) - return 0; + return FALSE; else return FieldObjectInteractionWaterBerryTree(); } diff --git a/src/field_doortransition.c b/src/field_doortransition.c deleted file mode 100644 index 261ed46c9..000000000 --- a/src/field_doortransition.c +++ /dev/null @@ -1,97 +0,0 @@ -#include "global.h" -#include "gba/syscall.h" -#include "global.fieldmap.h" -#include "script.h" -#include "task.h" -#include "weather.h" - -void palette_bg_fill_white(void); -void palette_bg_fill_black(void); -void pal_fill_black(void); -void task0A_asap_script_env_2_enable_and_set_ctx_running(u8); - -extern u8 get_map_light_from_warp0(void); -extern u8 sav1_map_get_light_level(void); -extern u8 fade_type_for_given_maplight_pair(u8, u8); -extern u16 gPlttBufferFaded[]; -extern struct MapHeader * warp1_get_mapheader(void); -extern void sub_8059B88(u8); -extern void sub_8053E90(void); - -extern u8 sub_810CDB8(u8, u8); -extern int sub_8080E70(void); - -void palette_bg_fill_white(void) -{ - u32 source_color = 0x7fff7fff; - CpuFastSet(&source_color, gPlttBufferFaded, 0x100 | (1 << 24)); -} - -void palette_bg_fill_black(void) -{ - u32 source_color = 0; - CpuFastSet(&source_color, gPlttBufferFaded, 0x100 | (1 << 24)); -} - -void pal_fill_for_map_transition(void) -{ - u8 map_light = get_map_light_from_warp0(); - switch (fade_type_for_given_maplight_pair(map_light, sav1_map_get_light_level())) - { - case 0: - fade_screen(0, 0); - palette_bg_fill_black(); - break; - case 1: - fade_screen(2, 0); - palette_bg_fill_white(); - } -} - -void pal_fill_black(void) -{ - fade_screen(0, 0); - palette_bg_fill_black(); -} - -void fade_8080918(void) -{ - u8 light_level = sav1_map_get_light_level(); - switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) - { - case 0: - fade_screen(1, 0); - break; - case 1: - fade_screen(3, 0); - } -} - -void sub_8080958(u8 arg) -{ - sub_8059B88(!arg); -} - -void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID) -{ - if (sub_8080E70() == 1) - { - DestroyTask(taskID); - EnableBothScriptContexts(); - } -} - -void sub_8080990(void) -{ - ScriptContext2_Enable(); - sub_8053E90(); - pal_fill_black(); - CreateTask(&task0A_asap_script_env_2_enable_and_set_ctx_running, 0x0a); -} - -void sub_80809B0(void) -{ - ScriptContext2_Enable(); - pal_fill_black(); - CreateTask(&task0A_asap_script_env_2_enable_and_set_ctx_running, 0x0a); -} diff --git a/src/field_effect.c b/src/field_effect.c index b0c028c8d..4727aba54 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2,7 +2,7 @@ #include "field_effect.h" #include "sprite.h" #include "text.h" -#include "weather.h" +#include "field_screeneffect.h" typedef bool8 (*FldEffCmd)(u8 **, u32 *); diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c new file mode 100644 index 000000000..3f86299df --- /dev/null +++ b/src/field_fadetransition.c @@ -0,0 +1,97 @@ +#include "global.h" +#include "gba/syscall.h" +#include "global.fieldmap.h" +#include "script.h" +#include "task.h" +#include "field_screeneffect.h" + +void palette_bg_fill_white(void); +void palette_bg_fill_black(void); +void pal_fill_black(void); +void task0A_asap_script_env_2_enable_and_set_ctx_running(u8); + +extern u8 get_map_light_from_warp0(void); +extern u8 sav1_map_get_light_level(void); +extern u8 fade_type_for_given_maplight_pair(u8, u8); +extern u16 gPlttBufferFaded[]; +extern struct MapHeader * warp1_get_mapheader(void); +extern void sub_8059B88(u8); +extern void sub_8053E90(void); + +extern u8 sub_810CDB8(u8, u8); +extern int sub_8080E70(void); + +void palette_bg_fill_white(void) +{ + u32 source_color = 0x7fff7fff; + CpuFastSet(&source_color, gPlttBufferFaded, 0x100 | (1 << 24)); +} + +void palette_bg_fill_black(void) +{ + u32 source_color = 0; + CpuFastSet(&source_color, gPlttBufferFaded, 0x100 | (1 << 24)); +} + +void pal_fill_for_map_transition(void) +{ + u8 map_light = get_map_light_from_warp0(); + switch (fade_type_for_given_maplight_pair(map_light, sav1_map_get_light_level())) + { + case 0: + fade_screen(0, 0); + palette_bg_fill_black(); + break; + case 1: + fade_screen(2, 0); + palette_bg_fill_white(); + } +} + +void pal_fill_black(void) +{ + fade_screen(0, 0); + palette_bg_fill_black(); +} + +void fade_8080918(void) +{ + u8 light_level = sav1_map_get_light_level(); + switch (sub_810CDB8(light_level, warp1_get_mapheader()->mapType)) + { + case 0: + fade_screen(1, 0); + break; + case 1: + fade_screen(3, 0); + } +} + +void sub_8080958(u8 arg) +{ + sub_8059B88(!arg); +} + +void task0A_asap_script_env_2_enable_and_set_ctx_running(u8 taskID) +{ + if (sub_8080E70() == 1) + { + DestroyTask(taskID); + EnableBothScriptContexts(); + } +} + +void sub_8080990(void) +{ + ScriptContext2_Enable(); + sub_8053E90(); + pal_fill_black(); + CreateTask(&task0A_asap_script_env_2_enable_and_set_ctx_running, 0x0a); +} + +void sub_80809B0(void) +{ + ScriptContext2_Enable(); + pal_fill_black(); + CreateTask(&task0A_asap_script_env_2_enable_and_set_ctx_running, 0x0a); +} diff --git a/src/field_screeneffect.c b/src/field_screeneffect.c new file mode 100644 index 000000000..6cae0c18a --- /dev/null +++ b/src/field_screeneffect.c @@ -0,0 +1,368 @@ +#include "global.h" +#include "field_screeneffect.h" +#include "asm.h" +#include "palette.h" +#include "sprite.h" +#include "task.h" + +struct Weather +{ + u8 filler_000[0x200]; + u8 unknown_200[2][32]; + u8 filler_240[0x480]; + s8 unknown_6C0; + s8 unknown_6C1; + u8 unknown_6C2; + u8 unknown_6C3; + u16 unknown_6C4; + u8 unknown_6C6; + u8 unknown_6C7; + u8 unknown_6C8; + u8 unknown_6C9; + u8 unknown_6CA; + u8 unknown_6CB; + u8 filler_6CC[2]; + u16 unknown_6CE; + u8 unknown_6D0; + u8 unknown_6D1; + u8 filler_6D2[1]; + u8 unknown_6D3; + u8 unknown_6D4; + u8 unknown_6D5; + u8 filler_6D6[2]; + u8 unknown_6D8; + u8 filler_6D9[1]; + u8 unknown_6DA; + u8 filler_6DB[3]; + u8 unknown_6DE; + u8 filler_6DF[5]; + u8 unknown_6E4; + u8 filler_6E5[0x15]; + u8 unknown_6FA; + u8 unknown_6FB; + u8 filler_6FC[4]; + u8 unknown_700; + u8 filler_701[0x15]; + u8 unknown_716; + u8 unknown_717; + u8 filler_718[0xc]; + u8 unknown_724; + u8 filler_725[9]; + u8 unknown_72E; +}; + +#define gWeather gUnknown_0202F7E8 +extern struct Weather gWeather; +extern u8 *gUnknown_083970E8; +extern u8 (*gUnknown_08396FC8[][4])(void); +extern u8 (*gUnknown_083970B8[])(void); +extern u8 *gUnknown_030006DC; +extern u8 gUnknown_083970C8; +extern u8 (*gUnknown_0202FC48)[32]; +extern u8 gUnknown_0202F9E8[32]; + + +void sub_807C828(void) +{ + u8 index; + if (!FuncIsActiveTask(&sub_807CA34)) + { + index = AllocSpritePalette(0x1200); + CpuCopy32(&gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); + sub_807CB10(); + gWeather.unknown_6D5 = index; + gWeather.unknown_6D4 = AllocSpritePalette(0x1201); + gWeather.unknown_6DA = 0; + gWeather.unknown_6D8 = 0; + gWeather.unknown_6DE = 0; + gWeather.unknown_6E4 = 0; + gWeather.unknown_700 = 0; + gWeather.unknown_6FB = 0; + gWeather.unknown_724 = 0; + gWeather.unknown_716 = 0; + gWeather.unknown_717 = 0; + gWeather.unknown_72E = 0; + gWeather.unknown_6FA = 0; + sub_807DB64(16, 0); + gWeather.unknown_6D0 = 0; + gWeather.unknown_6C6 = 3; + gWeather.unknown_6C8 = 0; + gWeather.unknown_6D3 = 1; + gWeather.unknown_6C9 = CreateTask(&sub_807C9E4, 80); + } +} + +void DoWeatherEffect(u8 effect) +{ + if (effect != 3 && effect != 5 && effect != 13) + { + PlayRainSoundEffect(); + } + if (gWeather.unknown_6D1 != effect && gWeather.unknown_6D0 == effect) + { + gUnknown_08396FC8[effect][0](); + } + gWeather.unknown_6D3 = 0; + gWeather.unknown_6D1 = effect; + gWeather.unknown_6CE = 0; +} + +void sub_807C988(u8 effect) +{ + PlayRainSoundEffect(); + gWeather.unknown_6D0 = effect; + gWeather.unknown_6D1 = effect; +} + +void sub_807C9B4(u8 effect) +{ + PlayRainSoundEffect(); + gWeather.unknown_6D0 = effect; + gWeather.unknown_6D1 = effect; + gWeather.unknown_6C8 = 1; +} + +void sub_807C9E4(u8 task) +{ + if (gWeather.unknown_6C8) + { + gUnknown_08396FC8[gWeather.unknown_6D0][2](); + gTasks[task].func = &sub_807CA34; + } +} + +void sub_807CA34(u8 task) +{ + u8 v1; + if (gWeather.unknown_6D0 != gWeather.unknown_6D1) + { + v1 = gUnknown_08396FC8[gWeather.unknown_6D0][3](); + if (!v1) + { + gUnknown_08396FC8[gWeather.unknown_6D1][0](); + gWeather.unknown_6C3 = 0; // compiler reuses v1 + gWeather.unknown_6C6 = 0; // compiler reuses v1 + gWeather.unknown_6D0 = gWeather.unknown_6D1; + gWeather.unknown_6D3 = 1; + } + } + else + { + gUnknown_08396FC8[gWeather.unknown_6D0][1](); + } + gUnknown_083970B8[gWeather.unknown_6C6](); +} + +void sub_807CAE8(void) +{ + gWeather.unknown_6C1 = 0; + gWeather.unknown_6C2 = 0; +} + +void nullsub_38(void) +{ +} + +u32 sub_807CB0C(void) +{ + return 0; +} + +void sub_807CB10(void) +{ + u16 v0; + u8(*v1)[32]; + u16 v2; + u16 v4; + u16 v5; + u16 v6; + u16 v9; + u32 v10; + u16 v11; + s16 dunno; + + gUnknown_030006DC = &gUnknown_083970C8; + for (v0 = 0; v0 <= 1; v0++) + { + if (v0 == 0) + { + v1 = &gUnknown_0202F9E8; + } + else + { + v1 = &gUnknown_0202F9E8 + 19; + } + for (v2 = 0; (u16)v2 <= 0x1f; v2++) + { + v4 = v2 << 8; + if (v0 == 0) + { + v5 = (v2 << 8) / 16; + } + else + { + v5 = 0; + } + v6 = 0; + for (; v6 <= 2; v6++) + { + v4 = (v4 - v5); + v1[v6][v2] = v4 >> 8; + } + v9 = v4; + v10 = 0x1f00 - v4; + if ((0x1f00 - v4) < 0) + { + v10 += 0xf; + } + v11 = v10 >> 4; + if (v2 <= 0xb) + { + for (; v6 <= 0x12; v6++) + { + v4 += v11; + dunno = v4 - v9; + if (dunno > 0) + { + v4 -= (dunno + ((u16)dunno >> 15)) >> 1; + } + v1[v6][v2] = v4 >> 8; + if (v1[v6][v2] > 0x1f) + { + v1[v6][v2] = 0x1f; + } + } + } + else + { + for (; v6 <= 0x12; v6++) + { + v4 += v11; + v1[v6][v2] = v4 >> 8; + if (v1[v6][v2] > 0x1f) + { + v1[v6][v2] = 0x1f; + } + } + } + } + } +} + +void sub_807CC24(void) +{ + if (gWeather.unknown_6C0 == gWeather.unknown_6C1) + { + gWeather.unknown_6C6 = 3; + } + else + { + if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2) + { + gWeather.unknown_6C3 = 0; + if (gWeather.unknown_6C0 < gWeather.unknown_6C1) + { + gWeather.unknown_6C0++; + } + else + { + gWeather.unknown_6C0--; + } + sub_807CEBC(0, 0x20, gWeather.unknown_6C0); + } + } +} + +void sub_807CCAC(void) +{ + if (++gWeather.unknown_6CB > 1) + { + gWeather.unknown_6CA = 0; + } + switch (gWeather.unknown_6D0) + { + case 3: + case 4: + case 5: + case 11: + case 13: + if (sub_807CDC4() == 0) + { + gWeather.unknown_6C0 = 3; + gWeather.unknown_6C6 = 3; + } + break; + case 12: + if (sub_807CE24() == 0) + { + gWeather.unknown_6C0 = -6; + gWeather.unknown_6C6 = 3; + } + break; + case 6: + if (sub_807CE7C() == 0) + { + gWeather.unknown_6C0 = 0; + gWeather.unknown_6C6 = 3; + } + break; + case 7: + case 8: + case 9: + case 10: + default: + if (!gPaletteFade.active) + { + gWeather.unknown_6C0 = gWeather.unknown_6C1; + gWeather.unknown_6C6 = 3; + } + break; + } +} + +u8 sub_807CDC4(void) +{ + if (gWeather.unknown_6C7 == 0x10) + { + return 0; + } + if (++gWeather.unknown_6C7 >= 0x10) + { + sub_807CEBC(0, 0x20, 3); + gWeather.unknown_6C7 = 0x10; + return 0; + } + sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); + return 1; +} + +u8 sub_807CE24(void) +{ + if (gWeather.unknown_6C7 == 0x10) + { + return 0; + } + if (++gWeather.unknown_6C7 >= 0x10) + { + sub_807CEBC(0, 0x20, -6); + gWeather.unknown_6C7 = 0x10; + return 0; + } + sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); + return 1; +} + +u8 sub_807CE7C(void) +{ + if (gWeather.unknown_6C7 == 0x10) + { + return 0; + } + ++gWeather.unknown_6C7; + sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); + return 1; +} + +void nullsub_39(void) +{ +} diff --git a/src/item_use.c b/src/item_use.c index b68b72b26..309fa5b98 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -2,8 +2,9 @@ #include "asm.h" #include "event_data.h" #include "field_player_avatar.h" -#include "field_player_avatar.h" +#include "field_map_obj_helpers.h" #include "item.h" +#include "items.h" #include "mail.h" #include "map_obj_lock.h" #include "menu.h" @@ -15,44 +16,103 @@ #include "sound.h" #include "string_util.h" #include "task.h" -#include "weather.h" +#include "field_screeneffect.h" #include "fieldmap.h" +#include "coins.h" +#include "berry.h" +#include "vars.h" +#include "battle.h" extern void (* const gExitToOverworldFuncList[])(); extern void (* gUnknown_03005D00)(u8); extern void (* gUnknown_0300485C)(void); +extern void (* gUnknown_03004AE4)(u8); +extern void (* const gUnknown_083D61F4[])(); + +extern u8 *gUnknown_083D61DC[]; + +extern u8 gMoveNames[][13]; + +extern u8 gUnknown_02038561; +extern u8 gLastFieldPokeMenuOpened; +extern u8 gUnknown_02024E6C; + +extern u8 gItemFinderDirections[]; +extern u8 gUnknown_081A1654[]; +extern u8 gUnknown_081A168F[]; + +extern u16 gUnknown_02024A6A[]; extern void HandleItemMenuPaletteFade(u8); extern void ExecuteItemUseFromBlackPalette(void); extern void DisplayItemMessageOnField(u8, u8*, TaskFunc, u16); extern void CleanUpItemMenuMessage(u8); extern void CleanUpOverworldMessage(u8); -extern void ItemUseOutOfBattle_TMHM(u8); -extern void ItemUseOutOfBattle_EvolutionStone(u8); extern void ItemUseOnFieldCB_Bike(u8); extern void ItemUseOnFieldCB_Rod(u8); extern void ItemUseOnFieldCB_Itemfinder(u8); extern void sub_80A5D04(void); extern bool8 IsBikingDisallowedByPlayer(void); extern void GetOnOffBike(u8); -extern u8 GetPlayerDirectionTowardsHiddenItem(s16, s16); -extern void SetPlayerDirectionTowardsItem(u8); -extern void DisplayItemRespondingMessageAndExitItemfinder(u8); -extern void RotatePlayerAndExitItemfinder(u8); -extern void sub_80C9838(u8, s16, s16); +extern struct MapConnection *sub_8056BA0(s16 x, s16 y); // fieldmap.c +extern void sub_810BA7C(u8); +extern void sub_8080E28(void); +extern void UseMedicine(u8); +extern void sub_8070048(u8); +extern void DoPPRecoveryItemEffect(u8); +extern void DoPPUpItemEffect(u8); +extern void DoRareCandyItemEffect(u8); +extern void DoEvolutionStoneItemEffect(u8); +extern u16 ItemIdToBattleMoveId(u16); +extern void sub_80A3FA0(u16 *, u32, u32, u32, u32, u32); +extern void sub_80F914C(u8, void const *); +extern void sub_80A3E0C(void); +extern void TeachMonTMMove(u8); +extern void sub_80878A8(void); +extern void sub_8053014(void); +extern void sub_80A7094(u8); +extern bool8 ExecuteTableBasedItemEffect_(struct Pokemon *mon, u16, u8, u16); +extern void sub_8094E4C(void); +extern u8 ExecuteTableBasedItemEffect__(u8 u8, u16 u16, int i); +extern u8 GetItemEffectType(); extern u8 gOtherText_DadsAdvice[]; extern u8 gOtherText_CantGetOffBike[]; extern u8 gOtherText_NoResponse[]; - -extern u8 gItemFinderDirections[]; +extern u8 gOtherText_ItemfinderResponding[]; +extern u8 gOtherText_ItemfinderItemUnderfoot[]; +extern u8 gOtherText_Coins3[]; +extern u8 gOtherText_BootedHM[]; +extern u8 gOtherText_BootedTM[]; +extern u8 gOtherText_ContainsMove[]; +extern u8 gOtherText_UsedItem[]; +extern u8 gOtherText_RepelLingers[]; +extern u8 gOtherText_UsedFlute[]; +extern u8 gOtherText_UsedRepel[]; +extern u8 gOtherText_BoxIsFull[]; +extern u8 gOtherText_WontHaveAnyEffect[]; +extern u8 gOtherText_SnapConfusion[]; extern u16 gScriptItemId; +extern u16 gBattleTypeFlags; bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId); void RunItemfinderResults(u8); void ExitItemfinder(u8); void sub_80C9720(u8); +void sub_80C9838(u8, s16, s16); +u8 GetPlayerDirectionTowardsHiddenItem(s16, s16); +void SetPlayerDirectionTowardsItem(u8); +void DisplayItemRespondingMessageAndExitItemfinder(u8); +void RotatePlayerAndExitItemfinder(u8); +void sub_80C9D00(u8); +void sub_80C9D74(u8); +void sub_80C9EE4(u8); +void sub_80C9F10(u8); +void sub_80C9F80(u8); +void ItemUseOutOfBattle_TMHM(u8); +void ItemUseOutOfBattle_EvolutionStone(u8); +void ItemUseOutOfBattle_CannotUse(u8); void ExecuteSwitchToOverworldFromItemUse(u8 taskId) { @@ -295,7 +355,7 @@ void ExitItemfinder(u8 taskId) bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId) { - int distanceX, distanceY; + int distanceX, distanceY; u16 x, y; s16 newDistanceX, newDistanceY, i; @@ -347,42 +407,830 @@ bool8 HiddenItemAtPos(struct MapEvents *events, s16 x, s16 y) bool8 sub_80C9688(struct MapConnection *connection, int x, int y) { - struct MapHeader *mapHeader; - u16 localX, localY; - u32 localOffset; - s32 localLength; - - mapHeader = mapconnection_get_mapheader(connection); - - switch(connection->direction) - { - // same weird temp variable behavior seen in HiddenItemAtPos - case 2: - localOffset = connection->offset + 7; - localX = x - localOffset; - localLength = mapHeader->mapData->height - 7; - localY = localLength + y; // additions are reversed for some reason - break; - case 1: - localOffset = connection->offset + 7; - localX = x - localOffset; - localLength = gMapHeader.mapData->height + 7; - localY = y - localLength; - break; - case 3: - localLength = mapHeader->mapData->width - 7; - localX = localLength + x; // additions are reversed for some reason - localOffset = connection->offset + 7; - localY = y - localOffset; - break; - case 4: - localLength = gMapHeader.mapData->width + 7; - localX = x - localLength; - localOffset = connection->offset + 7; - localY = y - localOffset; - break; - default: - return FALSE; - } - return HiddenItemAtPos(mapHeader->events, localX, localY); + struct MapHeader *mapHeader; + u16 localX, localY; + u32 localOffset; + s32 localLength; + + mapHeader = mapconnection_get_mapheader(connection); + + switch(connection->direction) + { + // same weird temp variable behavior seen in HiddenItemAtPos + case 2: + localOffset = connection->offset + 7; + localX = x - localOffset; + localLength = mapHeader->mapData->height - 7; + localY = localLength + y; // additions are reversed for some reason + break; + case 1: + localOffset = connection->offset + 7; + localX = x - localOffset; + localLength = gMapHeader.mapData->height + 7; + localY = y - localLength; + break; + case 3: + localLength = mapHeader->mapData->width - 7; + localX = localLength + x; // additions are reversed for some reason + localOffset = connection->offset + 7; + localY = y - localOffset; + break; + case 4: + localLength = gMapHeader.mapData->width + 7; + localX = x - localLength; + localOffset = connection->offset + 7; + localY = y - localOffset; + break; + default: + return FALSE; + } + return HiddenItemAtPos(mapHeader->events, localX, localY); +} + +// weird math +#ifdef NONMATCHING +void sub_80C9720(u8 taskId) +{ + s16 x, y; + s16 curX, curY; + s16 width = gMapHeader.mapData->width + 7; + s16 height = gMapHeader.mapData->height + 7; + + PlayerGetDestCoords(&x, &y); + + for (curX = x - 7; curX <= x + 7; curX++) + { + for (curY = y - 5; curY <= y + 5; curY++) + { + if (7 > curX + || curX >= width + || 7 > curY + || curY >= height) + { + struct MapConnection *conn = sub_8056BA0(curX, curY); + if (conn && sub_80C9688(conn, curX, curY) == TRUE) + sub_80C9838(taskId, curX - x, curY - y); + } + } + } +} +#else +__attribute__((naked)) +void sub_80C9720(u8 taskId) +{ + asm(".syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x14\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + str r0, [sp, 0x4]\n\ + ldr r0, _080C9834 @ =gMapHeader\n\ + ldr r1, [r0]\n\ + ldr r0, [r1]\n\ + adds r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0x8]\n\ + ldr r0, [r1, 0x4]\n\ + adds r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + str r0, [sp, 0xC]\n\ + mov r4, sp\n\ + adds r4, 0x2\n\ + mov r0, sp\n\ + adds r1, r4, 0\n\ + bl PlayerGetDestCoords\n\ + mov r0, sp\n\ + ldrh r0, [r0]\n\ + subs r0, 0x7\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + asrs r0, 16\n\ + mov r1, sp\n\ + movs r2, 0\n\ + ldrsh r1, [r1, r2]\n\ + adds r1, 0x7\n\ + cmp r0, r1\n\ + bgt _080C9824\n\ +_080C976E:\n\ + mov r5, sp\n\ + ldrh r0, [r5, 0x2]\n\ + subs r0, 0x5\n\ + lsls r0, 16\n\ + lsrs r4, r0, 16\n\ + lsls r2, r4, 16\n\ + asrs r1, r2, 16\n\ + movs r6, 0x2\n\ + ldrsh r0, [r5, r6]\n\ + adds r0, 0x5\n\ + lsls r3, 16\n\ + mov r8, r3\n\ + cmp r1, r0\n\ + bgt _080C980E\n\ + movs r0, 0x7\n\ + str r0, [sp, 0x10]\n\ + mov r1, r8\n\ + asrs r1, 16\n\ + mov r9, r1\n\ + mov r10, r0\n\ +_080C9796:\n\ + ldr r3, [sp, 0x10]\n\ + cmp r3, r9\n\ + bgt _080C97B8\n\ + ldr r5, [sp, 0x8]\n\ + lsls r0, r5, 16\n\ + asrs r0, 16\n\ + cmp r9, r0\n\ + bge _080C97B8\n\ + asrs r1, r2, 16\n\ + cmp r10, r1\n\ + bgt _080C97B8\n\ + ldr r6, [sp, 0xC]\n\ + lsls r0, r6, 16\n\ + asrs r0, 16\n\ + lsls r7, r4, 16\n\ + cmp r1, r0\n\ + blt _080C97F6\n\ +_080C97B8:\n\ + mov r0, r8\n\ + asrs r5, r0, 16\n\ + lsls r4, 16\n\ + asrs r6, r4, 16\n\ + adds r0, r5, 0\n\ + adds r1, r6, 0\n\ + bl sub_8056BA0\n\ + adds r7, r4, 0\n\ + cmp r0, 0\n\ + beq _080C97F6\n\ + adds r1, r5, 0\n\ + adds r2, r6, 0\n\ + bl sub_80C9688\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0x1\n\ + bne _080C97F6\n\ + mov r0, sp\n\ + ldrh r1, [r0]\n\ + subs r1, r5, r1\n\ + lsls r1, 16\n\ + asrs r1, 16\n\ + ldrh r2, [r0, 0x2]\n\ + subs r2, r6, r2\n\ + lsls r2, 16\n\ + asrs r2, 16\n\ + ldr r0, [sp, 0x4]\n\ + bl sub_80C9838\n\ +_080C97F6:\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + adds r0, r7, r1\n\ + lsrs r4, r0, 16\n\ + lsls r2, r4, 16\n\ + asrs r1, r2, 16\n\ + mov r3, sp\n\ + movs r5, 0x2\n\ + ldrsh r0, [r3, r5]\n\ + adds r0, 0x5\n\ + cmp r1, r0\n\ + ble _080C9796\n\ +_080C980E:\n\ + movs r1, 0x80\n\ + lsls r1, 9\n\ + add r1, r8\n\ + lsrs r3, r1, 16\n\ + asrs r1, 16\n\ + mov r0, sp\n\ + movs r6, 0\n\ + ldrsh r0, [r0, r6]\n\ + adds r0, 0x7\n\ + cmp r1, r0\n\ + ble _080C976E\n\ +_080C9824:\n\ + add sp, 0x14\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080C9834: .4byte gMapHeader\n\ + .syntax divided"); +} +#endif + +void sub_80C9838(u8 taskId, s16 x, s16 y) +{ + s16 *data = gTasks[taskId].data; + s16 var1, var2, var3, var4; + + if(data[2] == FALSE) + { + data[0] = x; + data[1] = y; + data[2] = TRUE; + } + else + { + // data[0] and data[1] contain the player's coordinates. + // x and y contain the item's coordinates. + if(data[0] < 0) + var1 = data[0] * -1; // item is to the left + else + var1 = data[0]; // item is to the right + + if(data[1] < 0) + var2 = data[1] * -1; // item is to the north + else + var2 = data[1]; // item is to the south + + if(x < 0) + var3 = x * -1; + else + var3 = x; + + if(y < 0) + var4 = y * -1; + else + var4 = y; + + if(var1 + var2 > var3 + var4) + { + data[0] = x; + data[1] = y; + } + else + { + if(var1 + var2 == var3 + var4 && (var2 > var4 || (var2 == var4 && data[1] < y))) + { + data[0] = x; + data[1] = y; + } + } + } +} + +u8 GetPlayerDirectionTowardsHiddenItem(s16 itemX, s16 itemY) +{ + s16 abX, abY; + + if(itemX == 0 && itemY == 0) + return DIR_NONE; // player is standing on the item. + + // get absolute X distance. + if(itemX < 0) + abX = itemX * -1; + else + abX = itemX; + + // get absolute Y distance. + if(itemY < 0) + abY = itemY * -1; + else + abY = itemY; + + if(abX > abY) + { + if(itemX < 0) + return DIR_EAST; + else + return DIR_NORTH; + } + else + { + if(abX < abY) + { + if(itemY < 0) + return DIR_SOUTH; + else + return DIR_WEST; + } + if(abX == abY) + { + if(itemY < 0) + return DIR_SOUTH; + else + return DIR_WEST; + } + return DIR_NONE; // should never get here. return something so it doesnt crash. + } +} + +void SetPlayerDirectionTowardsItem(u8 direction) +{ + FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + UnfreezeMapObject(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]); + PlayerTurnInPlace(direction); +} + +void DisplayItemRespondingMessageAndExitItemfinder(u8 taskId) +{ + if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE) + DisplayItemMessageOnField(taskId, gOtherText_ItemfinderResponding, ExitItemfinder, 0); +} + +void RotatePlayerAndExitItemfinder(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + + if(FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE + || data[2] == FALSE) + { + SetPlayerDirectionTowardsItem(gItemFinderDirections[data[5]]); + data[2] = 1; + data[5] = (data[5] + 1) & 3; + data[3]++; + + if(data[3] == 4) + DisplayItemMessageOnField(taskId, gOtherText_ItemfinderItemUnderfoot, ExitItemfinder, 0); + } +} + +void ItemUseOutOfBattle_PokeblockCase(u8 taskId) +{ + if(sub_80F9344() == TRUE) + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } + else if(gTasks[taskId].data[2] != TRUE) + { + sub_810BA7C(0); + ItemMenu_ConfirmNormalFade(taskId); + } + else + { + gUnknown_0300485C = (void *)sub_8080E28; + sub_810BA7C(1); + ItemMenu_ConfirmComplexFade(taskId); + } +} + +void ItemUseOutOfBattle_CoinCase(u8 taskId) +{ + ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4); + StringExpandPlaceholders(gStringVar4, gOtherText_Coins3); + + if(!gTasks[taskId].data[2]) + { + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); + } + else + { + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpOverworldMessage, 0); + } +} + +void sub_80C9BB8(u8 var) +{ + if(gMain.newKeys & A_BUTTON) + CleanUpItemMenuMessage(var); +} + +void sub_80C9BD8(u8 var) +{ + if(gMain.newKeys & A_BUTTON) + CleanUpOverworldMessage(var); +} + +// unused +void ItemUseOutOfBattle_SSTicket(u8 taskId) +{ + if(gTasks[taskId].data[2] == 0) + { + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BB8, 1); + } + else + { + DisplayItemMessageOnField(taskId, gUnknown_083D61DC[ItemId_GetSecondaryId(gScriptItemId)], sub_80C9BD8, 0); + } +} + +void sub_80C9C7C(u8 taskId) +{ + if(IsPlayerFacingPlantedBerryTree() == TRUE) + { + gUnknown_03005D00 = sub_80C9D00; + gUnknown_0300485C = ExecuteItemUseFromBlackPalette; + gTasks[taskId].data[8] = (u32)c2_exit_to_overworld_2_switch >> 16; + gTasks[taskId].data[9] = (u32)c2_exit_to_overworld_2_switch; + gTasks[taskId].func = HandleItemMenuPaletteFade; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 0x10, 0); + } + else + { + ItemId_GetFieldFunc(gScriptItemId)(taskId); + } +} + +void sub_80C9D00(u8 taskId) +{ + RemoveBagItem(gScriptItemId, 1); + ScriptContext2_Enable(); + ScriptContext1_SetupScript(gUnknown_081A1654); + DestroyTask(taskId); +} + +void ItemUseOutOfBattle_WailmerPail(u8 taskId) +{ + if(TryToWaterBerryTree() == TRUE) + { + gUnknown_03005D00 = sub_80C9D74; + SetUpItemUseOnFieldCallback(taskId); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void sub_80C9D74(u8 taskId) +{ + ScriptContext2_Enable(); + ScriptContext1_SetupScript(gUnknown_081A168F); + DestroyTask(taskId); +} + +void sub_80C9D98(u8 taskId) +{ + gUnknown_02038561 = 0; + ItemMenu_ConfirmNormalFade(taskId); +} + +void ItemUseOutOfBattle_Medicine(u8 taskId) +{ + gUnknown_03004AE4 = UseMedicine; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_SacredAsh(u8 taskId) +{ + u8 i; + + gLastFieldPokeMenuOpened = 0; + + for(i = 0; i < 6; i++) + { + if(GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) != 0 && GetMonData(&gPlayerParty[i], MON_DATA_HP) == 0) + { + gLastFieldPokeMenuOpened = i; + break; + } + } + gUnknown_03004AE4 = sub_8070048; + gUnknown_02038561 = 4; + ItemMenu_ConfirmNormalFade(taskId); +} + +void ItemUseOutOfBattle_PPRecovery(u8 taskId) +{ + gUnknown_03004AE4 = DoPPRecoveryItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_PPUp(u8 taskId) +{ + gUnknown_03004AE4 = DoPPUpItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_RareCandy(u8 taskId) +{ + gUnknown_03004AE4 = DoRareCandyItemEffect; + sub_80C9D98(taskId); +} + +void ItemUseOutOfBattle_TMHM(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + + if(gScriptItemId >= ITEM_HM01) + DisplayItemMessageOnField(taskId, gOtherText_BootedHM, sub_80C9EE4, 1); // HM + else + DisplayItemMessageOnField(taskId, gOtherText_BootedTM, sub_80C9EE4, 1); // TM +} + +void sub_80C9EE4(u8 taskId) +{ + PlaySE(2); + gTasks[taskId].func = sub_80C9F10; +} + +void sub_80C9F10(u8 taskId) +{ + if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + { + StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gScriptItemId)]); + StringExpandPlaceholders(gStringVar4, gOtherText_ContainsMove); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80C9F80, 1); + } +} + +void sub_80C9F80(u8 var) +{ + DisplayYesNoMenu(7, 7, 1); + sub_80A3FA0(gBGTilemapBuffers[1], 8, 8, 5, 4, 1); + sub_80F914C(var, gUnknown_083D61F4); +} + +void sub_80C9FC0(u8 var) +{ + gUnknown_03004AE4 = TeachMonTMMove; + sub_80C9D98(var); +} + +void sub_80C9FDC(void) +{ + RemoveBagItem(gScriptItemId, 1); + sub_80A3E0C(); + CopyItemName(gScriptItemId, gStringVar2); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedItem); +} + +void ItemUseOutOfBattle_Repel(u8 var) +{ + if(VarGet(VAR_REPEL_STEP_COUNT) == FALSE) + { + VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gScriptItemId)); + sub_80C9FDC(); + DisplayItemMessageOnField(var, gStringVar4, CleanUpItemMenuMessage, 1); + } + else + { + DisplayItemMessageOnField(var, gOtherText_RepelLingers, CleanUpItemMenuMessage, 1); + } +} + +void sub_80CA07C(void) +{ + sub_80A3E0C(); + CopyItemName(gScriptItemId, gStringVar2); +} + +void sub_80CA098(u8 taskId) +{ + if(++gTasks[taskId].data[15] > 7) + { + PlaySE(0x75); + DisplayItemMessageOnField(taskId, gStringVar4, CleanUpItemMenuMessage, 1); + } +} + +void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId) +{ + if(gScriptItemId == 43) + { + FlagSet(SYS_ENC_UP_ITEM); + FlagReset(SYS_ENC_DOWN_ITEM); + sub_80CA07C(); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedFlute); + gTasks[taskId].func = sub_80CA098; + gTasks[taskId].data[15] = 0; + } + else if(gScriptItemId == 42) + { + FlagSet(SYS_ENC_DOWN_ITEM); + FlagReset(SYS_ENC_UP_ITEM); + sub_80CA07C(); + StringExpandPlaceholders(gStringVar4, gOtherText_UsedRepel); + gTasks[taskId].func = sub_80CA098; + gTasks[taskId].data[15] = 0; + } +} + +void task08_080A1C44(u8 taskId) +{ + player_avatar_init_params_reset(); + sub_80878A8(); + DestroyTask(taskId); +} + +void sub_80CA18C(u8 taskId) +{ + sub_8053014(); + sub_80C9FDC(); + gTasks[taskId].data[0] = 0; + DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44, 0); +} + +bool8 sub_80CA1C8(void) +{ + if(gMapHeader.mapType == MAP_TYPE_UNDERGROUND) + return TRUE; + else + return FALSE; +} + +void ItemUseOutOfBattle_EscapeRope(u8 taskId) +{ + if(sub_80CA1C8() == TRUE) // is map type an area you can use escape rope? + { + gUnknown_03005D00 = sub_80CA18C; + SetUpItemUseOnFieldCallback(taskId); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void ItemUseOutOfBattle_EvolutionStone(u8 var) +{ + gUnknown_03004AE4 = DoEvolutionStoneItemEffect; + sub_80C9D98(var); +} + +void ItemUseInBattle_PokeBall(u8 var) +{ + if(PlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon? + { + RemoveBagItem(gScriptItemId, 1); + sub_80A7094(var); + } + else + { + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + DisplayItemMessageOnField(var, gOtherText_BoxIsFull, CleanUpItemMenuMessage, 1); + } +} + +void sub_80CA294(u8 var) +{ + if(gMain.newKeys & A_BUTTON || gMain.newKeys & B_BUTTON) + sub_80A7094(var); +} + +void sub_80CA2BC(u8 taskId) +{ + if(++gTasks[taskId].data[15] > 7) + { + PlaySE(1); + RemoveBagItem(gScriptItemId, 1); + DisplayItemMessageOnField(taskId, sub_803F378(gScriptItemId), sub_80CA294, 1); + } +} + +void ItemUseInBattle_StatIncrease(u8 taskId) +{ + u16 partyId = gUnknown_02024A6A[gUnknown_02024E6C]; + + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + + if(ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gScriptItemId, partyId, 0) != FALSE) + { + DisplayItemMessageOnField(taskId, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); + } + else + { + gTasks[taskId].func = sub_80CA2BC; + gTasks[taskId].data[15] = 0; + } +} + +void sub_80CA394(u8 taskId) +{ + if(!gPaletteFade.active) + { + sub_8094E4C(); + gpu_pal_allocator_reset__manage_upper_four(); + DestroyTask(taskId); + } +} + +void sub_80CA3C0(u8 taskId) +{ + gTasks[taskId].func = sub_80CA394; + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, 0); +} + +void ItemUseInBattle_Medicine(u8 var) +{ + gUnknown_03004AE4 = UseMedicine; + sub_80CA3C0(var); +} + +void unref_sub_80CA410(u8 var) +{ + gUnknown_03004AE4 = sub_8070048; + sub_80CA3C0(var); +} + +void ItemUseInBattle_PPRecovery(u8 var) +{ + gUnknown_03004AE4 = DoPPRecoveryItemEffect; + sub_80CA3C0(var); +} + +void unref_sub_80CA448(u8 var) +{ + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + + if(ExecuteTableBasedItemEffect__(0, gScriptItemId, 0) == FALSE) + { + RemoveBagItem(gScriptItemId, 1); + GetMonNickname(&gPlayerParty[0], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_SnapConfusion); + DisplayItemMessageOnField(var, gStringVar4, sub_80A7094, 1); + } + else + { + DisplayItemMessageOnField(var, gOtherText_WontHaveAnyEffect, CleanUpItemMenuMessage, 1); + } +} + +void ItemUseInBattle_Escape(u8 taskId) +{ + MenuZeroFillWindowRect(0, 0xD, 0xD, 0x14); + + if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE) + { + sub_80C9FDC(); + DisplayItemMessageOnField(taskId, gStringVar4, sub_80A7094, 1); + } + else + { + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); + } +} + +void ItemUseOutOfBattle_EnigmaBerry(u8 taskId) +{ + switch(GetItemEffectType(gScriptItemId) - 1) + { + case 1: + case 2: + case 3: + case 4: + case 5: + case 6: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_Medicine(taskId); + break; + case 9: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_SacredAsh(taskId); + break; + case 0: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_RareCandy(taskId); + break; + case 18: + case 19: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_PPUp(taskId); + break; + case 20: + gTasks[taskId].data[15] = 1; + ItemUseOutOfBattle_PPRecovery(taskId); + break; + default: + gTasks[taskId].data[15] = 4; + ItemUseOutOfBattle_CannotUse(taskId); + } +} + +void ItemUseInBattle_EnigmaBerry(u8 taskId) +{ + switch(GetItemEffectType(gScriptItemId)) + { + case 0: + ItemUseInBattle_StatIncrease(taskId); + break; + case 2: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 11: + ItemUseInBattle_Medicine(taskId); + break; + case 21: + ItemUseInBattle_PPRecovery(taskId); + break; + default: + ItemUseOutOfBattle_CannotUse(taskId); + } +} + +void ItemUseOutOfBattle_CannotUse(u8 taskId) +{ + DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[2]); } diff --git a/src/player_pc.c b/src/player_pc.c index 6ea169713..cb70539bf 100644 --- a/src/player_pc.c +++ b/src/player_pc.c @@ -8,7 +8,7 @@ #include "sound.h" #include "string_util.h" #include "task.h" -#include "weather.h" +#include "field_screeneffect.h" extern void DisplayItemMessageOnField(u8, u8*, TaskFunc, u16); extern void ItemStorageMenuProcessInput(u8); diff --git a/src/rom4.c b/src/rom4.c index 9d7fec115..cc734cad9 100644 --- a/src/rom4.c +++ b/src/rom4.c @@ -28,7 +28,7 @@ #include "start_menu.h" #include "task.h" #include "tileset_anim.h" -#include "weather.h" +#include "field_screeneffect.h" #include "wild_encounter.h" #include "script_pokemon_80C4.h" #include "clock.h" diff --git a/src/scrcmd.c b/src/scrcmd.c index b780cc6b4..8d35def5c 100644 --- a/src/scrcmd.c +++ b/src/scrcmd.c @@ -24,7 +24,7 @@ #include "script.h" #include "sound.h" #include "string_util.h" -#include "weather.h" +#include "field_screeneffect.h" #include "script_menu.h" #include "script_pokemon_80F9.h" #include "script_pokemon_80C4.h" diff --git a/src/shop.c b/src/shop.c index 5148ddcca..3a0554e15 100644 --- a/src/shop.c +++ b/src/shop.c @@ -4,7 +4,7 @@ #include "task.h" #include "main.h" #include "sound.h" -#include "weather.h" +#include "field_screeneffect.h" #include "palette.h" #include "sprite.h" #include "asm.h" diff --git a/src/start_menu.c b/src/start_menu.c index d1344ce90..1fc9b6363 100644 --- a/src/start_menu.c +++ b/src/start_menu.c @@ -21,7 +21,7 @@ #include "string_util.h" #include "task.h" #include "trainer_card.h" -#include "weather.h" +#include "field_screeneffect.h" #include "field_map_obj_helpers.h" //Menu actions diff --git a/src/weather.c b/src/weather.c deleted file mode 100644 index 5d9553836..000000000 --- a/src/weather.c +++ /dev/null @@ -1,368 +0,0 @@ -#include "global.h" -#include "weather.h" -#include "asm.h" -#include "palette.h" -#include "sprite.h" -#include "task.h" - -struct Weather -{ - u8 filler_000[0x200]; - u8 unknown_200[2][32]; - u8 filler_240[0x480]; - s8 unknown_6C0; - s8 unknown_6C1; - u8 unknown_6C2; - u8 unknown_6C3; - u16 unknown_6C4; - u8 unknown_6C6; - u8 unknown_6C7; - u8 unknown_6C8; - u8 unknown_6C9; - u8 unknown_6CA; - u8 unknown_6CB; - u8 filler_6CC[2]; - u16 unknown_6CE; - u8 unknown_6D0; - u8 unknown_6D1; - u8 filler_6D2[1]; - u8 unknown_6D3; - u8 unknown_6D4; - u8 unknown_6D5; - u8 filler_6D6[2]; - u8 unknown_6D8; - u8 filler_6D9[1]; - u8 unknown_6DA; - u8 filler_6DB[3]; - u8 unknown_6DE; - u8 filler_6DF[5]; - u8 unknown_6E4; - u8 filler_6E5[0x15]; - u8 unknown_6FA; - u8 unknown_6FB; - u8 filler_6FC[4]; - u8 unknown_700; - u8 filler_701[0x15]; - u8 unknown_716; - u8 unknown_717; - u8 filler_718[0xc]; - u8 unknown_724; - u8 filler_725[9]; - u8 unknown_72E; -}; - -#define gWeather gUnknown_0202F7E8 -extern struct Weather gWeather; -extern u8 *gUnknown_083970E8; -extern u8 (*gUnknown_08396FC8[][4])(void); -extern u8 (*gUnknown_083970B8[])(void); -extern u8 *gUnknown_030006DC; -extern u8 gUnknown_083970C8; -extern u8 (*gUnknown_0202FC48)[32]; -extern u8 gUnknown_0202F9E8[32]; - - -void sub_807C828(void) -{ - u8 index; - if (!FuncIsActiveTask(&sub_807CA34)) - { - index = AllocSpritePalette(0x1200); - CpuCopy32(&gUnknown_083970E8, &gPlttBufferUnfaded[0x100 + index * 16], 32); - sub_807CB10(); - gWeather.unknown_6D5 = index; - gWeather.unknown_6D4 = AllocSpritePalette(0x1201); - gWeather.unknown_6DA = 0; - gWeather.unknown_6D8 = 0; - gWeather.unknown_6DE = 0; - gWeather.unknown_6E4 = 0; - gWeather.unknown_700 = 0; - gWeather.unknown_6FB = 0; - gWeather.unknown_724 = 0; - gWeather.unknown_716 = 0; - gWeather.unknown_717 = 0; - gWeather.unknown_72E = 0; - gWeather.unknown_6FA = 0; - sub_807DB64(16, 0); - gWeather.unknown_6D0 = 0; - gWeather.unknown_6C6 = 3; - gWeather.unknown_6C8 = 0; - gWeather.unknown_6D3 = 1; - gWeather.unknown_6C9 = CreateTask(&sub_807C9E4, 80); - } -} - -void DoWeatherEffect(u8 effect) -{ - if (effect != 3 && effect != 5 && effect != 13) - { - PlayRainSoundEffect(); - } - if (gWeather.unknown_6D1 != effect && gWeather.unknown_6D0 == effect) - { - gUnknown_08396FC8[effect][0](); - } - gWeather.unknown_6D3 = 0; - gWeather.unknown_6D1 = effect; - gWeather.unknown_6CE = 0; -} - -void sub_807C988(u8 effect) -{ - PlayRainSoundEffect(); - gWeather.unknown_6D0 = effect; - gWeather.unknown_6D1 = effect; -} - -void sub_807C9B4(u8 effect) -{ - PlayRainSoundEffect(); - gWeather.unknown_6D0 = effect; - gWeather.unknown_6D1 = effect; - gWeather.unknown_6C8 = 1; -} - -void sub_807C9E4(u8 task) -{ - if (gWeather.unknown_6C8) - { - gUnknown_08396FC8[gWeather.unknown_6D0][2](); - gTasks[task].func = &sub_807CA34; - } -} - -void sub_807CA34(u8 task) -{ - u8 v1; - if (gWeather.unknown_6D0 != gWeather.unknown_6D1) - { - v1 = gUnknown_08396FC8[gWeather.unknown_6D0][3](); - if (!v1) - { - gUnknown_08396FC8[gWeather.unknown_6D1][0](); - gWeather.unknown_6C3 = 0; // compiler reuses v1 - gWeather.unknown_6C6 = 0; // compiler reuses v1 - gWeather.unknown_6D0 = gWeather.unknown_6D1; - gWeather.unknown_6D3 = 1; - } - } - else - { - gUnknown_08396FC8[gWeather.unknown_6D0][1](); - } - gUnknown_083970B8[gWeather.unknown_6C6](); -} - -void sub_807CAE8(void) -{ - gWeather.unknown_6C1 = 0; - gWeather.unknown_6C2 = 0; -} - -void nullsub_38(void) -{ -} - -u32 sub_807CB0C(void) -{ - return 0; -} - -void sub_807CB10(void) -{ - u16 v0; - u8(*v1)[32]; - u16 v2; - u16 v4; - u16 v5; - u16 v6; - u16 v9; - u32 v10; - u16 v11; - s16 dunno; - - gUnknown_030006DC = &gUnknown_083970C8; - for (v0 = 0; v0 <= 1; v0++) - { - if (v0 == 0) - { - v1 = &gUnknown_0202F9E8; - } - else - { - v1 = &gUnknown_0202F9E8 + 19; - } - for (v2 = 0; (u16)v2 <= 0x1f; v2++) - { - v4 = v2 << 8; - if (v0 == 0) - { - v5 = (v2 << 8) / 16; - } - else - { - v5 = 0; - } - v6 = 0; - for (; v6 <= 2; v6++) - { - v4 = (v4 - v5); - v1[v6][v2] = v4 >> 8; - } - v9 = v4; - v10 = 0x1f00 - v4; - if ((0x1f00 - v4) < 0) - { - v10 += 0xf; - } - v11 = v10 >> 4; - if (v2 <= 0xb) - { - for (; v6 <= 0x12; v6++) - { - v4 += v11; - dunno = v4 - v9; - if (dunno > 0) - { - v4 -= (dunno + ((u16)dunno >> 15)) >> 1; - } - v1[v6][v2] = v4 >> 8; - if (v1[v6][v2] > 0x1f) - { - v1[v6][v2] = 0x1f; - } - } - } - else - { - for (; v6 <= 0x12; v6++) - { - v4 += v11; - v1[v6][v2] = v4 >> 8; - if (v1[v6][v2] > 0x1f) - { - v1[v6][v2] = 0x1f; - } - } - } - } - } -} - -void sub_807CC24(void) -{ - if (gWeather.unknown_6C0 == gWeather.unknown_6C1) - { - gWeather.unknown_6C6 = 3; - } - else - { - if (++gWeather.unknown_6C3 >= gWeather.unknown_6C2) - { - gWeather.unknown_6C3 = 0; - if (gWeather.unknown_6C0 < gWeather.unknown_6C1) - { - gWeather.unknown_6C0++; - } - else - { - gWeather.unknown_6C0--; - } - sub_807CEBC(0, 0x20, gWeather.unknown_6C0); - } - } -} - -void sub_807CCAC(void) -{ - if (++gWeather.unknown_6CB > 1) - { - gWeather.unknown_6CA = 0; - } - switch (gWeather.unknown_6D0) - { - case 3: - case 4: - case 5: - case 11: - case 13: - if (sub_807CDC4() == 0) - { - gWeather.unknown_6C0 = 3; - gWeather.unknown_6C6 = 3; - } - break; - case 12: - if (sub_807CE24() == 0) - { - gWeather.unknown_6C0 = -6; - gWeather.unknown_6C6 = 3; - } - break; - case 6: - if (sub_807CE7C() == 0) - { - gWeather.unknown_6C0 = 0; - gWeather.unknown_6C6 = 3; - } - break; - case 7: - case 8: - case 9: - case 10: - default: - if (!gPaletteFade.active) - { - gWeather.unknown_6C0 = gWeather.unknown_6C1; - gWeather.unknown_6C6 = 3; - } - break; - } -} - -u8 sub_807CDC4(void) -{ - if (gWeather.unknown_6C7 == 0x10) - { - return 0; - } - if (++gWeather.unknown_6C7 >= 0x10) - { - sub_807CEBC(0, 0x20, 3); - gWeather.unknown_6C7 = 0x10; - return 0; - } - sub_807D1BC(0, 0x20, 3, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); - return 1; -} - -u8 sub_807CE24(void) -{ - if (gWeather.unknown_6C7 == 0x10) - { - return 0; - } - if (++gWeather.unknown_6C7 >= 0x10) - { - sub_807CEBC(0, 0x20, -6); - gWeather.unknown_6C7 = 0x10; - return 0; - } - sub_807D304(-6, 0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); - return 1; -} - -u8 sub_807CE7C(void) -{ - if (gWeather.unknown_6C7 == 0x10) - { - return 0; - } - ++gWeather.unknown_6C7; - sub_807D424(0x10 - gWeather.unknown_6C7, gWeather.unknown_6C4); - return 1; -} - -void nullsub_39(void) -{ -} -- cgit v1.2.3