summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_2.c45
-rw-r--r--src/battle_transition.c258
-rw-r--r--src/berry_fix_program.c2
-rw-r--r--src/coord_event_weather.c119
-rw-r--r--src/decoration.c10
-rw-r--r--src/diploma.c2
-rw-r--r--src/egg_hatch.c4
-rw-r--r--src/evolution_scene.c6
-rw-r--r--src/hall_of_fame.c2
-rwxr-xr-xsrc/item_use.c1271
-rw-r--r--src/mail.c2
-rw-r--r--src/option_menu.c2
-rw-r--r--src/pokeblock.c2
-rw-r--r--src/reshow_battle_screen.c6
-rw-r--r--src/scanline_effect.c262
-rw-r--r--src/scrcmd.c10
-rw-r--r--src/secret_base.c6
-rw-r--r--src/time_events.c118
-rw-r--r--src/use_pokeblock.c4
-rw-r--r--src/wallclock.c2
20 files changed, 1945 insertions, 188 deletions
diff --git a/src/battle_2.c b/src/battle_2.c
index 61e39b39f..4ff2bd19a 100644
--- a/src/battle_2.c
+++ b/src/battle_2.c
@@ -4,7 +4,7 @@
#include "main.h"
#include "load_save.h"
#include "gpu_regs.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "battle_setup.h"
#include "battle_scripts.h"
#include "pokemon.h"
@@ -46,13 +46,6 @@
#include "battle_string_ids.h"
#include "data2.h"
-struct UnknownStruct6
-{
- u16 unk0[0xA0];
- u8 fillerA0[0x640];
- u16 unk780[0xA0];
-};
-
struct UnknownPokemonStruct2
{
/*0x00*/ u16 species;
@@ -90,8 +83,6 @@ extern void (*gBattleMainFunc)(void);
extern void (*gCB2_AfterEvolution)(void);
extern struct UnknownPokemonStruct2 gUnknown_02022FF8[3]; // what is it used for?
extern struct UnknownPokemonStruct2* gUnknown_02023058; // what is it used for?
-extern u8 gUnknown_02039B28[]; // possibly a struct?
-extern struct UnknownStruct6 gUnknown_02038C28; // todo: identify & document
extern struct MusicPlayerInfo gMPlayInfo_SE1;
extern struct MusicPlayerInfo gMPlayInfo_SE2;
extern u8 gDecompressionBuffer[];
@@ -162,6 +153,7 @@ extern const u8 * const gBattlescriptsForBallThrow[];
extern const u8 * const gBattlescriptsForRunningByItem[];
extern const u8 * const gBattlescriptsForUsingItem[];
extern const u8 * const gBattlescriptsForSafariActions[];
+extern const struct ScanlineEffectParams gUnknown_0831AC70;
// strings
extern const u8 gText_LinkStandby3[];
@@ -180,7 +172,7 @@ extern const u8 gText_Confusion[];
extern const u8 gText_Love[];
// functions
-extern void dp12_8087EA4(void);
+extern void ScanlineEffect_Clear(void);
extern void sub_80356D0(void);
extern void GetFrontierTrainerName(u8* dst, u16 trainerId); // battle tower
extern void sub_8166188(void); // battle tower, sets link battle mons level but why?
@@ -383,24 +375,21 @@ static void CB2_InitBattleInternal(void)
else
{
gBattle_WIN0V = 0x5051;
- dp12_8087EA4();
+ ScanlineEffect_Clear();
for (i = 0; i < 80; i++)
{
- gUnknown_02038C28.unk0[i] = 0xF0;
- gUnknown_02038C28.unk780[i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = 0xF0;
}
for (i = 80; i < 160; i++)
{
- #ifndef NONMATCHING
- asm(""::"r"(i)); // needed to match
- #endif // NONMATCHING
-
- gUnknown_02038C28.unk0[i] = 0xFF10;
- gUnknown_02038C28.unk780[i] = 0xFF10;
+ asm(""::"r"(i));
+ gScanlineEffectRegBuffers[0][i] = 0xFF10;
+ gScanlineEffectRegBuffers[1][i] = 0xFF10;
}
- sub_80BA038(gUnknown_0831AC70);
+ ScanlineEffect_SetParams(gUnknown_0831AC70);
}
ResetPaletteFade();
@@ -1596,7 +1585,7 @@ void BattleMainCB2(void)
static void FreeRestoreBattleData(void)
{
gMain.callback1 = gPreBattleCallback1;
- gUnknown_02039B28[0x15] = 3;
+ gScanlineEffect.state = 3;
gMain.inBattle = 0;
ZeroEnemyPartyMons();
m4aSongNumStop(0x5A);
@@ -1814,7 +1803,7 @@ void VBlankCB_Battle(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
void nullsub_17(void)
@@ -1952,18 +1941,18 @@ void sub_8038D64(void)
SetGpuReg(REG_OFFSET_WINOUT, 0);
gBattle_WIN0H = 0xF0;
gBattle_WIN0V = 0x5051;
- dp12_8087EA4();
+ ScanlineEffect_Clear();
for (i = 0; i < 80; i++)
{
- gUnknown_02038C28.unk0[i] = 0xF0;
- gUnknown_02038C28.unk780[i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = 0xF0;
}
for (i = 80; i < 160; i++)
{
asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
- gUnknown_02038C28.unk0[i] = 0xFF10;
- gUnknown_02038C28.unk780[i] = 0xFF10;
+ gScanlineEffectRegBuffers[0][i] = 0xFF10;
+ gScanlineEffectRegBuffers[1][i] = 0xFF10;
}
ResetPaletteFade();
diff --git a/src/battle_transition.c b/src/battle_transition.c
index e003e0fce..0ff8cd903 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -14,7 +14,7 @@
#include "constants/songs.h"
#include "constants/trainers.h"
#include "field_camera.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "malloc.h"
#include "gpu_regs.h"
#include "decompress.h"
@@ -56,8 +56,6 @@ struct StructRectangularSpiral
typedef bool8 (*TransitionStateFunc)(struct Task *task);
typedef bool8 (*TransitionSpriteCallback)(struct Sprite *sprite);
-extern u16 gUnknown_020393A8[];
-extern u16 gUnknown_02038C28[][0x3C0];
extern u16 gBattle_BG0_X;
extern u16 gBattle_BG0_Y;
@@ -65,7 +63,7 @@ extern const struct OamData gFieldObjectBaseOam_32x32;
extern void c2_exit_to_overworld_2_switch(void);
extern void sub_80AC3D0(void);
-extern void dp12_8087EA4(void);
+extern void ScanlineEffect_Clear(void);
// this file's functions
static void LaunchBattleTransitionTask(u8 transitionId);
@@ -1110,9 +1108,9 @@ static void Phase2Task_Swirl(u8 taskId)
static bool8 Phase2_Swirl_Func1(struct Task *task)
{
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
BeginNormalPaletteFade(-1, 4, 0, 0x10, 0);
- sub_8149F98(gUnknown_020393A8, sTransitionStructPtr->field_14, 0, 2, 0, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_14, 0, 2, 0, 160);
SetVBlankCallback(VBlankCB_Phase2_Swirl);
SetHBlankCallback(HBlankCB_Phase2_Swirl);
@@ -1129,7 +1127,7 @@ static bool8 Phase2_Swirl_Func2(struct Task *task)
task->tData1 += 4;
task->tData2 += 8;
- sub_8149F98(gUnknown_02038C28[0], sTransitionStructPtr->field_14, task->tData1, 2, task->tData2, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], sTransitionStructPtr->field_14, task->tData1, 2, task->tData2, 160);
if (!gPaletteFade.active)
{
@@ -1145,12 +1143,12 @@ static void VBlankCB_Phase2_Swirl(void)
{
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
}
static void HBlankCB_Phase2_Swirl(void)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG1HOFS = var;
REG_BG2HOFS = var;
REG_BG3HOFS = var;
@@ -1164,10 +1162,10 @@ static void Phase2Task_Shuffle(u8 taskId)
static bool8 Phase2_Shuffle_Func1(struct Task *task)
{
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
BeginNormalPaletteFade(-1, 4, 0, 0x10, 0);
- memset(gUnknown_020393A8, sTransitionStructPtr->field_16, 0x140);
+ memset(gScanlineEffectRegBuffers[1], sTransitionStructPtr->field_16, 0x140);
SetVBlankCallback(VBlankCB_Phase2_Shuffle);
SetHBlankCallback(HBlankCB_Phase2_Shuffle);
@@ -1192,7 +1190,7 @@ static bool8 Phase2_Shuffle_Func2(struct Task *task)
for (i = 0; i < 160; i++, r4 += 4224)
{
u16 var = r4 / 256;
- gUnknown_02038C28[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
}
if (!gPaletteFade.active)
@@ -1206,12 +1204,12 @@ static void VBlankCB_Phase2_Shuffle(void)
{
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
}
static void HBlankCB_Phase2_Shuffle(void)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG1VOFS = var;
REG_BG2VOFS = var;
REG_BG3VOFS = var;
@@ -1257,7 +1255,7 @@ static void sub_814669C(struct Task *task)
s32 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
task->tData1 = 16;
task->tData2 = 0;
@@ -1272,7 +1270,7 @@ static void sub_814669C(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 240;
+ gScanlineEffectRegBuffers[1][i] = 240;
}
SetVBlankCallback(VBlankCB0_Phase2_BigPokeball);
@@ -1351,7 +1349,7 @@ static bool8 Phase2_BigPokeball_Func2(struct Task *task)
dst1[i * 32 + j] = *BigPokeballMap | 0xF000;
}
}
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return TRUE;
@@ -1363,7 +1361,7 @@ static bool8 Phase2_Aqua_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LZ77UnCompVram(sTeamAqua_Tilemap, dst1);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1375,7 +1373,7 @@ static bool8 Phase2_Magma_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LZ77UnCompVram(sTeamMagma_Tilemap, dst1);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1388,7 +1386,7 @@ static bool8 Phase2_Regice_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LoadPalette(gUnknown_085BC2B4, 0xF0, 0x20);
CpuCopy16(gUnknown_085BC314, dst1, 0x500);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1401,7 +1399,7 @@ static bool8 Phase2_Registeel_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LoadPalette(gUnknown_085BC2D4, 0xF0, 0x20);
CpuCopy16(gUnknown_085BCB14, dst1, 0x500);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1414,7 +1412,7 @@ static bool8 Phase2_Regirock_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LoadPalette(gUnknown_085BC2F4, 0xF0, 0x20);
CpuCopy16(gUnknown_085BD314, dst1, 0x500);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5, 160);
task->tState++;
return FALSE;
@@ -1499,7 +1497,7 @@ static bool8 Phase2_BigPokeball_Func3(struct Task *task)
task->tData4 += 8;
task->tData5 -= 256;
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
sTransitionStructPtr->VBlank_DMA++;
return FALSE;
@@ -1519,7 +1517,7 @@ static bool8 Phase2_BigPokeball_Func4(struct Task *task)
task->tData4 += 8;
task->tData5 -= 256;
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
sTransitionStructPtr->VBlank_DMA++;
return FALSE;
@@ -1531,7 +1529,7 @@ static bool8 Phase2_BigPokeball_Func5(struct Task *task)
task->tData4 += 8;
task->tData5 -= 256;
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 132, task->tData5 >> 8, 160);
if (task->tData5 <= 0)
{
@@ -1577,7 +1575,7 @@ static bool8 Phase2_BigPokeball_Func6(struct Task *task)
if (task->tData1 < 0)
task->tData1 = 0;
}
- sub_814A014(gUnknown_02038C28[0], 120, 80, task->tData1);
+ sub_814A014(gScanlineEffectRegBuffers[0], 120, 80, task->tData1);
if (task->tData1 == 0)
{
SetVBlankCallback(NULL);
@@ -1604,7 +1602,7 @@ static void Transition_BigPokeball_Vblank(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
@@ -1615,13 +1613,13 @@ static void Transition_BigPokeball_Vblank(void)
static void VBlankCB0_Phase2_BigPokeball(void)
{
Transition_BigPokeball_Vblank();
- DmaSet(0, gUnknown_020393A8, &REG_BG0HOFS, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BG0HOFS, 0xA2400001);
}
static void VBlankCB1_Phase2_BigPokeball(void)
{
Transition_BigPokeball_Vblank();
- DmaSet(0, gUnknown_020393A8, &REG_WIN0H, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
static void Phase2Task_PokeballsTrail(u8 taskId)
@@ -1741,7 +1739,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 0;
sTransitionStructPtr->WINOUT = 63;
@@ -1750,7 +1748,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_020393A8[i] = 0xF3F4;
+ gScanlineEffectRegBuffers[1][i] = 0xF3F4;
}
SetVBlankCallback(VBlankCB_Phase2_Clockwise_BlackFade);
@@ -1767,7 +1765,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func2(struct Task *task)
sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], -1, 1, 1);
do
{
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] + 1) | 0x7800;
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] + 1) | 0x7800;
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
sTransitionStructPtr->data[4] += 16;
@@ -1795,7 +1793,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func3(struct Task *task)
r1 = 120, r3 = sTransitionStructPtr->data[2] + 1;
if (sTransitionStructPtr->data[5] >= 80)
r1 = sTransitionStructPtr->data[2], r3 = 240;
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
if (var != 0)
break;
var = sub_814A228(sTransitionStructPtr->data, 1, 1);
@@ -1811,7 +1809,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func3(struct Task *task)
{
while (sTransitionStructPtr->data[3] < sTransitionStructPtr->data[5])
{
- gUnknown_02038C28[0][++sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
+ gScanlineEffectRegBuffers[0][++sTransitionStructPtr->data[3]] = (r3) | (r1 << 8);
}
}
@@ -1826,7 +1824,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func4(struct Task *task)
sub_814A1AC(sTransitionStructPtr->data, 120, 80, sTransitionStructPtr->data[4], 160, 1, 1);
do
{
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] << 8) | 0xF0;
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (sTransitionStructPtr->data[2] << 8) | 0xF0;
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
sTransitionStructPtr->data[4] -= 16;
@@ -1851,12 +1849,12 @@ static bool8 Phase2_Clockwise_BlackFade_Func5(struct Task *task)
while (1)
{
- r1 = (gUnknown_02038C28[0][sTransitionStructPtr->data[3]]) & 0xFF;
+ r1 = (gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]]) & 0xFF;
r2 = sTransitionStructPtr->data[2];
if (sTransitionStructPtr->data[5] <= 80)
r2 = 120, r1 = sTransitionStructPtr->data[2];
var4 = (r1) | (r2 << 8);
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = var4;
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = var4;
if (var != 0)
break;
var = sub_814A228(sTransitionStructPtr->data, 1, 1);
@@ -1872,7 +1870,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func5(struct Task *task)
{
while (sTransitionStructPtr->data[3] > sTransitionStructPtr->data[5])
{
- gUnknown_02038C28[0][--sTransitionStructPtr->data[3]] = (r1) | (r2 << 8);
+ gScanlineEffectRegBuffers[0][--sTransitionStructPtr->data[3]] = (r1) | (r2 << 8);
}
}
@@ -1892,7 +1890,7 @@ static bool8 Phase2_Clockwise_BlackFade_Func6(struct Task *task)
r2 = 120, r3 = sTransitionStructPtr->data[2];
if (sTransitionStructPtr->data[2] >= 120)
r2 = 0, r3 = 240;
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (r3) | (r2 << 8);
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r3) | (r2 << 8);
} while (!sub_814A228(sTransitionStructPtr->data, 1, 1));
@@ -1917,12 +1915,12 @@ static void VBlankCB_Phase2_Clockwise_BlackFade(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA != 0)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
- REG_WIN0H = gUnknown_02038C28[1][0];
- DmaSet(0, gUnknown_02038C28[1], &REG_WIN0H, 0xA2400001);
+ REG_WIN0H = gScanlineEffectRegBuffers[1][0];
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
static void Phase2Task_Ripple(u8 taskId)
@@ -1935,11 +1933,11 @@ static bool8 Phase2_Ripple_Func1(struct Task *task)
u8 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
for (i = 0; i < 160; i++)
{
- gUnknown_020393A8[i] = sTransitionStructPtr->field_16;
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_16;
}
SetVBlankCallback(VBlankCB_Phase2_Ripple);
@@ -1971,7 +1969,7 @@ static bool8 Phase2_Ripple_Func2(struct Task *task)
// todo: fix the asm
s16 var = r4 >> 8;
asm("");
- gUnknown_02038C28[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(var, r3);
}
if (++task->tData3 == 81)
@@ -1991,12 +1989,12 @@ static void VBlankCB_Phase2_Ripple(void)
{
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
}
static void HBlankCB_Phase2_Ripple(void)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG1VOFS = var;
REG_BG2VOFS = var;
REG_BG3VOFS = var;
@@ -2012,7 +2010,7 @@ static bool8 Phase2_Wave_Func1(struct Task *task)
u8 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 63;
sTransitionStructPtr->WINOUT = 0;
@@ -2021,7 +2019,7 @@ static bool8 Phase2_Wave_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 242;
+ gScanlineEffectRegBuffers[1][i] = 242;
}
SetVBlankCallback(VBlankCB_Phase2_Wave);
@@ -2037,7 +2035,7 @@ static bool8 Phase2_Wave_Func2(struct Task *task)
bool8 nextFunc;
sTransitionStructPtr->VBlank_DMA = FALSE;
- toStore = gUnknown_02038C28[0];
+ toStore = gScanlineEffectRegBuffers[0];
r5 = task->tData2;
task->tData2 += 16;
task->tData1 += 8;
@@ -2073,11 +2071,11 @@ static void VBlankCB_Phase2_Wave(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA != 0)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
- DmaSet(0, gUnknown_02038C28[1], &REG_WIN0H, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
static void Phase2Task_Sydney(u8 taskId)
@@ -2120,7 +2118,7 @@ static bool8 Phase2_Mugshot_Func1(struct Task *task)
u8 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
Mugshots_CreateOpponentPlayerSprites(task);
task->tData1 = 0;
@@ -2132,7 +2130,7 @@ static bool8 Phase2_Mugshot_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 0xF0F1;
+ gScanlineEffectRegBuffers[1][i] = 0xF0F1;
}
SetVBlankCallback(VBlankCB0_Phase2_Mugshots);
@@ -2177,7 +2175,7 @@ static bool8 Phase2_Mugshot_Func3(struct Task *task)
sTransitionStructPtr->VBlank_DMA = FALSE;
- toStore = gUnknown_02038C28[0];
+ toStore = gScanlineEffectRegBuffers[0];
r5 = task->tData1;
task->tData1 += 0x10;
@@ -2223,7 +2221,7 @@ static bool8 Phase2_Mugshot_Func4(struct Task *task)
sTransitionStructPtr->VBlank_DMA = FALSE;
- for (i = 0, toStore = gUnknown_02038C28[0]; i < 160; i++, toStore++)
+ for (i = 0, toStore = gScanlineEffectRegBuffers[0]; i < 160; i++, toStore++)
{
*toStore = 0xF0;
}
@@ -2266,8 +2264,8 @@ static bool8 Phase2_Mugshot_Func6(struct Task *task)
sTransitionStructPtr->VBlank_DMA = FALSE;
SetVBlankCallback(NULL);
DmaStop(0);
- memset(gUnknown_02038C28[0], 0, 0x140);
- memset(gUnknown_02038C28[1], 0, 0x140);
+ memset(gScanlineEffectRegBuffers[0], 0, 0x140);
+ memset(gScanlineEffectRegBuffers[1], 0, 0x140);
SetGpuReg(REG_OFFSET_WIN0H, 0xF0);
SetGpuReg(REG_OFFSET_BLDY, 0);
task->tState++;
@@ -2300,15 +2298,15 @@ static bool8 Phase2_Mugshot_Func7(struct Task *task)
{
s16 index1 = 0x50 - i;
s16 index2 = 0x50 + i;
- if (gUnknown_02038C28[0][index1] <= 15)
+ if (gScanlineEffectRegBuffers[0][index1] <= 15)
{
r6 = TRUE;
- gUnknown_02038C28[0][index1]++;
+ gScanlineEffectRegBuffers[0][index1]++;
}
- if (gUnknown_02038C28[0][index2] <= 15)
+ if (gScanlineEffectRegBuffers[0][index2] <= 15)
{
r6 = TRUE;
- gUnknown_02038C28[0][index2]++;
+ gScanlineEffectRegBuffers[0][index2]++;
}
}
}
@@ -2336,7 +2334,7 @@ static bool8 Phase2_Mugshot_Func9(struct Task *task)
sTransitionStructPtr->VBlank_DMA = FALSE;
task->tData3++;
- memset(gUnknown_02038C28[0], task->tData3, 0x140);
+ memset(gScanlineEffectRegBuffers[0], task->tData3, 0x140);
if (task->tData3 > 15)
task->tState++;
@@ -2357,12 +2355,12 @@ static void VBlankCB0_Phase2_Mugshots(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA != 0)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_BG0VOFS = sTransitionStructPtr->BG0VOFS;
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
- DmaSet(0, gUnknown_02038C28[1], &REG_WIN0H, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
static void VBlankCB1_Phase2_Mugshots(void)
@@ -2370,9 +2368,9 @@ static void VBlankCB1_Phase2_Mugshots(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA != 0)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_BLDCNT = sTransitionStructPtr->BLDCNT;
- DmaSet(0, gUnknown_02038C28[1], &REG_BLDY, 0xA2400001);
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_BLDY, 0xA2400001);
}
static void HBlankCB_Phase2_Mugshots(void)
@@ -2500,7 +2498,7 @@ static bool8 Phase2_Slice_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
task->tData2 = 256;
task->tData3 = 1;
@@ -2511,8 +2509,8 @@ static bool8 Phase2_Slice_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = sTransitionStructPtr->field_14;
- gUnknown_02038C28[1][160 + i] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[1][160 + i] = 0xF0;
}
EnableInterrupts(INTR_FLAG_HBLANK);
@@ -2541,8 +2539,8 @@ static bool8 Phase2_Slice_Func2(struct Task *task)
for (i = 0; i < 160; i++)
{
- u16 *storeLoc1 = &gUnknown_02038C28[0][i];
- u16 *storeLoc2 = &gUnknown_02038C28[0][i + 160];
+ u16 *storeLoc1 = &gScanlineEffectRegBuffers[0][i];
+ u16 *storeLoc2 = &gScanlineEffectRegBuffers[0][i + 160];
if (i & 1)
{
*storeLoc1 = sTransitionStructPtr->field_14 + task->tData1;
@@ -2578,15 +2576,15 @@ static void VBlankCB_Phase2_Slice(void)
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 640);
- DmaSet(0, &gUnknown_02038C28[1][160], &REG_WIN0H, 0xA2400001);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640);
+ DmaSet(0, &gScanlineEffectRegBuffers[1][160], &REG_WIN0H, 0xA2400001);
}
static void HBlankCB_Phase2_Slice(void)
{
if (REG_VCOUNT < 160)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG1HOFS = var;
REG_BG2HOFS = var;
REG_BG3HOFS = var;
@@ -2603,7 +2601,7 @@ static bool8 Phase2_ShredSplit_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 63;
sTransitionStructPtr->WINOUT = 0;
@@ -2611,13 +2609,13 @@ static bool8 Phase2_ShredSplit_Func1(struct Task *task)
for (i = 0; i < 0xA0; i++)
{
- gUnknown_02038C28[1][i] = sTransitionStructPtr->field_14;
- gUnknown_02038C28[1][0xA0 + i] = 0xF0;
- gUnknown_02038C28[0][i] = sTransitionStructPtr->field_14;
- gUnknown_02038C28[0][0xA0 + i] = 0xF0;
- gUnknown_02038C28[0][0x140 + i] = 0;
- gUnknown_02038C28[0][0x1E0 + i] = 0x100;
- gUnknown_02038C28[0][0x280 + i] = 1;
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[1][0xA0 + i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_14;
+ gScanlineEffectRegBuffers[0][0xA0 + i] = 0xF0;
+ gScanlineEffectRegBuffers[0][0x140 + i] = 0;
+ gScanlineEffectRegBuffers[0][0x1E0 + i] = 0x100;
+ gScanlineEffectRegBuffers[0][0x280 + i] = 1;
}
task->tData4 = 0;
@@ -2657,9 +2655,9 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
unkVar = (arr1[j]) + (arr2[k] * -(i) * 2);
if (unkVar >= 0 && (unkVar != 79 || j != 1))
{
- ptr4 = &gUnknown_02038C28[0][unkVar + 320];
- ptr3 = &gUnknown_02038C28[0][unkVar + 480];
- ptr1 = &gUnknown_02038C28[0][unkVar + 640];
+ ptr4 = &gScanlineEffectRegBuffers[0][unkVar + 320];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 480];
+ ptr1 = &gScanlineEffectRegBuffers[0][unkVar + 640];
if (*ptr4 > 0xEF)
{
*ptr4 = 0xF0;
@@ -2673,8 +2671,8 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
if (*ptr3 <= 0xFFF)
*ptr3 += *ptr1;
}
- ptr2 = &gUnknown_02038C28[0][unkVar];
- ptr3 = &gUnknown_02038C28[0][unkVar + 160];
+ ptr2 = &gScanlineEffectRegBuffers[0][unkVar];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 160];
*ptr2 = sTransitionStructPtr->field_14 + *ptr4;
*ptr3 = 0xF0 - *ptr4;
@@ -2691,9 +2689,9 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
unkVar = (arr1[j] + 1) + (arr2[k] * -(i) * 2);
if (unkVar <= 160 && (unkVar != 80 || j != 1))
{
- ptr4 = &gUnknown_02038C28[0][unkVar + 320];
- ptr3 = &gUnknown_02038C28[0][unkVar + 480];
- ptr1 = &gUnknown_02038C28[0][unkVar + 640];
+ ptr4 = &gScanlineEffectRegBuffers[0][unkVar + 320];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 480];
+ ptr1 = &gScanlineEffectRegBuffers[0][unkVar + 640];
if (*ptr4 > 0xEF)
{
*ptr4 = 0xF0;
@@ -2707,8 +2705,8 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
if (*ptr3 <= 0xFFF)
*ptr3 += *ptr1;
}
- ptr2 = &gUnknown_02038C28[0][unkVar];
- ptr3 = &gUnknown_02038C28[0][unkVar + 160];
+ ptr2 = &gScanlineEffectRegBuffers[0][unkVar];
+ ptr3 = &gScanlineEffectRegBuffers[0][unkVar + 160];
*ptr2 = sTransitionStructPtr->field_14 - *ptr4;
*ptr3 = (*ptr4 << 8) | (0xF1);
@@ -2732,7 +2730,7 @@ static bool8 Phase2_ShredSplit_Func2(struct Task *task)
// This function never increments the state counter, because the loop condition
// is always false, resulting in the game being stuck in an infinite loop.
-// It's possible this transition is only partially
+// It's possible this transition is only partially
// done and the second part was left out.
static bool8 Phase2_ShredSplit_Func3(struct Task *task)
{
@@ -2742,7 +2740,7 @@ static bool8 Phase2_ShredSplit_Func3(struct Task *task)
for (i = 0; i < 0xA0; i++)
{
- if (gUnknown_02038C28[1][i] != 0xF0 && gUnknown_02038C28[1][i] != checkVar2)
+ if (gScanlineEffectRegBuffers[1][i] != 0xF0 && gScanlineEffectRegBuffers[1][i] != checkVar2)
done = FALSE; // a break statement should be put here
}
@@ -2775,7 +2773,7 @@ static bool8 Phase2_Blackhole_Func1(struct Task *task)
s32 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 0;
sTransitionStructPtr->WINOUT = 63;
@@ -2784,7 +2782,7 @@ static bool8 Phase2_Blackhole_Func1(struct Task *task)
for (i = 0; i < 0xA0; i++)
{
- gUnknown_02038C28[1][i] = 0;
+ gScanlineEffectRegBuffers[1][i] = 0;
}
SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
@@ -2814,7 +2812,7 @@ static bool8 Phase2_Blackhole1_Func3(struct Task *task)
task->tData1 += (task->tData2 >> 8);
if (task->tData1 > 0xA0)
task->tData1 = 0xA0;
- sub_814A014(gUnknown_02038C28[0], 0x78, 0x50, task->tData1);
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
if (task->tData1 == 0xA0)
{
task->tFuncState = 1;
@@ -2840,7 +2838,7 @@ static bool8 Phase2_Blackhole1_Func2(struct Task *task)
}
task->tData1 += gUnknown_085C8C80[task->tData6];
task->tData6 = (task->tData6 + 1) % 2;
- sub_814A014(gUnknown_02038C28[0], 0x78, 0x50, task->tData1);
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
if (task->tData1 < 9)
{
task->tState++;
@@ -2866,7 +2864,7 @@ static bool8 Phase2_Blackhole2_Func2(struct Task *task)
if (task->tData1 > 0xA0)
task->tData1 = 0xA0;
- sub_814A014(gUnknown_02038C28[0], 0x78, 0x50, task->tData1);
+ sub_814A014(gScanlineEffectRegBuffers[0], 0x78, 0x50, task->tData1);
if (task->tData1 == 0xA0)
{
DmaStop(0);
@@ -3113,7 +3111,7 @@ static bool8 Phase2_Rayquaza_Func3(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
SetGpuReg(REG_OFFSET_BG0CNT, 0x9A08);
sub_8149F58(&dst1, &dst2);
@@ -3126,8 +3124,8 @@ static bool8 Phase2_Rayquaza_Func3(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[0][i] = 0;
- gUnknown_02038C28[1][i] = 0x100;
+ gScanlineEffectRegBuffers[0][i] = 0;
+ gScanlineEffectRegBuffers[1][i] = 0x100;
}
SetVBlankCallback(VBlankCB_Phase2_Rayquaza);
@@ -3212,7 +3210,7 @@ static bool8 Phase2_Rayquaza_Func9(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 0;
+ gScanlineEffectRegBuffers[1][i] = 0;
}
SetVBlankCallback(VBlankCB1_Phase2_BigPokeball);
@@ -3233,11 +3231,11 @@ static void VBlankCB_Phase2_Rayquaza(void)
VBlankCB_BattleTransition();
if (sTransitionStructPtr->field_20 == 0)
- dmaSrc = gUnknown_02038C28[0];
+ dmaSrc = gScanlineEffectRegBuffers[0];
else if (sTransitionStructPtr->field_20 == 1)
- dmaSrc = gUnknown_02038C28[1];
+ dmaSrc = gScanlineEffectRegBuffers[1];
else
- dmaSrc = gUnknown_02038C28[0];
+ dmaSrc = gScanlineEffectRegBuffers[0];
DmaSet(0, dmaSrc, &REG_BG0VOFS, 0xA2400001);
}
@@ -3252,7 +3250,7 @@ static bool8 Phase2_WhiteFade_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->BLDCNT = 0xBF;
sTransitionStructPtr->BLDY = 0;
@@ -3262,8 +3260,8 @@ static bool8 Phase2_WhiteFade_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = 0;
- gUnknown_02038C28[1][i + 160] = 0xF0;
+ gScanlineEffectRegBuffers[1][i] = 0;
+ gScanlineEffectRegBuffers[1][i + 160] = 0xF0;
}
EnableInterrupts(INTR_FLAG_HBLANK);
@@ -3343,8 +3341,8 @@ static void VBlankCB0_Phase2_WhiteFade(void)
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 640);
- DmaSet(0, &gUnknown_02038C28[1][160], &REG_WIN0H, 0xA2400001);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 640);
+ DmaSet(0, &gScanlineEffectRegBuffers[1][160], &REG_WIN0H, 0xA2400001);
}
static void VBlankCB1_Phase2_WhiteFade(void)
@@ -3360,7 +3358,7 @@ static void VBlankCB1_Phase2_WhiteFade(void)
static void HBlankCB_Phase2_WhiteFade(void)
{
- REG_BLDY = gUnknown_02038C28[1][REG_VCOUNT];
+ REG_BLDY = gScanlineEffectRegBuffers[1][REG_VCOUNT];
}
static void sub_8149864(struct Sprite *sprite)
@@ -3374,8 +3372,8 @@ static void sub_8149864(struct Sprite *sprite)
else
{
u16 i;
- u16* ptr1 = &gUnknown_02038C28[0][sprite->pos1.y];
- u16* ptr2 = &gUnknown_02038C28[0][sprite->pos1.y + 160];
+ u16* ptr1 = &gScanlineEffectRegBuffers[0][sprite->pos1.y];
+ u16* ptr2 = &gScanlineEffectRegBuffers[0][sprite->pos1.y + 160];
for (i = 0; i < 20; i++)
{
ptr1[i] = sprite->data[0] >> 8;
@@ -3465,7 +3463,7 @@ static bool8 Phase2_Shards_Func1(struct Task *task)
u16 i;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sTransitionStructPtr->WININ = 0x3F;
sTransitionStructPtr->WINOUT = 0;
@@ -3473,10 +3471,10 @@ static bool8 Phase2_Shards_Func1(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[0][i] = 0xF0;
+ gScanlineEffectRegBuffers[0][i] = 0xF0;
}
- CpuSet(gUnknown_02038C28[0], gUnknown_02038C28[1], 0xA0);
+ CpuSet(gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 0xA0);
SetVBlankCallback(VBlankCB_Phase2_Shards);
task->tState++;
@@ -3505,8 +3503,8 @@ static bool8 Phase2_Shards_Func3(struct Task *task)
for (i = 0, nextFunc = FALSE; i < 16; i++)
{
- s16 r3 = gUnknown_02038C28[0][sTransitionStructPtr->data[3]] >> 8;
- s16 r4 = gUnknown_02038C28[0][sTransitionStructPtr->data[3]] & 0xFF;
+ s16 r3 = gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] >> 8;
+ s16 r4 = gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] & 0xFF;
if (task->tData2 == 0)
{
if (r3 < sTransitionStructPtr->data[2])
@@ -3521,7 +3519,7 @@ static bool8 Phase2_Shards_Func3(struct Task *task)
if (r4 <= r3)
r4 = r3;
}
- gUnknown_02038C28[0][sTransitionStructPtr->data[3]] = (r4) | (r3 << 8);
+ gScanlineEffectRegBuffers[0][sTransitionStructPtr->data[3]] = (r4) | (r3 << 8);
if (nextFunc)
{
task->tState++;
@@ -3568,12 +3566,12 @@ static void VBlankCB_Phase2_Shards(void)
DmaStop(0);
VBlankCB_BattleTransition();
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
REG_WININ = sTransitionStructPtr->WININ;
REG_WINOUT = sTransitionStructPtr->WINOUT;
REG_WIN0V = sTransitionStructPtr->WIN0V;
- REG_WIN0H = gUnknown_02038C28[1][0];
- DmaSet(0, gUnknown_02038C28[1], &REG_WIN0H, 0xA2400001);
+ REG_WIN0H = gScanlineEffectRegBuffers[1][0];
+ DmaSet(0, gScanlineEffectRegBuffers[1], &REG_WIN0H, 0xA2400001);
}
// sub-task for phase2
@@ -3875,7 +3873,7 @@ static bool8 Phase2_29_Func2(struct Task *task)
sub_8149F58(&dst1, &dst2);
LZ77UnCompVram(gUnknown_085C828C, dst1);
- sub_8149F98(gUnknown_02038C28[0], 0, task->tData4, 0x84, task->tData5, 160);
+ sub_8149F98(gScanlineEffectRegBuffers[0], 0, task->tData4, 0x84, task->tData5, 160);
task->tState++;
return TRUE;
@@ -3896,7 +3894,7 @@ static bool8 Phase2_30_Func1(struct Task *task)
u16 *dst1, *dst2;
sub_8149F08();
- dp12_8087EA4();
+ ScanlineEffect_Clear();
ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON);
task->tData2 = 0x2000;
task->tData1 = 0x7FFF;
@@ -3934,7 +3932,7 @@ static bool8 Phase2_30_Func3(struct Task *task)
for (i = 0; i < 160; i++)
{
- gUnknown_02038C28[1][i] = sTransitionStructPtr->field_16;
+ gScanlineEffectRegBuffers[1][i] = sTransitionStructPtr->field_16;
}
SetVBlankCallback(VBlankCB_Phase2_30);
@@ -3980,7 +3978,7 @@ static bool8 Phase2_30_Func4(struct Task *task)
{
s16 index = var6 / 256;
asm("");
- gUnknown_02038C28[0][i] = sTransitionStructPtr->field_16 + Sin(index, amplitude);
+ gScanlineEffectRegBuffers[0][i] = sTransitionStructPtr->field_16 + Sin(index, amplitude);
}
if (++task->tData3 == 101)
@@ -4004,12 +4002,12 @@ static void VBlankCB_Phase2_30(void)
REG_BLDALPHA = sTransitionStructPtr->BLDALPHA;
if (sTransitionStructPtr->VBlank_DMA)
- DmaCopy16(3, gUnknown_02038C28[0], gUnknown_02038C28[1], 320);
+ DmaCopy16(3, gScanlineEffectRegBuffers[0], gScanlineEffectRegBuffers[1], 320);
}
static void HBlankCB_Phase2_30(void)
{
- u16 var = gUnknown_02038C28[1][REG_VCOUNT];
+ u16 var = gScanlineEffectRegBuffers[1][REG_VCOUNT];
REG_BG0VOFS = var;
}
diff --git a/src/berry_fix_program.c b/src/berry_fix_program.c
index f487489d4..7b968a221 100644
--- a/src/berry_fix_program.c
+++ b/src/berry_fix_program.c
@@ -6,7 +6,7 @@
#include "main.h"
#include "sprite.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "window.h"
#include "text.h"
#include "menu.h"
diff --git a/src/coord_event_weather.c b/src/coord_event_weather.c
new file mode 100644
index 000000000..60b87fa30
--- /dev/null
+++ b/src/coord_event_weather.c
@@ -0,0 +1,119 @@
+#include "global.h"
+#include "constants/weather.h"
+#include "coord_event_weather.h"
+#include "field_weather.h"
+
+struct CoordEventWeather
+{
+ u8 coordEventWeather;
+ void (*func)(void);
+};
+
+static void CoordEventWeather_Clouds(void);
+static void CoordEventWeather_Sunny(void);
+static void CoordEventWeather_LightRain(void);
+static void CoordEventWeather_Snow(void);
+static void CoordEventWeather_Thunderstorm(void);
+static void CoordEventWeather_Fog(void);
+static void CoordEventWeather_DiagonalFog(void);
+static void CoordEventWeather_Ash(void);
+static void CoordEventWeather_Sandstorm(void);
+static void CoordEventWeather_Dark(void);
+static void CoordEventWeather_Drought(void);
+static void CoordEventWeather_Route119Cycle(void);
+static void CoordEventWeather_Route123Cycle(void);
+
+static const struct CoordEventWeather sCoordEventWeatherFuncs[] =
+{
+ { COORD_EVENT_WEATHER_CLOUDS, CoordEventWeather_Clouds },
+ { COORD_EVENT_WEATHER_SUNNY, CoordEventWeather_Sunny },
+ { COORD_EVENT_WEATHER_RAIN_LIGHT, CoordEventWeather_LightRain },
+ { COORD_EVENT_WEATHER_SNOW, CoordEventWeather_Snow },
+ { COORD_EVENT_WEATHER_RAIN_MED, CoordEventWeather_Thunderstorm },
+ { COORD_EVENT_WEATHER_FOG_1, CoordEventWeather_Fog },
+ { COORD_EVENT_WEATHER_FOG_2, CoordEventWeather_DiagonalFog },
+ { COORD_EVENT_WEATHER_ASH, CoordEventWeather_Ash },
+ { COORD_EVENT_WEATHER_SANDSTORM, CoordEventWeather_Sandstorm },
+ { COORD_EVENT_WEATHER_SHADE, CoordEventWeather_Dark },
+ { COORD_EVENT_WEATHER_DROUGHT, CoordEventWeather_Drought },
+ { COORD_EVENT_WEATHER_ROUTE119_CYCLE, CoordEventWeather_Route119Cycle },
+ { COORD_EVENT_WEATHER_ROUTE123_CYCLE, CoordEventWeather_Route123Cycle },
+};
+
+static void CoordEventWeather_Clouds(void)
+{
+ SetWeather(WEATHER_CLOUDS);
+}
+
+static void CoordEventWeather_Sunny(void)
+{
+ SetWeather(WEATHER_SUNNY);
+}
+
+static void CoordEventWeather_LightRain(void)
+{
+ SetWeather(WEATHER_RAIN_LIGHT);
+}
+
+static void CoordEventWeather_Snow(void)
+{
+ SetWeather(WEATHER_SNOW);
+}
+
+static void CoordEventWeather_Thunderstorm(void)
+{
+ SetWeather(WEATHER_RAIN_MED);
+}
+
+static void CoordEventWeather_Fog(void)
+{
+ SetWeather(WEATHER_FOG_1);
+}
+
+static void CoordEventWeather_DiagonalFog(void)
+{
+ SetWeather(WEATHER_FOG_2);
+}
+
+static void CoordEventWeather_Ash(void)
+{
+ SetWeather(WEATHER_ASH);
+}
+
+static void CoordEventWeather_Sandstorm(void)
+{
+ SetWeather(WEATHER_SANDSTORM);
+}
+
+static void CoordEventWeather_Dark(void)
+{
+ SetWeather(WEATHER_SHADE);
+}
+
+static void CoordEventWeather_Drought(void)
+{
+ SetWeather(WEATHER_DROUGHT);
+}
+
+static void CoordEventWeather_Route119Cycle(void)
+{
+ SetWeather(WEATHER_ROUTE119_CYCLE);
+}
+
+static void CoordEventWeather_Route123Cycle(void)
+{
+ SetWeather(WEATHER_ROUTE123_CYCLE);
+}
+
+void DoCoordEventWeather(u8 coordEventWeather)
+{
+ u8 i;
+ for (i = 0; i < ARRAY_COUNT(sCoordEventWeatherFuncs); i++)
+ {
+ if (sCoordEventWeatherFuncs[i].coordEventWeather == coordEventWeather)
+ {
+ sCoordEventWeatherFuncs[i].func();
+ return;
+ }
+ }
+}
diff --git a/src/decoration.c b/src/decoration.c
index a9777c86f..68a455285 100644
--- a/src/decoration.c
+++ b/src/decoration.c
@@ -529,7 +529,7 @@ void SecretBasePC_PutAway(u8 taskId)
{
sub_8126A58(0);
sub_8197434(0, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8129ABC;
}
@@ -1247,7 +1247,7 @@ void sub_8127F68(u8 taskId)
{
if (sub_8127F38() == TRUE)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_8128060;
}
@@ -1661,7 +1661,7 @@ void sub_8128BA0(u8 taskId)
void sub_8128BBC(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = c1_overworld_prev_quest;
}
@@ -2635,7 +2635,7 @@ void sub_812A1A0(u8 taskId)
void sub_812A1C0(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_81298EC;
}
@@ -2654,7 +2654,7 @@ void sub_812A210(u8 taskId)
void sub_812A22C(u8 taskId)
{
- fade_screen(1, 0);
+ FadeScreen(1, 0);
gTasks[taskId].data[2] = 0;
gTasks[taskId].func = sub_812A25C;
}
diff --git a/src/diploma.c b/src/diploma.c
index 24e5e9727..89447c5ba 100644
--- a/src/diploma.c
+++ b/src/diploma.c
@@ -3,7 +3,7 @@
#include "palette.h"
#include "main.h"
#include "gpu_regs.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "task.h"
#include "malloc.h"
#include "decompress.h"
diff --git a/src/egg_hatch.c b/src/egg_hatch.c
index 435886638..e8f22e903 100644
--- a/src/egg_hatch.c
+++ b/src/egg_hatch.c
@@ -61,7 +61,7 @@ extern u8 sav1_map_get_name(void);
extern s8 ProcessMenuInputNoWrap_(void);
extern void TVShowConvertInternationalString(u8* str1, u8* str2, u8);
extern void sub_806A068(u16, u8);
-extern void fade_screen(u8, u8);
+extern void FadeScreen(u8, u8);
extern void overworld_free_bg_tilemaps(void);
extern void sub_80AF168(void);
extern void AllocateMonSpritesGfx(void);
@@ -465,7 +465,7 @@ void EggHatch(void)
{
ScriptContext2_Enable();
CreateTask(Task_EggHatch, 10);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
static void Task_EggHatch(u8 taskID)
diff --git a/src/evolution_scene.c b/src/evolution_scene.c
index 5dfc36cb2..cbd37be52 100644
--- a/src/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -11,7 +11,7 @@
#include "pokemon.h"
#include "string_util.h"
#include "battle.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "decompress.h"
#include "m4a.h"
#include "menu.h"
@@ -1367,7 +1367,7 @@ static void VBlankCB_EvolutionScene(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
static void VBlankCB_TradeEvolutionScene(void)
@@ -1384,7 +1384,7 @@ static void VBlankCB_TradeEvolutionScene(void)
LoadOam();
ProcessSpriteCopyRequests();
TransferPlttBuffer();
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
static void sub_813FDEC(u8 taskId)
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index d002f210f..e7caf9316 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -20,7 +20,7 @@
#include "string_util.h"
#include "m4a.h"
#include "international_string_util.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "trig.h"
#include "random.h"
#include "event_data.h"
diff --git a/src/item_use.c b/src/item_use.c
new file mode 100755
index 000000000..4c7276bb8
--- /dev/null
+++ b/src/item_use.c
@@ -0,0 +1,1271 @@
+#include "global.h"
+#include "battle.h"
+#include "berry.h"
+#include "bike.h"
+#include "coins.h"
+#include "constants/flags.h"
+#include "constants/items.h"
+#include "constants/songs.h"
+#include "constants/vars.h"
+#include "data2.h"
+#include "event_data.h"
+#include "fieldmap.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "field_screen.h"
+#include "field_weather.h"
+#include "item.h"
+#include "map_obj_8097404.h"
+#include "mail.h"
+#include "metatile_behavior.h"
+#include "overworld.h"
+#include "palette.h"
+#include "pokemon.h"
+#include "rom_818CFC8.h"
+#include "script.h"
+#include "sound.h"
+#include "string_util.h"
+#include "task.h"
+#include "text.h"
+
+extern u16 gSpecialVar_ItemId;
+extern void(**gUnknown_0203CE54)(void);
+extern void(**gUnknown_0203CF2C)(void);
+extern void(*gUnknown_0203A0F4)(u8 taskId);
+extern void(*gUnknown_085920D8[])(void);
+extern void (*gUnknown_03006328)(u8, u16, TaskFunc);
+extern void unknown_ItemMenu_Confirm(u8 taskId);
+extern void sub_81C5B14(u8 taskId);
+extern u8 gText_DadsAdvice[];
+extern u8 gText_CantDismountBike[];
+extern void sub_8197434(u8 a, u8 b);
+extern void sub_80984F4(void);
+extern void ItemUseOutOfBattle_TMHM(u8 a);
+extern void ItemUseOutOfBattle_EvolutionStone(u8 b);
+extern void bag_menu_mail_related(void);
+extern void OpenPokeblockCase(u8 a, void(*b)(void));
+extern void overworld_free_bg_tilemaps(void);
+extern bool32 sav1_map_is_biking_allowed(void);
+extern bool8 IsPlayerFacingSurfableFishableWater(void);
+extern bool8 sub_81221AC(void);
+extern u8 gText_ItemFinderNothing[];
+extern u8 gText_ItemFinderNearby[];
+extern u8 gText_ItemFinderOnTop[];
+extern u8 gText_CoinCase[];
+extern u8 gText_PowderQty[];
+extern u8 gUnknown_085920E4[];
+extern u8 Route102_EventScript_274482[];
+extern u8 Route102_EventScript_2744C0[];
+extern u8 BattleFrontier_OutsideEast_EventScript_242CFC[];
+extern u8 gText_BootedUpHM[];
+extern u8 gText_BootedUpTM[];
+extern u8 gText_TMHMContainedVar1[];
+extern u8 gText_PlayerUsedVar2[];
+extern u8 gText_RepelEffectsLingered[];
+extern u8 gText_UsedVar2WildLured[];
+extern u8 gText_UsedVar2WildRepelled[];
+extern u8 gText_BoxFull[];
+extern u8 gText_WontHaveEffect[];
+extern int sub_80247BC(void);
+extern struct MapHeader* mapconnection_get_mapheader(struct MapConnection *connection);
+extern void SetUpItemUseCallback(u8 taskId);
+extern void ItemUseCB_Medicine(u8, u16, TaskFunc);
+extern void sub_81B67C8(u8, u16, TaskFunc);
+extern void sub_81B79E8(u8, u16, TaskFunc);
+extern void dp05_ether(u8, u16, TaskFunc);
+extern void dp05_pp_up(u8, u16, TaskFunc);
+extern void dp05_rare_candy(u8, u16, TaskFunc);
+extern void sub_81B6DC4(u8, u16, TaskFunc);
+extern void sub_81B7C74(u8, u16, TaskFunc);
+extern u16 ItemIdToBattleMoveId(u16);
+extern void bag_menu_yes_no(u8, u8, void(**)(u8 taskId));
+extern void (*gUnknown_085920E8[])(u8 taskId);
+extern void sub_81C5924(void);
+extern void sub_81C59BC(void);
+extern void sub_81AB9A8(u8);
+extern void sub_81ABA88(u8);
+extern void sub_80B7CC8(void);
+extern void flagmods_08054D70(void);
+extern u8* sub_806CF78(u16);
+extern bool8 ExecuteTableBasedItemEffect_(struct Pokemon*, u16, u8, u8);
+extern u8 gBankInMenu;
+extern u16 gBattlePartyID[];
+extern void sub_81B89F0(void);
+extern u8 GetItemEffectType(u16);
+
+void MapPostLoadHook_UseItem(void);
+extern void sub_80AF6D4(void);
+void Task_CallItemUseOnFieldCallback(u8 taskId);
+void bag_menu_inits_lists_menu(u8 taskId);
+void ItemUseOnFieldCB_Bike(u8 taskId);
+void ItemUseOnFieldCB_Rod(u8 taskId);
+void ItemUseOnFieldCB_Itemfinder(u8 taskId);
+void sub_80FD504(u8 taskId);
+void sub_80FD5CC(u8 taskId);
+void sub_80FDA94(u8 taskId);
+void sub_80FDADC(u8 taskId);
+void sub_80FD7C8(u8 taskId);
+void sub_80FDC00(u8 taskId);
+void sub_80FDD74(u8 taskId);
+void sub_80FDE08(u8 taskId);
+void sub_80FDE7C(u8 taskId);
+void sub_80FDF90(u8 taskId);
+void task08_0809AD8C(u8 taskId);
+void sub_80FE024(u8 taskId);
+void sub_80FE124(u8 taskId);
+void sub_80FE164(u8 taskId);
+
+void DisplayItemMessage(u8 taskId, u8 a, u8* str, void(*callback)(u8 taskId));
+void DisplayItemMessageInBattlePyramid(u8 taskId, u8* str, void(*callback)(u8 taskId));
+void DisplayItemMessageOnField(u8 taskId, u8* str, void(*callback)(u8 taskId));
+void sub_81C6714(u8 taskId);
+void CleanUpAfterFailingToUseRegisteredKeyItemOnField(u8 taskId);
+void StartFishing(u8 a);
+bool8 ItemfinderCheckForHiddenItems(struct MapEvents *, u8);
+u8 sub_80FD9B0(s16 a, s16 b);
+void sub_80FDA24(u8 a);
+void sub_80FD8E0(u8 taskId, s16 x, s16 y);
+void sub_80FDBEC(void);
+bool8 sub_80FDE2C(void);
+void ItemUseOutOfBattle_CannotUse(u8 taskId);
+
+void SetUpItemUseCallback(u8 taskId)
+{
+ u8 type;
+ if (gSpecialVar_ItemId == ITEM_ENIGMA_BERRY)
+ type = gTasks[taskId].data[4] - 1;
+ else
+ type = ItemId_GetType(gSpecialVar_ItemId) - 1;
+ if (!InBattlePyramid())
+ {
+ *gUnknown_0203CE54 = gUnknown_085920D8[type];
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ *gUnknown_0203CF2C = gUnknown_085920D8[type];
+ sub_81C5B14(taskId);
+ }
+}
+
+void SetUpItemUseOnFieldCallback(u8 taskId)
+{
+ if (gTasks[taskId].data[3] != 1)
+ {
+ gFieldCallback = MapPostLoadHook_UseItem;
+ SetUpItemUseCallback(taskId);
+ }
+ else
+ gUnknown_0203A0F4(taskId);
+}
+
+void MapPostLoadHook_UseItem(void)
+{
+ pal_fill_black();
+ CreateTask(Task_CallItemUseOnFieldCallback, 8);
+}
+
+void Task_CallItemUseOnFieldCallback(u8 taskId)
+{
+ if (sub_80ABDFC() == 1)
+ gUnknown_0203A0F4(taskId);
+}
+
+void DisplayCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField, const u8 *str)
+{
+ StringExpandPlaceholders(gStringVar4, str);
+ if (!isUsingRegisteredKeyItemOnField)
+ {
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_DadsAdvice, sub_81C6714);
+ }
+ else
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+}
+
+void DisplayDadsAdviceCannotUseItemMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField)
+{
+ DisplayCannotUseItemMessage(taskId, isUsingRegisteredKeyItemOnField, gText_DadsAdvice);
+}
+
+void DisplayCannotDismountBikeMessage(u8 taskId, bool8 isUsingRegisteredKeyItemOnField)
+{
+ DisplayCannotUseItemMessage(taskId, isUsingRegisteredKeyItemOnField, gText_CantDismountBike);
+}
+
+void CleanUpAfterFailingToUseRegisteredKeyItemOnField(u8 taskId)
+{
+ sub_8197434(0, 1);
+ DestroyTask(taskId);
+ sub_80984F4();
+ ScriptContext2_Disable();
+}
+
+u8 CheckIfItemIsTMHMOrEvolutionStone(u16 itemId)
+{
+ if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_TMHM)
+ return 1;
+ else if (ItemId_GetFieldFunc(itemId) == ItemUseOutOfBattle_EvolutionStone)
+ return 2;
+ else
+ return 0;
+}
+
+void sub_80FD254()
+{
+ struct MailStruct mail;
+ mail.itemId = gSpecialVar_ItemId;
+ ReadMail(&mail, bag_menu_mail_related, 0);
+}
+
+void ItemUseOutOfBattle_Mail(u8 taskId)
+{
+ *gUnknown_0203CE54 = sub_80FD254;
+ unknown_ItemMenu_Confirm(taskId);
+}
+
+void ItemUseOutOfBattle_Bike(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+ s16 coordsY;
+ s16 coordsX;
+ u8 behavior;
+ PlayerGetDestCoords(&coordsX, &coordsY);
+ behavior = MapGridGetMetatileBehaviorAt(coordsX, coordsY);
+ if (FlagGet(FLAG_SYS_CYCLING_ROAD) == TRUE || MetatileBehavior_IsVerticalRail(behavior) == TRUE || MetatileBehavior_IsHorizontalRail(behavior) == TRUE || MetatileBehavior_IsIsolatedVerticalRail(behavior) == TRUE || MetatileBehavior_IsIsolatedHorizontalRail(behavior) == TRUE)
+ DisplayCannotDismountBikeMessage(taskId, data[3]);
+ else
+ {
+ if (sav1_map_is_biking_allowed() == TRUE && IsBikingDisallowedByPlayer() == 0)
+ {
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Bike;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ DisplayDadsAdviceCannotUseItemMessage(taskId, data[3]);
+ }
+}
+
+void ItemUseOnFieldCB_Bike(u8 taskId)
+{
+ if (!ItemId_GetSecondaryId(gSpecialVar_ItemId))
+ GetOnOffBike(2);
+ else
+ GetOnOffBike(4);
+ sub_80984F4();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+}
+
+bool32 CanFish()
+{
+ s16 x, y;
+ u16 tileBehavior;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ tileBehavior = MapGridGetMetatileBehaviorAt(x, y);
+
+ if (MetatileBehavior_IsWaterfall(tileBehavior))
+ return FALSE;
+
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_4))
+ return FALSE;
+
+ if (!TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_SURFING))
+ {
+ if (IsPlayerFacingSurfableFishableWater())
+ return TRUE;
+ }
+ else
+ {
+ if (MetatileBehavior_IsSurfableWaterOrUnderwater(tileBehavior) && !MapGridIsImpassableAt(x, y))
+ return TRUE;
+ if (MetatileBehavior_8089510(tileBehavior) == TRUE)
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void ItemUseOutOfBattle_Rod(u8 taskId)
+{
+ if (CanFish() == TRUE)
+ {
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Rod;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+}
+
+void ItemUseOnFieldCB_Rod(u8 taskId)
+{
+ StartFishing(ItemId_GetSecondaryId(gSpecialVar_ItemId));
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_Itemfinder(u8 var)
+{
+ IncrementGameStat(0x27);
+ gUnknown_0203A0F4 = ItemUseOnFieldCB_Itemfinder;
+ SetUpItemUseOnFieldCallback(var);
+}
+
+void ItemUseOnFieldCB_Itemfinder(u8 taskId)
+{
+ if (ItemfinderCheckForHiddenItems(gMapHeader.events, taskId) == TRUE)
+ gTasks[taskId].func = sub_80FD504;
+ else
+ DisplayItemMessageOnField(taskId, gText_ItemFinderNothing, sub_80FD5CC);
+}
+
+void sub_80FD504(u8 taskId)
+{
+ u8 playerDir;
+ u8 playerDirToItem;
+ u8 i;
+ s16* data = gTasks[taskId].data;
+ if (!data[3])
+ {
+ if (data[4] == 4)
+ {
+ playerDirToItem = sub_80FD9B0(data[0], data[1]);
+ if (playerDirToItem)
+ {
+ sub_80FDA24(gUnknown_085920E4[playerDirToItem - 1]);
+ gTasks[taskId].func = sub_80FDA94;
+ }
+ else
+ {
+ playerDir = player_get_direction_lower_nybble();
+ for (i = 0; i < 4; i++)
+ {
+ if (playerDir == gUnknown_085920E4[i])
+ data[5] = (i + 1) & 3;
+ }
+ gTasks[taskId].func = sub_80FDADC;
+ data[3] = 0;
+ data[2] = 0;
+ }
+ return;
+ }
+ PlaySE(SE_DAUGI);
+ data[4]++;
+ }
+ data[3] = (data[3] + 1) & 0x1F;
+}
+
+void sub_80FD5CC(u8 taskId)
+{
+ sub_8197434(0, 1);
+ sub_80984F4();
+ ScriptContext2_Disable();
+ DestroyTask(taskId);
+}
+
+bool8 ItemfinderCheckForHiddenItems(struct MapEvents *events, u8 taskId)
+{
+ int distanceX, distanceY;
+ s16 x, y, i, newDistanceX, newDistanceY;
+ PlayerGetDestCoords(&x, &y);
+ gTasks[taskId].data[2] = FALSE;
+ for (i = 0; i < events->bgEventCount; i++)
+ {
+ if (events->bgEvents[i].kind == 7 && !FlagGet(events->bgEvents[i].bgUnion.hiddenItem.hiddenItemId + 0x1F4))
+ {
+ distanceX = (u16)events->bgEvents[i].x + 7;
+ newDistanceX = distanceX - x;
+ distanceY = (u16)events->bgEvents[i].y + 7;
+ newDistanceY = distanceY - y;
+
+ if ((u16)(newDistanceX + 7) < 15 && (newDistanceY >= -5) && (newDistanceY < 6))
+ sub_80FD8E0(taskId, newDistanceX, newDistanceY);
+ }
+ }
+
+ sub_80FD7C8(taskId);
+ if (gTasks[taskId].data[2] == TRUE)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+bool8 sub_80FD6D4(struct MapEvents *events, s16 x, s16 y)
+{
+ u8 bgEventCount = events->bgEventCount;
+ struct BgEvent *bgEvent = events->bgEvents;
+ int i;
+
+ for (i = 0; i < bgEventCount; i++)
+ {
+ if (bgEvent[i].kind == 7 && x == (u16)bgEvent[i].x && y == (u16)bgEvent[i].y) // hidden item and coordinates matches x and y passed?
+ {
+ if (!FlagGet(bgEvent[i].bgUnion.hiddenItem.hiddenItemId + 0x1F4))
+ return TRUE;
+ else
+ return FALSE;
+ }
+ }
+ return FALSE;
+}
+
+bool8 sub_80FD730(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 sub_80FD6D4
+ 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 sub_80FD6D4(mapHeader->events, localX, localY);
+}
+
+// weird math
+#ifdef NONMATCHING
+void sub_80FD7C8(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_8088A8C(curX, curY);
+ if (conn && sub_80FD730(conn, curX, curY) == TRUE)
+ sub_80FD8E0(taskId, curX - x, curY - y);
+ }
+ }
+ }
+}
+#else
+__attribute__((naked))
+void sub_80FD7C8(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, =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 _080FD8CC\n\
+_080FD816:\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 _080FD8B6\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\
+_080FD83E:\n\
+ ldr r3, [sp, 0x10]\n\
+ cmp r3, r9\n\
+ bgt _080FD860\n\
+ ldr r5, [sp, 0x8]\n\
+ lsls r0, r5, 16\n\
+ asrs r0, 16\n\
+ cmp r9, r0\n\
+ bge _080FD860\n\
+ asrs r1, r2, 16\n\
+ cmp r10, r1\n\
+ bgt _080FD860\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 _080FD89E\n\
+_080FD860:\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_8088A8C\n\
+ adds r7, r4, 0\n\
+ cmp r0, 0\n\
+ beq _080FD89E\n\
+ adds r1, r5, 0\n\
+ adds r2, r6, 0\n\
+ bl sub_80FD730\n\
+ lsls r0, 24\n\
+ lsrs r0, 24\n\
+ cmp r0, 0x1\n\
+ bne _080FD89E\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_80FD8E0\n\
+_080FD89E:\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 _080FD83E\n\
+_080FD8B6:\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 _080FD816\n\
+_080FD8CC:\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\
+ .pool\n\
+ .syntax divided\n");
+}
+#endif
+
+void sub_80FD8E0(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 sub_80FD9B0(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 sub_80FDA24(u8 direction)
+{
+ FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ FieldObjectClearAnim(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ npc_sync_anim_pause_bits(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]);
+ PlayerTurnInPlace(direction);
+}
+
+void sub_80FDA94(u8 taskId)
+{
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE)
+ DisplayItemMessageOnField(taskId, gText_ItemFinderNearby, sub_80FD5CC);
+}
+
+void sub_80FDADC(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(&gMapObjects[GetFieldObjectIdByLocalIdAndMap(0xFF, 0, 0)]) == TRUE
+ || data[2] == FALSE)
+ {
+ sub_80FDA24(gUnknown_085920E4[data[5]]);
+ data[2] = 1;
+ data[5] = (data[5] + 1) & 3;
+ data[3]++;
+
+ if (data[3] == 4)
+ DisplayItemMessageOnField(taskId, gText_ItemFinderOnTop, sub_80FD5CC);
+ }
+}
+
+void ItemUseOutOfBattle_PokeblockCase(u8 taskId)
+{
+ if (sub_81221AC() == TRUE)
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+ else if (gTasks[taskId].data[3] != TRUE)
+ {
+ *gUnknown_0203CE54 = sub_80FDBEC;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ gFieldCallback = sub_80AF6D4;
+ FadeScreen(1, 0);
+ gTasks[taskId].func = sub_80FDC00;
+ }
+}
+
+void sub_80FDBEC(void)
+{
+ OpenPokeblockCase(0, bag_menu_mail_related);
+}
+
+void sub_80FDC00(u8 taskId)
+{
+ if (!gPaletteFade.active)
+ {
+ overworld_free_bg_tilemaps();
+ OpenPokeblockCase(0, c2_exit_to_overworld_2_switch);
+ DestroyTask(taskId);
+ }
+}
+
+void ItemUseOutOfBattle_CoinCase(u8 taskId)
+{
+ ConvertIntToDecimalStringN(gStringVar1, GetCoins(), 0, 4);
+ StringExpandPlaceholders(gStringVar4, gText_CoinCase);
+
+ if (!gTasks[taskId].data[3])
+ {
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+ }
+}
+
+void ItemUseOutOfBattle_PowderJar(u8 taskId)
+{
+ ConvertIntToDecimalStringN(gStringVar1, sub_80247BC(), 0, 5);
+ StringExpandPlaceholders(gStringVar4, gText_PowderQty);
+
+ if (!gTasks[taskId].data[3])
+ {
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ }
+ else
+ {
+ DisplayItemMessageOnField(taskId, gStringVar4, CleanUpAfterFailingToUseRegisteredKeyItemOnField);
+ }
+}
+
+void sub_80FDD10(u8 taskId)
+{
+ if (IsPlayerFacingPlantedBerryTree() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDD74;
+ gFieldCallback = MapPostLoadHook_UseItem;
+ *gUnknown_0203CE54 = c2_exit_to_overworld_2_switch;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId);
+ }
+}
+
+void sub_80FDD74(u8 taskId)
+{
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(Route102_EventScript_274482);
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_WailmerPail(u8 taskId)
+{
+ if (sub_80FDE2C() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDE7C;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else if (TryToWaterBerryTree() == TRUE)
+ {
+ gUnknown_0203A0F4 = sub_80FDE08;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void sub_80FDE08(u8 taskId)
+{
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(Route102_EventScript_2744C0);
+ DestroyTask(taskId);
+}
+
+bool8 sub_80FDE2C(void)
+{
+ u16 x, y;
+ u8 z;
+ u8 objId;
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ z = PlayerGetZCoord();
+ objId = GetFieldObjectIdByXYZ(x, y, z);
+ if (objId == 16 || gMapObjects[objId].graphicsId != 0xE4)
+ return FALSE;
+ else
+ return TRUE;
+}
+
+void sub_80FDE7C(u8 taskId)
+{
+ ScriptContext2_Enable();
+ ScriptContext1_SetupScript(BattleFrontier_OutsideEast_EventScript_242CFC);
+ DestroyTask(taskId);
+}
+
+void ItemUseOutOfBattle_Medicine(u8 taskId)
+{
+ gUnknown_03006328 = ItemUseCB_Medicine;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_ReduceEV(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B67C8;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_SacredAsh(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B79E8;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_PPRecovery(u8 taskId)
+{
+ gUnknown_03006328 = dp05_ether;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_PPUp(u8 taskId)
+{
+ gUnknown_03006328 = dp05_pp_up;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_RareCandy(u8 taskId)
+{
+ gUnknown_03006328 = dp05_rare_candy;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseOutOfBattle_TMHM(u8 taskId)
+{
+ if (gSpecialVar_ItemId >= ITEM_HM01)
+ DisplayItemMessage(taskId, 1, gText_BootedUpHM, sub_80FDF90); // HM
+ else
+ DisplayItemMessage(taskId, 1, gText_BootedUpTM, sub_80FDF90); // TM
+}
+
+void sub_80FDF90(u8 taskId)
+{
+ PlaySE(SE_PC_LOGIN);
+ gTasks[taskId].func = task08_0809AD8C;
+}
+
+void task08_0809AD8C(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ StringCopy(gStringVar1, gMoveNames[ItemIdToBattleMoveId(gSpecialVar_ItemId)]);
+ StringExpandPlaceholders(gStringVar4, gText_TMHMContainedVar1);
+ DisplayItemMessage(taskId, 1, gStringVar4, sub_80FE024);
+ }
+}
+
+void sub_80FE024(u8 taskId)
+{
+ bag_menu_yes_no(taskId, 6, gUnknown_085920E8);
+}
+
+void sub_80FE03C(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B6DC4;
+ SetUpItemUseCallback(taskId);
+}
+
+void sub_80FE058(void)
+{
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ StringExpandPlaceholders(gStringVar4, gText_PlayerUsedVar2);
+ if (!InBattlePyramid())
+ {
+ sub_81AB9A8(ItemId_GetPocket(gSpecialVar_ItemId));
+ sub_81ABA88(ItemId_GetPocket(gSpecialVar_ItemId));
+ }
+ else
+ {
+ sub_81C5924();
+ sub_81C59BC();
+ }
+}
+
+void ItemUseOutOfBattle_Repel(u8 taskId)
+{
+ if (VarGet(VAR_REPEL_STEP_COUNT) == 0)
+ gTasks[taskId].func = sub_80FE124;
+ else if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gText_RepelEffectsLingered, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_RepelEffectsLingered, sub_81C6714);
+}
+
+void sub_80FE124(u8 taskId)
+{
+ s16* data = gTasks[taskId].data;
+
+ if (++data[8] > 7)
+ {
+ data[8] = 0;
+ PlaySE(SE_TU_SAA);
+ gTasks[taskId].func = sub_80FE164;
+ }
+}
+
+void sub_80FE164(u8 taskId)
+{
+ if (!IsSEPlaying())
+ {
+ VarSet(VAR_REPEL_STEP_COUNT, ItemId_GetHoldEffectParam(gSpecialVar_ItemId));
+ sub_80FE058();
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C6714);
+ }
+}
+
+void sub_80FE1D0(u8 taskId)
+{
+ if(++gTasks[taskId].data[8] > 7)
+ {
+ PlaySE(SE_BIDORO);
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C6714);
+ }
+}
+
+void ItemUseOutOfBattle_BlackWhiteFlute(u8 taskId)
+{
+ CopyItemName(gSpecialVar_ItemId, gStringVar2);
+ if (gSpecialVar_ItemId == ITEM_WHITE_FLUTE)
+ {
+ FlagSet(FLAG_SYS_ENC_UP_ITEM);
+ FlagClear(FLAG_SYS_ENC_DOWN_ITEM);
+ StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildLured);
+ }
+ else
+ {
+ FlagSet(FLAG_SYS_ENC_DOWN_ITEM);
+ FlagClear(FLAG_SYS_ENC_UP_ITEM);
+ StringExpandPlaceholders(gStringVar4, gText_UsedVar2WildRepelled);
+ }
+ gTasks[taskId].data[8] = 0;
+ gTasks[taskId].func = sub_80FE1D0;
+}
+
+void task08_080A1C44(u8 taskId)
+{
+ player_avatar_init_params_reset();
+ sub_80B7CC8();
+ DestroyTask(taskId);
+}
+
+void re_escape_rope(u8 taskId)
+{
+ flagmods_08054D70();
+ sub_80FE058();
+ gTasks[taskId].data[0] = 0;
+ DisplayItemMessageOnField(taskId, gStringVar4, task08_080A1C44);
+}
+
+bool8 sub_80FE314(void)
+{
+ if (gMapHeader.flags & 2)
+ return TRUE;
+ else
+ return FALSE;
+}
+
+void ItemUseOutOfBattle_EscapeRope(u8 taskId)
+{
+ if (sub_80FE314() == TRUE)
+ {
+ gUnknown_0203A0F4 = re_escape_rope;
+ SetUpItemUseOnFieldCallback(taskId);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void ItemUseOutOfBattle_EvolutionStone(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B7C74;
+ SetUpItemUseCallback(taskId);
+}
+
+void ItemUseInBattle_PokeBall(u8 taskId)
+{
+ if (IsPlayerPartyAndPokemonStorageFull() == FALSE) // have room for mon?
+ {
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ if (!InBattlePyramid())
+ unknown_ItemMenu_Confirm(taskId);
+ else
+ sub_81C5B14(taskId);
+ }
+ else if (!InBattlePyramid())
+ {
+ DisplayItemMessage(taskId, 1, gText_BoxFull, bag_menu_inits_lists_menu);
+ }
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_BoxFull, sub_81C6714);
+}
+
+void sub_80FE408(u8 taskId)
+{
+ if (gMain.newKeys & (A_BUTTON | B_BUTTON))
+ {
+ if (!InBattlePyramid())
+ unknown_ItemMenu_Confirm(taskId);
+ else
+ sub_81C5B14(taskId);
+ }
+}
+
+void sub_80FE440(u8 taskId)
+{
+ if(++gTasks[taskId].data[8] > 7)
+ {
+ PlaySE(SE_KAIFUKU);
+ RemoveBagItem(gSpecialVar_ItemId, 1);
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, sub_806CF78(gSpecialVar_ItemId), sub_80FE408);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, sub_806CF78(gSpecialVar_ItemId), sub_80FE408);
+ }
+}
+
+void ItemUseInBattle_StatIncrease(u8 taskId)
+{
+ u16 partyId = gBattlePartyID[gBankInMenu];
+
+ if (ExecuteTableBasedItemEffect_(&gPlayerParty[partyId], gSpecialVar_ItemId, partyId, 0) != FALSE)
+ {
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gText_WontHaveEffect, bag_menu_inits_lists_menu);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gText_WontHaveEffect, sub_81C6714);
+ }
+ else
+ {
+ gTasks[taskId].func = sub_80FE440;
+ gTasks[taskId].data[8] = 0;
+ }
+}
+
+void sub_80FE54C(u8 taskId)
+{
+ if (!InBattlePyramid())
+ {
+ *gUnknown_0203CE54 = sub_81B89F0;
+ unknown_ItemMenu_Confirm(taskId);
+ }
+ else
+ {
+ *gUnknown_0203CF2C = sub_81B89F0;
+ sub_81C5B14(taskId);
+ }
+}
+
+void ItemUseInBattle_Medicine(u8 taskId)
+{
+ gUnknown_03006328 = ItemUseCB_Medicine;
+ sub_80FE54C(taskId);
+}
+
+void sub_80FE5AC(u8 taskId)
+{
+ gUnknown_03006328 = sub_81B79E8;
+ sub_80FE54C(taskId);
+}
+
+void ItemUseInBattle_PPRecovery(u8 taskId)
+{
+ gUnknown_03006328 = dp05_ether;
+ sub_80FE54C(taskId);
+}
+
+void ItemUseInBattle_Escape(u8 taskId)
+{
+
+ if((gBattleTypeFlags & BATTLE_TYPE_TRAINER) == FALSE)
+ {
+ sub_80FE058();
+ if (!InBattlePyramid())
+ DisplayItemMessage(taskId, 1, gStringVar4, unknown_ItemMenu_Confirm);
+ else
+ DisplayItemMessageInBattlePyramid(taskId, gStringVar4, sub_81C5B14);
+ }
+ else
+ {
+ DisplayDadsAdviceCannotUseItemMessage(taskId, gTasks[taskId].data[3]);
+ }
+}
+
+void ItemUseOutOfBattle_EnigmaBerry(u8 taskId)
+{
+ switch (GetItemEffectType(gSpecialVar_ItemId) - 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[4] = 1;
+ ItemUseOutOfBattle_Medicine(taskId);
+ break;
+ case 9:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_SacredAsh(taskId);
+ break;
+ case 0:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_RareCandy(taskId);
+ break;
+ case 18:
+ case 19:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_PPUp(taskId);
+ break;
+ case 20:
+ gTasks[taskId].data[4] = 1;
+ ItemUseOutOfBattle_PPRecovery(taskId);
+ break;
+ default:
+ gTasks[taskId].data[4] = 4;
+ ItemUseOutOfBattle_CannotUse(taskId);
+ }
+}
+
+void ItemUseInBattle_EnigmaBerry(u8 taskId)
+{
+ switch (GetItemEffectType(gSpecialVar_ItemId))
+ {
+ 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[3]);
+}
diff --git a/src/mail.c b/src/mail.c
index c3cbe4a3c..ac263ac67 100644
--- a/src/mail.c
+++ b/src/mail.c
@@ -4,7 +4,7 @@
#include "main.h"
#include "overworld.h"
#include "task.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "palette.h"
#include "text.h"
#include "menu.h"
diff --git a/src/option_menu.c b/src/option_menu.c
index 7f92756ab..cbbe14b77 100644
--- a/src/option_menu.c
+++ b/src/option_menu.c
@@ -2,7 +2,7 @@
#include "option_menu.h"
#include "main.h"
#include "menu.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "palette.h"
#include "sprite.h"
#include "task.h"
diff --git a/src/pokeblock.c b/src/pokeblock.c
index 1a4ce3155..472b030e0 100644
--- a/src/pokeblock.c
+++ b/src/pokeblock.c
@@ -14,7 +14,7 @@
#include "battle.h"
#include "battle_controllers.h"
#include "palette.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "list_menu.h"
#include "gpu_regs.h"
#include "decompress.h"
diff --git a/src/reshow_battle_screen.c b/src/reshow_battle_screen.c
index 3df2ff151..a4bb4a728 100644
--- a/src/reshow_battle_screen.c
+++ b/src/reshow_battle_screen.c
@@ -3,7 +3,7 @@
#include "battle.h"
#include "palette.h"
#include "main.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "text.h"
#include "gpu_regs.h"
#include "bg.h"
@@ -34,7 +34,7 @@ extern struct SpriteTemplate gUnknown_0202499C;
extern const union AnimCmd * const * const gMonAnimationsSpriteAnimsPtrTable[];
-extern void dp12_8087EA4(void);
+extern void ScanlineEffect_Clear(void);
extern void sub_8035658(void);
extern bool8 IsDoubleBattle(void);
extern u8 GetSubstituteSpriteDefault_Y(u8 bank);
@@ -72,7 +72,7 @@ static void CB2_ReshowBattleScreenAfterMenu(void)
switch (gBattleScripting.reshowMainState)
{
case 0:
- dp12_8087EA4();
+ ScanlineEffect_Clear();
sub_8035658();
SetBgAttribute(1, BG_CTRL_ATTR_VISIBLE, 0);
SetBgAttribute(2, BG_CTRL_ATTR_VISIBLE, 0);
diff --git a/src/scanline_effect.c b/src/scanline_effect.c
new file mode 100644
index 000000000..148e053fc
--- /dev/null
+++ b/src/scanline_effect.c
@@ -0,0 +1,262 @@
+#include "global.h"
+#include "data2.h"
+#include "task.h"
+#include "trig.h"
+#include "scanline_effect.h"
+
+static void CopyValue16Bit(void);
+static void CopyValue32Bit(void);
+
+extern u16 gBattle_BG0_Y;
+extern u16 gBattle_BG0_X;
+extern u16 gBattle_BG1_X;
+extern u16 gBattle_BG1_Y;
+extern u16 gBattle_BG2_X;
+extern u16 gBattle_BG2_Y;
+extern u16 gBattle_BG3_X;
+extern u16 gBattle_BG3_Y;
+
+// EWRAM vars
+
+// Per-scanline register values.
+// This is double buffered so that it can be safely written to at any time
+// without overwriting the buffer that the DMA is currently reading
+EWRAM_DATA u16 gScanlineEffectRegBuffers[2][0x3C0] = {0};
+
+EWRAM_DATA struct ScanlineEffect gScanlineEffect = {0};
+EWRAM_DATA static bool8 sShouldStopWaveTask = FALSE;
+
+void ScanlineEffect_Stop(void)
+{
+ gScanlineEffect.state = 0;
+ DmaStop(0);
+ if (gScanlineEffect.waveTaskId != 0xFF)
+ {
+ DestroyTask(gScanlineEffect.waveTaskId);
+ gScanlineEffect.waveTaskId = 0xFF;
+ }
+}
+
+void ScanlineEffect_Clear(void)
+{
+ CpuFill16(0, gScanlineEffectRegBuffers, sizeof(gScanlineEffectRegBuffers));
+ gScanlineEffect.dmaSrcBuffers[0] = NULL;
+ gScanlineEffect.dmaSrcBuffers[1] = NULL;
+ gScanlineEffect.dmaDest = NULL;
+ gScanlineEffect.dmaControl = 0;
+ gScanlineEffect.srcBuffer = 0;
+ gScanlineEffect.state = 0;
+ gScanlineEffect.unused16 = 0;
+ gScanlineEffect.unused17 = 0;
+ gScanlineEffect.waveTaskId = 0xFF;
+}
+
+void ScanlineEffect_SetParams(struct ScanlineEffectParams params)
+{
+ if (params.dmaControl == SCANLINE_EFFECT_DMACNT_16BIT) // 16-bit
+ {
+ // Set the DMA src to the value for the second scanline because the
+ // first DMA transfer occurs in HBlank *after* the first scanline is drawn
+ gScanlineEffect.dmaSrcBuffers[0] = (u16 *)gScanlineEffectRegBuffers[0] + 1;
+ gScanlineEffect.dmaSrcBuffers[1] = (u16 *)gScanlineEffectRegBuffers[1] + 1;
+ gScanlineEffect.setFirstScanlineReg = CopyValue16Bit;
+ }
+ else // assume 32-bit
+ {
+ // Set the DMA src to the value for the second scanline because the
+ // first DMA transfer occurs in HBlank *after* the first scanline is drawn
+ gScanlineEffect.dmaSrcBuffers[0] = (u32 *)gScanlineEffectRegBuffers[0] + 1;
+ gScanlineEffect.dmaSrcBuffers[1] = (u32 *)gScanlineEffectRegBuffers[1] + 1;
+ gScanlineEffect.setFirstScanlineReg = CopyValue32Bit;
+ }
+
+ gScanlineEffect.dmaControl = params.dmaControl;
+ gScanlineEffect.dmaDest = params.dmaDest;
+ gScanlineEffect.state = params.initState;
+ gScanlineEffect.unused16 = params.unused9;
+ gScanlineEffect.unused17 = params.unused9;
+}
+
+void ScanlineEffect_InitHBlankDmaTransfer(void)
+{
+ if (gScanlineEffect.state == 0)
+ {
+ return;
+ }
+ else if (gScanlineEffect.state == 3)
+ {
+ gScanlineEffect.state = 0;
+ DmaStop(0);
+ sShouldStopWaveTask = TRUE;
+ }
+ else
+ {
+ DmaStop(0);
+ // Set DMA to copy to dest register on each HBlank for the next frame.
+ // The HBlank DMA transfers do not occurr during VBlank, so the transfer
+ // will begin on the HBlank after the first scanline
+ DmaSet(0, gScanlineEffect.dmaSrcBuffers[gScanlineEffect.srcBuffer], gScanlineEffect.dmaDest, gScanlineEffect.dmaControl);
+ // Manually set the reg for the first scanline
+ gScanlineEffect.setFirstScanlineReg();
+ // Swap current buffer
+ gScanlineEffect.srcBuffer ^= 1;
+ }
+}
+
+// These two functions are used to copy the register for the first scanline,
+// depending whether it is a 16-bit register or a 32-bit register.
+
+static void CopyValue16Bit(void)
+{
+ u16 *dest = (u16 *)gScanlineEffect.dmaDest;
+ u16 *src = (u16 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer];
+
+ *dest = *src;
+}
+
+static void CopyValue32Bit(void)
+{
+ u32 *dest = (u32 *)gScanlineEffect.dmaDest;
+ u32 *src = (u32 *)&gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer];
+
+ *dest = *src;
+}
+
+#define tStartLine data[0]
+#define tEndLine data[1]
+#define tWaveLength data[2]
+#define tSrcBufferOffset data[3]
+#define tFramesUntilMove data[4]
+#define tDelayInterval data[5]
+#define tRegOffset data[6]
+#define tApplyBattleBgOffsets data[7]
+
+static void TaskFunc_UpdateWavePerFrame(u8 taskId)
+{
+ int value = 0;
+ int i;
+ int offset;
+
+ if (sShouldStopWaveTask)
+ {
+ DestroyTask(taskId);
+ gScanlineEffect.waveTaskId = 0xFF;
+ }
+ else
+ {
+ if (gTasks[taskId].tApplyBattleBgOffsets)
+ {
+ switch (gTasks[taskId].tRegOffset)
+ {
+ case SCANLINE_EFFECT_REG_BG0HOFS:
+ value = gBattle_BG0_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG0VOFS:
+ value = gBattle_BG0_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG1HOFS:
+ value = gBattle_BG1_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG1VOFS:
+ value = gBattle_BG1_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG2HOFS:
+ value = gBattle_BG2_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG2VOFS:
+ value = gBattle_BG2_Y;
+ break;
+ case SCANLINE_EFFECT_REG_BG3HOFS:
+ value = gBattle_BG3_X;
+ break;
+ case SCANLINE_EFFECT_REG_BG3VOFS:
+ value = gBattle_BG3_Y;
+ break;
+ }
+ }
+ if (gTasks[taskId].tFramesUntilMove != 0)
+ {
+ gTasks[taskId].tFramesUntilMove--;
+ offset = gTasks[taskId].tSrcBufferOffset + 320;
+ for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value;
+ offset++;
+ }
+ }
+ else
+ {
+ gTasks[taskId].tFramesUntilMove = gTasks[taskId].tDelayInterval;
+ offset = gTasks[taskId].tSrcBufferOffset + 320;
+ for (i = gTasks[taskId].tStartLine; i < gTasks[taskId].tEndLine; i++)
+ {
+ gScanlineEffectRegBuffers[gScanlineEffect.srcBuffer][i] = gScanlineEffectRegBuffers[0][offset] + value;
+ offset++;
+ }
+
+ // increment src buffer offset
+ gTasks[taskId].tSrcBufferOffset++;
+ if (gTasks[taskId].tSrcBufferOffset == gTasks[taskId].tWaveLength)
+ gTasks[taskId].tSrcBufferOffset = 0;
+ }
+ }
+}
+
+static void GenerateWave(u16 *buffer, u8 frequency, u8 amplitude, u8 unused)
+{
+ u16 i = 0;
+ u8 theta = 0;
+
+ while (i < 256)
+ {
+ buffer[i] = (gSineTable[theta] * amplitude) / 256;
+ theta += frequency;
+ i++;
+ }
+}
+
+// Initializes a background "wave" effect that affects scanlines startLine (inclusive) to endLine (exclusive).
+// 'frequency' and 'amplitude' control the frequency and amplitude of the wave.
+// 'delayInterval' controls how fast the wave travels up the screen. The wave will shift upwards one scanline every 'delayInterval'+1 frames.
+// 'regOffset' is the offset of the video register to modify.
+u8 ScanlineEffect_InitWave(u8 startLine, u8 endLine, u8 frequency, u8 amplitude, u8 delayInterval, u8 regOffset, bool8 applyBattleBgOffsets)
+{
+ int i;
+ int offset;
+ struct ScanlineEffectParams params;
+ u8 taskId;
+
+ ScanlineEffect_Clear();
+
+ params.dmaDest = (void *)(REG_ADDR_BG0HOFS + regOffset);
+ params.dmaControl = SCANLINE_EFFECT_DMACNT_16BIT;
+ params.initState = 1;
+ params.unused9 = 0;
+ ScanlineEffect_SetParams(params);
+
+ taskId = CreateTask(TaskFunc_UpdateWavePerFrame, 0);
+
+ gTasks[taskId].tStartLine = startLine;
+ gTasks[taskId].tEndLine = endLine;
+ gTasks[taskId].tWaveLength = 256 / frequency;
+ gTasks[taskId].tSrcBufferOffset = 0;
+ gTasks[taskId].tFramesUntilMove = delayInterval;
+ gTasks[taskId].tDelayInterval = delayInterval;
+ gTasks[taskId].tRegOffset = regOffset;
+ gTasks[taskId].tApplyBattleBgOffsets = applyBattleBgOffsets;
+
+ gScanlineEffect.waveTaskId = taskId;
+ sShouldStopWaveTask = FALSE;
+
+ GenerateWave(&gScanlineEffectRegBuffers[0][320], frequency, amplitude, endLine - startLine);
+
+ offset = 320;
+ for (i = startLine; i < endLine; i++)
+ {
+ gScanlineEffectRegBuffers[0][i] = gScanlineEffectRegBuffers[0][offset];
+ gScanlineEffectRegBuffers[1][i] = gScanlineEffectRegBuffers[0][offset];
+ offset++;
+ }
+
+ return taskId;
+}
diff --git a/src/scrcmd.c b/src/scrcmd.c
index 0557cd95e..1768f0d4c 100644
--- a/src/scrcmd.c
+++ b/src/scrcmd.c
@@ -638,7 +638,7 @@ static bool8 IsPaletteNotActive(void)
bool8 ScrCmd_fadescreen(struct ScriptContext *ctx)
{
- fade_screen(ScriptReadByte(ctx), 0);
+ FadeScreen(ScriptReadByte(ctx), 0);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -648,7 +648,7 @@ bool8 ScrCmd_fadescreenspeed(struct ScriptContext *ctx)
u8 mode = ScriptReadByte(ctx);
u8 speed = ScriptReadByte(ctx);
- fade_screen(mode, speed);
+ FadeScreen(mode, speed);
SetupNativeScript(ctx, IsPaletteNotActive);
return TRUE;
}
@@ -662,12 +662,12 @@ bool8 ScrCmd_fadescreenswapbuffers(struct ScriptContext *ctx)
case 1:
default:
CpuCopy32(gPlttBufferUnfaded, gPaletteDecompressionBuffer, PLTT_DECOMP_BUFFER_SIZE);
- fade_screen(mode, 0);
+ FadeScreen(mode, 0);
break;
case 0:
case 2:
CpuCopy32(gPaletteDecompressionBuffer, gPlttBufferUnfaded, PLTT_DECOMP_BUFFER_SIZE);
- fade_screen(mode, 0);
+ FadeScreen(mode, 0);
break;
}
@@ -726,7 +726,7 @@ bool8 ScrCmd_setweather(struct ScriptContext *ctx)
bool8 ScrCmd_resetweather(struct ScriptContext *ctx)
{
- sub_80AEDBC();
+ SetSav1WeatherFromCurrMapHeader();
return FALSE;
}
diff --git a/src/secret_base.c b/src/secret_base.c
index bf6bec1f8..61c2511b7 100644
--- a/src/secret_base.c
+++ b/src/secret_base.c
@@ -394,7 +394,7 @@ void sub_80E8FD0(u8 taskId)
void sub_80E9068(void)
{
CreateTask(sub_80E8FD0, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
saved_warp2_set(0, gSaveBlock1Ptr->location.mapGroup, gSaveBlock1Ptr->location.mapNum, -1);
}
@@ -451,7 +451,7 @@ void sub_80E916C(u8 taskId)
void sub_80E91F8(void)
{
CreateTask(sub_80E916C, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
bool8 CurrentMapIsSecretBase(void)
@@ -651,7 +651,7 @@ void sub_80E96A4(u8 taskId)
void sub_80E9728(void)
{
CreateTask(sub_80E96A4, 0);
- fade_screen(1, 0);
+ FadeScreen(1, 0);
}
void sub_80E9744(void)
diff --git a/src/time_events.c b/src/time_events.c
new file mode 100644
index 000000000..1f169a5c6
--- /dev/null
+++ b/src/time_events.c
@@ -0,0 +1,118 @@
+#include "global.h"
+#include "time_events.h"
+#include "event_data.h"
+#include "field_weather.h"
+#include "pokemon.h"
+#include "random.h"
+#include "overworld.h"
+#include "rtc.h"
+#include "script.h"
+#include "task.h"
+
+static u32 GetMirageRnd(void)
+{
+ u32 hi = VarGet(VAR_MIRAGE_RND_H);
+ u32 lo = VarGet(VAR_MIRAGE_RND_L);
+ return (hi << 16) | lo;
+}
+
+static void SetMirageRnd(u32 rnd)
+{
+ VarSet(VAR_MIRAGE_RND_H, rnd >> 16);
+ VarSet(VAR_MIRAGE_RND_L, rnd);
+}
+
+// unused
+void InitMirageRnd(void)
+{
+ SetMirageRnd((Random() << 16) | Random());
+}
+
+void UpdateMirageRnd(u16 days)
+{
+ s32 rnd = GetMirageRnd();
+ while (days)
+ {
+ rnd = 1103515245 * rnd + 12345;
+ days--;
+ }
+ SetMirageRnd(rnd);
+}
+
+bool8 IsMirageIslandPresent(void)
+{
+ u16 rnd = GetMirageRnd() >> 16;
+ int i;
+
+ for (i = 0; i < PARTY_SIZE; i++)
+ if (GetMonData(&gPlayerParty[i], MON_DATA_SPECIES) && (GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY) & 0xFFFF) == rnd)
+ return TRUE;
+
+ return FALSE;
+}
+
+void UpdateShoalTideFlag(void)
+{
+ static const u8 tide[] =
+ {
+ 1, // 00
+ 1, // 01
+ 1, // 02
+ 0, // 03
+ 0, // 04
+ 0, // 05
+ 0, // 06
+ 0, // 07
+ 0, // 08
+ 1, // 09
+ 1, // 10
+ 1, // 11
+ 1, // 12
+ 1, // 13
+ 1, // 14
+ 0, // 15
+ 0, // 16
+ 0, // 17
+ 0, // 18
+ 0, // 19
+ 0, // 20
+ 1, // 21
+ 1, // 22
+ 1, // 23
+ };
+
+ if (is_light_level_1_2_3_5_or_6(get_map_light_from_warp0()))
+ {
+ RtcCalcLocalTime();
+ if (tide[gLocalTime.hours])
+ FlagSet(FLAG_SYS_SHOAL_TIDE);
+ else
+ FlagClear(FLAG_SYS_SHOAL_TIDE);
+ }
+}
+
+static void Task_WaitWeather(u8 taskId)
+{
+ if (IsWeatherChangeComplete())
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+void WaitWeather(void)
+{
+ CreateTask(Task_WaitWeather, 80);
+}
+
+void InitBirchState(void)
+{
+ *GetVarPointer(VAR_BIRCH_STATE) = 0;
+}
+
+void UpdateBirchState(u16 days)
+{
+ u16 *state = GetVarPointer(VAR_BIRCH_STATE);
+ *state += days;
+ *state %= 7;
+}
diff --git a/src/use_pokeblock.c b/src/use_pokeblock.c
index 12f475c93..c8898d08f 100644
--- a/src/use_pokeblock.c
+++ b/src/use_pokeblock.c
@@ -4,7 +4,7 @@
#include "malloc.h"
#include "palette.h"
#include "pokenav.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "text.h"
#include "bg.h"
#include "window.h"
@@ -131,7 +131,7 @@ void sub_8166340(void)
ProcessSpriteCopyRequests();
TransferPlttBuffer();
sub_81D2108(gUnknown_0203BCAC->field_7C58);
- sub_80BA0A8();
+ ScanlineEffect_InitHBlankDmaTransfer();
}
void sub_816636C(void (*func)(void))
diff --git a/src/wallclock.c b/src/wallclock.c
index dbea24b4c..f15bbbc27 100644
--- a/src/wallclock.c
+++ b/src/wallclock.c
@@ -12,7 +12,7 @@
#include "window.h"
#include "text_window.h"
#include "menu.h"
-#include "unknown_task.h"
+#include "scanline_effect.h"
#include "task.h"
#include "strings.h"
#include "sound.h"