summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/field_specials.c613
-rw-r--r--src/item_use.c10
-rw-r--r--src/start_menu.c2
3 files changed, 596 insertions, 29 deletions
diff --git a/src/field_specials.c b/src/field_specials.c
index b0efd1c35..4db5fc64d 100644
--- a/src/field_specials.c
+++ b/src/field_specials.c
@@ -1,5 +1,6 @@
#include "global.h"
#include "malloc.h"
+#include "palette.h"
#include "quest_log.h"
#include "list_menu.h"
#include "diploma.h"
@@ -17,6 +18,7 @@
#include "task.h"
#include "battle_tower.h"
#include "field_camera.h"
+#include "field_effect.h"
#include "field_map_obj.h"
#include "menu_indicators.h"
#include "random.h"
@@ -33,6 +35,7 @@
#include "menu.h"
#include "mevent.h"
#include "naming_screen.h"
+#include "party_menu.h"
#include "dynamic_placeholder_text_util.h"
#include "new_menu_helpers.h"
#include "constants/songs.h"
@@ -41,13 +44,14 @@
#include "constants/map_objects.h"
#include "constants/maps.h"
#include "constants/region_map.h"
+#include "constants/moves.h"
EWRAM_DATA u8 sElevatorCurrentFloorWindowId = 0;
EWRAM_DATA u16 sElevatorScroll = 0;
EWRAM_DATA u16 sElevatorCursorPos = 0;
EWRAM_DATA struct ListMenuItem * gUnknown_2039A14 = NULL;
EWRAM_DATA u16 gUnknown_2039A18 = 0;
-EWRAM_DATA u8 gUnknown_2039A1A = 0;
+EWRAM_DATA u8 sUnknownBoxId = 0;
EWRAM_DATA u8 gUnknown_2039A1B = 0;
struct ListMenuTemplate gUnknown_3005360;
@@ -74,8 +78,14 @@ static void Task_ListMenuRemoveScrollIndicatorArrowPair(u8 taskId);
static u16 GetStarterPokemon(u16 starterIdx);
static void ChangeBoxPokemonNickname_CB(void);
static void ChangePokemonNickname_CB(void);
-
-static u8 *const gUnknown_83F5AF8[] = {
+static void Task_RunPokemonLeagueLightingEffect(u8 taskId);
+static void Task_CancelPokemonLeagueLightingEffect(u8 taskId);
+static void task_deoxys_sound(u8 taskId);
+static void MoveDeoxysObject(u8 num);
+static void Task_WaitDeoxysFieldEffect(u8 taskId);
+static void Task_WingFlapSound(u8 taskId);
+
+static u8 *const sStringVarPtrs[] = {
gStringVar1,
gStringVar2,
gStringVar3
@@ -319,7 +329,7 @@ void Special_BufferEReaderTrainerName5(void)
CopyEReaderTrainerName5(gStringVar1);
}
-static const u8 gUnknown_83F5B04[] = {
+static const u8 sUnused_83F5B04[] = {
13,
14,
15,
@@ -736,7 +746,7 @@ static const u8 *const sFloorNamePointers[] = {
gUnknown_841806D
};
-static const u8 gUnknown_83F5B84[] = {
+static const u8 sUnused_83F5B84[] = {
26,
26,
26,
@@ -1214,7 +1224,7 @@ void Special_ListMenu(void)
}
}
-static const u8 *const gUnknown_83F5BCC[][12] = {
+static const u8 *const sListMenuLabels[][12] = {
{
gUnknown_8417FD9,
gUnknown_8417FE6,
@@ -1293,7 +1303,7 @@ static void Task_CreateScriptListMenu(u8 taskId)
mwidth = 0;
for (i = 0; i < task->data[1]; i++)
{
- gUnknown_2039A14[i].label = gUnknown_83F5BCC[gSpecialVar_0x8004][i];
+ gUnknown_2039A14[i].label = sListMenuLabels[gSpecialVar_0x8004][i];
gUnknown_2039A14[i].index = i;
width = GetStringWidth(2, gUnknown_2039A14[i].label, 0);
if (width > mwidth)
@@ -1530,7 +1540,7 @@ bool8 Special_HasLeadMonBeenRenamed(void)
void TV_PrintIntToStringVar(u8 varidx, s32 number)
{
s32 n = CountDigits(number);
- ConvertIntToDecimalStringN(gUnknown_83F5AF8[varidx], number, STR_CONV_MODE_LEFT_ALIGN, n);
+ ConvertIntToDecimalStringN(sStringVarPtrs[varidx], number, STR_CONV_MODE_LEFT_ALIGN, n);
}
s32 CountDigits(s32 number)
@@ -1714,7 +1724,7 @@ bool8 Special_PlayerPartyContainsSpecies(void)
return FALSE;
}
-static const u8 gUnknown_83F5D32[][3] = {
+static const u8 sMartMaps[][3] = {
{MAP_GROUP(VIRIDIAN_CITY_MART), MAP_NUM(VIRIDIAN_CITY_MART), 1},
{MAP_GROUP(PEWTER_CITY_MART), MAP_NUM(PEWTER_CITY_MART), 3},
{MAP_GROUP(CERULEAN_CITY_MART), MAP_NUM(CERULEAN_CITY_MART), 1},
@@ -1729,13 +1739,13 @@ static const u8 gUnknown_83F5D32[][3] = {
{MAP_GROUP(SIX_ISLAND_MART), MAP_NUM(SIX_ISLAND_MART), 1}
};
-u8 sub_80CC4D4(void)
+u8 Special_GetMartClerkObjectId(void)
{
u8 i;
- for (i = 0; i < NELEMS(gUnknown_83F5D32); i++)
+ for (i = 0; i < NELEMS(sMartMaps); i++)
{
- if (gSaveBlock1Ptr->location.mapGroup == gUnknown_83F5D32[i][0] && gSaveBlock1Ptr->location.mapNum == gUnknown_83F5D32[i][1])
- return gUnknown_83F5D32[i][2];
+ if (gSaveBlock1Ptr->location.mapGroup == sMartMaps[i][0] && gSaveBlock1Ptr->location.mapNum == sMartMaps[i][1])
+ return sMartMaps[i][2];
}
return 1;
}
@@ -1750,7 +1760,7 @@ static const struct {
u16 num;
u16 grp2;
u16 num2;
-} gUnknown_83F5D58[51] = {
+} sInsideOutsidePairs[51] = {
{MAP_GROUP(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP_NUM(PALLET_TOWN_PLAYERS_HOUSE_1F), MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN)},
{MAP_GROUP(PALLET_TOWN_PROFESSOR_OAKS_LAB), MAP_NUM(PALLET_TOWN_PROFESSOR_OAKS_LAB), MAP_GROUP(PALLET_TOWN), MAP_NUM(PALLET_TOWN)},
{MAP_GROUP(VIRIDIAN_CITY_GYM), MAP_NUM(VIRIDIAN_CITY_GYM), MAP_GROUP(VIRIDIAN_CITY), MAP_NUM(VIRIDIAN_CITY)},
@@ -1807,9 +1817,9 @@ static const struct {
void sub_80CC534(void)
{
u8 i;
- for (i = 0; i < NELEMS(gUnknown_83F5D58); i++)
+ for (i = 0; i < NELEMS(sInsideOutsidePairs); i++)
{
- if (gSaveBlock1Ptr->location.mapGroup == gUnknown_83F5D58[i].grp && gSaveBlock1Ptr->location.mapNum == gUnknown_83F5D58[i].num)
+ if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[i].grp && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[i].num)
{
if (VarGet(VAR_0x404D) != 35 || i != 32)
{
@@ -1851,7 +1861,7 @@ void sub_80CC59C(void)
{
if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(ROUTE22) && (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22) || gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE23)))
{
- sp0.unk0 = get_mapheader_by_bank_and_number(gUnknown_83F5D58[r5].grp, gUnknown_83F5D58[r5].num)->regionMapSectionId;
+ sp0.unk0 = get_mapheader_by_bank_and_number(sInsideOutsidePairs[r5].grp, sInsideOutsidePairs[r5].num)->regionMapSectionId;
if (gSaveBlock1Ptr->location.mapNum == MAP_NUM(ROUTE22))
sp0.unk1 = r5;
else
@@ -1861,9 +1871,9 @@ void sub_80CC59C(void)
return;
}
}
- if (gSaveBlock1Ptr->location.mapGroup == gUnknown_83F5D58[r5].grp2 && gSaveBlock1Ptr->location.mapNum == gUnknown_83F5D58[r5].num2)
+ if (gSaveBlock1Ptr->location.mapGroup == sInsideOutsidePairs[r5].grp2 && gSaveBlock1Ptr->location.mapNum == sInsideOutsidePairs[r5].num2)
{
- sp0.unk0 = get_mapheader_by_bank_and_number(gUnknown_83F5D58[r5].grp, gUnknown_83F5D58[r5].num)->regionMapSectionId;
+ sp0.unk0 = get_mapheader_by_bank_and_number(sInsideOutsidePairs[r5].grp, sInsideOutsidePairs[r5].num)->regionMapSectionId;
sp0.unk1 = r5;
if (r5 == 22)
{
@@ -1888,9 +1898,6 @@ void sub_80CC59C(void)
}
}
-extern const char gUnknown_83F5EF0[];
-extern const char gUnknown_83F5F24[];
-
u16 Special_BattleCardAction(void)
{
switch (gSpecialVar_Result)
@@ -1911,7 +1918,52 @@ u16 Special_BattleCardAction(void)
}
}
-const u16 gUnknown_83F5F26[] = {
+void set_unknown_box_id(u8 boxId)
+{
+ sUnknownBoxId = boxId;
+}
+
+u16 get_unknown_box_id(void)
+{
+ return sUnknownBoxId;
+}
+
+bool8 sub_80CC7B4(void)
+{
+ if (FlagGet(FLAG_SYS_CHANGED_BOX_TO_STORE_MON))
+ return FALSE;
+ if (StorageGetCurrentBox() == VarGet(VAR_0x4037))
+ return FALSE;
+ FlagSet(FLAG_SYS_CHANGED_BOX_TO_STORE_MON);
+ return TRUE;
+}
+
+bool8 sub_80CC7F8(void)
+{
+ s32 i;
+ s32 j;
+ set_unknown_box_id(VarGet(VAR_0x4037));
+ i = StorageGetCurrentBox();
+ do
+ {
+ for (j = 0; j < IN_BOX_COUNT; j++)
+ {
+ if (GetBoxMonData(GetBoxedMonPtr(i, j), MON_DATA_SPECIES, NULL) == SPECIES_NONE)
+ {
+ if (get_unknown_box_id() != i)
+ FlagClear(FLAG_SYS_CHANGED_BOX_TO_STORE_MON);
+ VarSet(VAR_0x4037, i);
+ return sub_80CC7B4();
+ }
+ }
+ i++;
+ if (i == TOTAL_BOXES_COUNT)
+ i = 0;
+ } while (i != StorageGetCurrentBox());
+ return FALSE;
+}
+
+const u16 sPokeCenter1FMaps[] = {
MAP_VIRIDIAN_CITY_POKEMON_CENTER_1F,
MAP_PEWTER_CITY_POKEMON_CENTER_1F,
MAP_CERULEAN_CITY_POKEMON_CENTER_1F,
@@ -1934,3 +1986,518 @@ const u16 gUnknown_83F5F26[] = {
MAP_UNKNOWN_MAP_00_04,
MAP_UNDEFINED
};
+
+bool8 sub_80CC87C(void)
+{
+ s32 i;
+ u16 mapno = (gUnknown_2031DB4.mapGroup << 8) + gUnknown_2031DB4.mapNum;
+ for (i = 0; sPokeCenter1FMaps[i] != MAP_UNDEFINED; i++)
+ {
+ if (sPokeCenter1FMaps[i] == mapno)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 Special_ItemIsTM_GetMoveName(void)
+{
+ // 8004 = item ID
+ if (gSpecialVar_0x8004 >= ITEM_TM01 && gSpecialVar_0x8004 <= ITEM_HM08)
+ {
+ StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_0x8004)]);
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
+
+void RunMassageCooldownStepCounter(void)
+{
+ u16 count = VarGet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER);
+ if (count < 500)
+ VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, count + 1);
+}
+
+void Special_DaisyMassageServices(void)
+{
+ AdjustFriendship(&gPlayerParty[gSpecialVar_0x8004], 6);
+ VarSet(VAR_MASSAGE_COOLDOWN_STEP_COUNTER, 0);
+}
+
+static const u16 sEliteFourLightingPalettes[][16] = {
+ INCBIN_U16("data/field_specials/unk_83F5F50.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F5F70.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F5F90.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F5FB0.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F5FD0.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F5FF0.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6010.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6030.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6050.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6070.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6090.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F60B0.gbapal")
+};
+
+static const u16 sChampionRoomLightingPalettes[][16] = {
+ INCBIN_U16("data/field_specials/unk_83F60D0.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F60F0.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6110.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6130.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6150.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6170.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6190.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F61B0.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F61D0.gbapal")
+};
+
+static const u8 sEliteFourLightingTimers[] = {
+ 40,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12,
+ 12
+};
+
+static const u8 sChampionRoomLightingTimers[] = {
+ 20,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8,
+ 8
+};
+
+void Special_PokemonLeagueLightingEffect(void)
+{
+ u8 taskId = CreateTask(Task_RunPokemonLeagueLightingEffect, 8);
+ s16 *data = gTasks[taskId].data;
+ if (FlagGet(FLAG_TEMP_3) == TRUE)
+ {
+ gTasks[taskId].func = Task_CancelPokemonLeagueLightingEffect;
+ }
+ else
+ {
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM))
+ {
+ data[0] = sChampionRoomLightingTimers[0];
+ data[2] = 8;
+ LoadPalette(sChampionRoomLightingPalettes[0], 0x70, 0x20);
+ }
+ else
+ {
+ data[0] = sEliteFourLightingTimers[0];
+ data[2] = 11;
+ LoadPalette(sEliteFourLightingPalettes[0], 0x70, 0x20);
+ }
+ data[1] = 0;
+ sub_8059948(7, 1);
+ }
+}
+
+static void Task_RunPokemonLeagueLightingEffect(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (!gPaletteFade.active
+ && FlagGet(FLAG_TEMP_2) != FALSE
+ && FlagGet(FLAG_TEMP_5) != TRUE
+ && gUnknown_2036E28 != 3
+ && --data[0] == 0
+ )
+ {
+ if (++data[1] == data[2])
+ data[1] = 0;
+
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM))
+ {
+ data[0] = sChampionRoomLightingTimers[data[1]];
+ LoadPalette(sChampionRoomLightingPalettes[data[1]], 0x70, 0x20);
+ }
+ else
+ {
+ data[0] = sEliteFourLightingTimers[data[1]];
+ LoadPalette(sEliteFourLightingPalettes[data[1]], 0x70, 0x20);
+ }
+ sub_8059948(7, 1);
+ }
+}
+
+static void Task_CancelPokemonLeagueLightingEffect(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ if (FlagGet(FLAG_TEMP_4) != FALSE)
+ {
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(POKEMON_LEAGUE_CHAMPIONS_ROOM) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(POKEMON_LEAGUE_CHAMPIONS_ROOM))
+ {
+ LoadPalette(sChampionRoomLightingPalettes[8], 0x70, 0x20);
+ }
+ else
+ {
+ LoadPalette(sEliteFourLightingPalettes[11], 0x70, 0x20);
+ }
+ sub_8059948(7, 1);
+ if (gPaletteFade.active)
+ {
+ BlendPalettes(0x00000080, 16, RGB_BLACK);
+ }
+ DestroyTask(taskId);
+ }
+}
+
+void StopPokemonLeagueLightingEffectTask(void)
+{
+ if (FuncIsActiveTask(Task_RunPokemonLeagueLightingEffect) == TRUE)
+ {
+ DestroyTask(FindTaskIdByFunc(Task_RunPokemonLeagueLightingEffect));
+ }
+}
+
+static const u8 sCapeBrinkCompatibleSpecies[] = {
+ SPECIES_VENUSAUR,
+ SPECIES_CHARIZARD,
+ SPECIES_BLASTOISE
+};
+
+bool8 Special_CapeBrinkGetMoveToTeachLeadPokemon(void)
+{
+ // Returns:
+ // 8005 = Move tutor index
+ // 8006 = Num moves known by lead mon
+ // 8007 = Index of lead mon
+ // to specialvar = whether a move can be taught in the first place
+ u8 r7 = 0;
+ u8 r6 = 0;
+ u8 r8 = GetLeadMonIndex();
+ u8 r4;
+ gSpecialVar_0x8007 = r8;
+ for (r4 = 0; r4 < NELEMS(sCapeBrinkCompatibleSpecies); r4++)
+ {
+ if (GetMonData(&gPlayerParty[r8], MON_DATA_SPECIES2, NULL) == sCapeBrinkCompatibleSpecies[r4])
+ {
+ r7 = r4;
+ break;
+ }
+ }
+ if (r4 == NELEMS(sCapeBrinkCompatibleSpecies) || GetMonData(&gPlayerParty[r8], MON_DATA_FRIENDSHIP) != 255)
+ return FALSE;
+ if (r7 == 0)
+ {
+ StringCopy(gStringVar2, gMoveNames[MOVE_FRENZY_PLANT]);
+ gSpecialVar_0x8005 = MOVETUTOR_FRENZY_PLANT;
+ if (FlagGet(FLAG_TUTOR_FRENZY_PLANT) == TRUE)
+ return FALSE;
+ }
+ else if (r7 == 1)
+ {
+ StringCopy(gStringVar2, gMoveNames[MOVE_BLAST_BURN]);
+ gSpecialVar_0x8005 = MOVETUTOR_BLAST_BURN;
+ if (FlagGet(FLAG_TUTOR_BLAST_BURN) == TRUE)
+ return FALSE;
+ }
+ else
+ {
+ StringCopy(gStringVar2, gMoveNames[MOVE_HYDRO_CANNON]);
+ gSpecialVar_0x8005 = MOVETUTOR_HYDRO_CANNON;
+ if (FlagGet(FLAG_TUTOR_HYDRO_CANNON) == TRUE)
+ return FALSE;
+ }
+ if (GetMonData(&gPlayerParty[r8], MON_DATA_MOVE1) != MOVE_NONE)
+ r6++;
+ if (GetMonData(&gPlayerParty[r8], MON_DATA_MOVE2) != MOVE_NONE)
+ r6++;
+ if (GetMonData(&gPlayerParty[r8], MON_DATA_MOVE3) != MOVE_NONE)
+ r6++;
+ if (GetMonData(&gPlayerParty[r8], MON_DATA_MOVE4) != MOVE_NONE)
+ r6++;
+ gSpecialVar_0x8006 = r6;
+ return TRUE;
+}
+
+bool8 Special_HasLearnedAllMovesFromCapeBrinkTutor(void)
+{
+ // 8005 is set by Special_CapeBrinkGetMoveToTeachLeadPokemon
+ u8 r4 = 0;
+ if (gSpecialVar_0x8005 == MOVETUTOR_FRENZY_PLANT)
+ FlagSet(FLAG_TUTOR_FRENZY_PLANT);
+ else if (gSpecialVar_0x8005 == MOVETUTOR_BLAST_BURN)
+ FlagSet(FLAG_TUTOR_BLAST_BURN);
+ else
+ FlagSet(FLAG_TUTOR_HYDRO_CANNON);
+ if (FlagGet(FLAG_TUTOR_FRENZY_PLANT) == TRUE)
+ r4++;
+ if (FlagGet(FLAG_TUTOR_BLAST_BURN) == TRUE)
+ r4++;
+ if (FlagGet(FLAG_TUTOR_HYDRO_CANNON) == TRUE)
+ r4++;
+ if (r4 == 3)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 CutMoveRuinValleyCheck(void)
+{
+ if (FlagGet(FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE) != TRUE
+ && gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SIX_ISLAND_RUIN_VALLEY)
+ && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SIX_ISLAND_RUIN_VALLEY)
+ && gSaveBlock1Ptr->pos.x == 24
+ && gSaveBlock1Ptr->pos.y == 25
+ && GetPlayerFacingDirection() == DIR_NORTH)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void CutMoveOpenDottedHoleDoor(void)
+{
+ MapGridSetMetatileIdAt(31, 31, 0x358);
+ DrawWholeMapView();
+ PlaySE(SE_BAN);
+ FlagSet(FLAG_USED_CUT_ON_RUIN_VALLEY_BRAILLE);
+ ScriptContext2_Disable();
+}
+
+static const u16 sDeoxysObjectPals[][16] = {
+ INCBIN_U16("data/field_specials/unk_83F6206.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6226.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6246.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6266.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6286.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F62A6.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F62C6.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F62E6.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6306.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6326.gbapal"),
+ INCBIN_U16("data/field_specials/unk_83F6346.gbapal")
+};
+
+static const u8 sDeoxysCoords[][2] = {
+ {15, 12},
+ {11, 14},
+ {15, 8},
+ {19, 14},
+ {12, 11},
+ {18, 11},
+ {15, 14},
+ {11, 14},
+ {19, 14},
+ {15, 15},
+ {15, 10}
+};
+
+static const u8 sDeoxysStepCaps[] = {
+ 4,
+ 8,
+ 8,
+ 8,
+ 4,
+ 4,
+ 4,
+ 6,
+ 3,
+ 3
+};
+
+void Special_DeoxysSound(void)
+{
+ CreateTask(task_deoxys_sound, 8);
+}
+
+static void task_deoxys_sound(u8 taskId)
+{
+ u16 r5;
+ u16 r6;
+ if (FlagGet(FLAG_SYS_DEOXYS_AWAKENED) == TRUE)
+ {
+ gSpecialVar_Result = 3;
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ else
+ {
+ r5 = VarGet(VAR_DEOXYS_INTERACTION_NUM);
+ r6 = VarGet(VAR_DEOXYS_INTERACTION_STEP_COUNTER);
+ VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, 0);
+ if (r5 != 0 && sDeoxysStepCaps[r5 - 1] < r6)
+ {
+ MoveDeoxysObject(0);
+ VarSet(VAR_DEOXYS_INTERACTION_NUM, 0);
+ gSpecialVar_Result = 0;
+ DestroyTask(taskId);
+ }
+ else if (r5 == 10)
+ {
+ FlagSet(FLAG_SYS_DEOXYS_AWAKENED);
+ gSpecialVar_Result = 2;
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ else
+ {
+ r5++;
+ MoveDeoxysObject(r5);
+ VarSet(VAR_DEOXYS_INTERACTION_NUM, r5);
+ gSpecialVar_Result = 1;
+ DestroyTask(taskId);
+ }
+ }
+}
+
+static void MoveDeoxysObject(u8 num)
+{
+ u8 mapObjId;
+ LoadPalette(sDeoxysObjectPals[num], 0x1A0, 0x08);
+ sub_8083598(10);
+ TryGetFieldObjectIdByLocalIdAndMap(1, gSaveBlock1Ptr->location.mapNum, gSaveBlock1Ptr->location.mapGroup, &mapObjId);
+ if (num == 0)
+ PlaySE(SE_W109);
+ else
+ PlaySE(SE_DEOMOV);
+ CreateTask(Task_WaitDeoxysFieldEffect, 8);
+ gFieldEffectArguments[0] = 1;
+ gFieldEffectArguments[1] = 56;
+ gFieldEffectArguments[2] = 2;
+ gFieldEffectArguments[3] = sDeoxysCoords[num][0];
+ gFieldEffectArguments[4] = sDeoxysCoords[num][1];
+ if (num == 0)
+ gFieldEffectArguments[5] = 60;
+ else
+ gFieldEffectArguments[5] = 5;
+ FieldEffectStart(FLDEFF_UNK_43);
+ Overworld_SetMapObjTemplateCoords(1, sDeoxysCoords[num][0], sDeoxysCoords[num][1]);
+}
+
+static void Task_WaitDeoxysFieldEffect(u8 taskId)
+{
+ if (!FieldEffectActiveListContains(FLDEFF_UNK_43))
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+void BirthIslandDeoxysStepCounter(void)
+{
+ u16 count = VarGet(VAR_DEOXYS_INTERACTION_STEP_COUNTER);
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(BIRTH_ISLAND_EXTERIOR) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(BIRTH_ISLAND_EXTERIOR))
+ {
+ count++;
+ if (count > 99)
+ VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, 0);
+ else
+ VarSet(VAR_DEOXYS_INTERACTION_STEP_COUNTER, count);
+ }
+}
+
+void Special_SetDeoxysTriangleObjectPal(void)
+{
+ u8 num = VarGet(VAR_DEOXYS_INTERACTION_NUM);
+ LoadPalette(sDeoxysObjectPals[num], 0x1A0, 0x08);
+ sub_8083598(10);
+}
+
+bool8 Special_BadEggInParty(void)
+{
+ u8 partyCount = CalculatePlayerPartyCount();
+ u8 i;
+ for (i = 0; i < partyCount; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SANITY_IS_BAD_EGG) == TRUE)
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 Special_PlayerIsNotInTrainerTowerLobby(void)
+{
+ if (gSaveBlock1Ptr->location.mapGroup == MAP_GROUP(SEVEN_ISLAND_TRAINER_TOWER_LOBBY) && gSaveBlock1Ptr->location.mapNum == MAP_NUM(SEVEN_ISLAND_TRAINER_TOWER_LOBBY))
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void Special_BrailleCursorToggle(void)
+{
+ // 8004 = x - 27
+ // 8005 = y
+ // 8006 = action (0 = create, 1 = delete)
+ u16 x;
+ if (gUnknown_203ADFA != 2)
+ {
+ x = gSpecialVar_0x8004 + 27;
+ if (gSpecialVar_0x8006 == 0)
+ gUnknown_2039A1B = CreateTextCursorSpriteForOakSpeech(0, x, gSpecialVar_0x8005, 0, 0);
+ else
+ sub_8006398(gUnknown_2039A1B);
+ }
+}
+
+bool8 Special_PlayerPartyContainsSpeciesWithPlayerID(void)
+{
+ // 8004 = species
+ u8 playerCount = CalculatePlayerPartyCount();
+ u8 i;
+ for (i = 0; i < playerCount; i++)
+ {
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2, NULL) == gSpecialVar_0x8004 && GetPlayerTrainerId() == GetMonData(&gPlayerParty[i], MON_DATA_OT_ID, NULL))
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/*
+ * Determines which of Lorelei's doll collection to show
+ * based on how many times you've entered the Hall of Fame.
+ */
+void Special_ComputeLoreleiDollCollection(void)
+{
+ u32 numHofClears = GetGameStat(GAME_STAT_ENTERED_HOF);
+ if (numHofClears >= 25)
+ {
+ FlagClear(FLAG_HIDE_LORELEI_HOUSE_MEOWTH_DOLL);
+ if (numHofClears >= 50)
+ FlagClear(FLAG_HIDE_LORELEI_HOUSE_CHANSEY_DOLL);
+ if (numHofClears >= 75)
+ FlagClear(FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_F_DOLL);
+ if (numHofClears >= 100)
+ FlagClear(FLAG_HIDE_LORELEI_HOUSE_JIGGLYPUFF_DOLL);
+ if (numHofClears >= 125)
+ FlagClear(FLAG_HIDE_LORELEIS_HOUSE_NIDORAN_M_DOLL);
+ if (numHofClears >= 150)
+ FlagClear(FLAG_HIDE_LORELEIS_HOUSE_FEAROW_DOLL);
+ if (numHofClears >= 175)
+ FlagClear(FLAG_HIDE_LORELEIS_HOUSE_PIDGEOT_DOLL);
+ if (numHofClears >= 200)
+ FlagClear(FLAG_HIDE_LORELEIS_HOUSE_LAPRAS_DOLL);
+ }
+}
+
+void Special_LoopWingFlapSound(void)
+{
+ // 8004 = Num flaps
+ // 8005 = Frame delay between flaps
+ CreateTask(Task_WingFlapSound, 8);
+ PlaySE(SE_W017);
+}
+
+static void Task_WingFlapSound(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ data[1]++;
+ if (data[1] == gSpecialVar_0x8005)
+ {
+ data[0]++;
+ data[1] = 0;
+ PlaySE(SE_W017);
+ }
+ if (data[0] == gSpecialVar_0x8004 - 1)
+ DestroyTask(taskId);
+}
diff --git a/src/item_use.c b/src/item_use.c
index fd247acbb..679a3b8cc 100644
--- a/src/item_use.c
+++ b/src/item_use.c
@@ -396,7 +396,7 @@ void FieldUseFunc_TmCase(u8 taskId)
}
else
{
- sub_80CCB68();
+ StopPokemonLeagueLightingEffectTask();
fade_screen(1, 0);
gTasks[taskId].func = Task_InitTMCaseFromField;
}
@@ -427,7 +427,7 @@ void FieldUseFunc_BerryPouch(u8 taskId)
}
else
{
- sub_80CCB68();
+ StopPokemonLeagueLightingEffectTask();
fade_screen(1, 0);
gTasks[taskId].func = Task_InitBerryPouchFromField;
}
@@ -470,7 +470,7 @@ void FieldUseFunc_TeachyTv(u8 taskId)
}
else
{
- sub_80CCB68();
+ StopPokemonLeagueLightingEffectTask();
fade_screen(1, 0);
gTasks[taskId].func = Task_InitTeachyTvFromField;
}
@@ -600,7 +600,7 @@ void FieldUseFunc_TownMap(u8 taskId)
}
else
{
- sub_80CCB68();
+ StopPokemonLeagueLightingEffectTask();
fade_screen(1, 0);
gTasks[taskId].func = sub_80A1CC0;
}
@@ -632,7 +632,7 @@ void FieldUseFunc_FameChecker(u8 taskId)
}
else
{
- sub_80CCB68();
+ StopPokemonLeagueLightingEffectTask();
fade_screen(1, 0);
gTasks[taskId].func = sub_80A1D68;
}
diff --git a/src/start_menu.c b/src/start_menu.c
index 442884c05..221ae1f1f 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -445,7 +445,7 @@ static void StartMenu_FadeScreenIfLeavingOverworld(void)
&& sStartMenuCallback != StartMenuExitCallback
&& sStartMenuCallback != StartMenuSafariZoneRetireCallback)
{
- sub_80CCB68();
+ StopPokemonLeagueLightingEffectTask();
fade_screen(1, 0);
}
}