summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcus Huderle <huderlem@gmail.com>2017-11-19 19:51:37 -0800
committerGitHub <noreply@github.com>2017-11-19 19:51:37 -0800
commit0f42ef11742cfc141b720846777e43d96a64ffc3 (patch)
treeaae4004235e52acb73289336d37e09b4a8677dbf /src
parent4a365e9230962daf875a0444d51d76639c07c827 (diff)
parent71ab629e9e4f29fc502411d41b0fd53064d94e02 (diff)
Merge pull request #463 from sceptillion/master
decompile fldeff_recordmixing
Diffstat (limited to 'src')
-rw-r--r--src/battle/battle_setup.c2
-rw-r--r--src/engine/record_mixing.c2
-rw-r--r--src/field/field_effect.c2
-rw-r--r--src/field/field_poison.c2
-rw-r--r--src/field/fldeff_berrytree.c56
-rw-r--r--src/field/fldeff_cut.c2
-rw-r--r--src/field/fldeff_decoration.c309
-rw-r--r--src/field/fldeff_poison.c44
-rw-r--r--src/field/fldeff_recordmixing.c83
-rw-r--r--src/field/fldeff_secret_base_pc.c69
-rw-r--r--src/field/fldeff_secretpower.c304
-rw-r--r--src/field/secret_base.c6
12 files changed, 870 insertions, 11 deletions
diff --git a/src/battle/battle_setup.c b/src/battle/battle_setup.c
index 8327ed59d..dab87b462 100644
--- a/src/battle/battle_setup.c
+++ b/src/battle/battle_setup.c
@@ -11,7 +11,7 @@
#include "field_player_avatar.h"
#include "field_weather.h"
#include "fieldmap.h"
-#include "fldeff_80C5CD4.h"
+#include "fldeff_poison.h"
#include "main.h"
#include "map_constants.h"
#include "metatile_behavior.h"
diff --git a/src/engine/record_mixing.c b/src/engine/record_mixing.c
index b30d57a4d..cf51bec9e 100644
--- a/src/engine/record_mixing.c
+++ b/src/engine/record_mixing.c
@@ -5,7 +5,7 @@
#include "daycare.h"
#include "dewford_trend.h"
#include "event_data.h"
-#include "fldeff_80C5CD4.h"
+#include "fldeff_recordmixing.h"
#include "item.h"
#include "items.h"
#include "load_save.h"
diff --git a/src/field/field_effect.c b/src/field/field_effect.c
index e15dc906f..0ccbb6230 100644
--- a/src/field/field_effect.c
+++ b/src/field/field_effect.c
@@ -28,7 +28,7 @@
#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))}
-EWRAM_DATA u32 gFieldEffectArguments[8] = {0};
+EWRAM_DATA s32 gFieldEffectArguments[8] = {0};
const u32 gSpriteImage_839DC14[] = INCBIN_U32("graphics/birch_speech/birch.4bpp");
const u16 gBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal");
diff --git a/src/field/field_poison.c b/src/field/field_poison.c
index b6ff12ff9..74d70cb36 100644
--- a/src/field/field_poison.c
+++ b/src/field/field_poison.c
@@ -1,7 +1,7 @@
#include "global.h"
#include "field_poison.h"
#include "field_message_box.h"
-#include "fldeff_80C5CD4.h"
+#include "fldeff_poison.h"
#include "pokemon.h"
#include "pokemon_summary_screen.h"
#include "script.h"
diff --git a/src/field/fldeff_berrytree.c b/src/field/fldeff_berrytree.c
new file mode 100644
index 000000000..0763c0314
--- /dev/null
+++ b/src/field/fldeff_berrytree.c
@@ -0,0 +1,56 @@
+#include "global.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "script.h"
+
+static void Task_WateringBerryTreeAnim_0(u8);
+static void Task_WateringBerryTreeAnim_1(u8);
+static void Task_WateringBerryTreeAnim_2(u8);
+static void Task_WateringBerryTreeAnim_3(u8);
+
+static void Task_WateringBerryTreeAnim_0(u8 taskId)
+{
+ gTasks[taskId].func = Task_WateringBerryTreeAnim_1;
+}
+
+static void Task_WateringBerryTreeAnim_1(u8 taskId)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)
+ || FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
+ {
+ sub_8059D08(player_get_direction_lower_nybble());
+ FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay16AnimId(player_get_direction_lower_nybble()));
+ gTasks[taskId].func = Task_WateringBerryTreeAnim_2;
+ }
+}
+
+static void Task_WateringBerryTreeAnim_2(u8 taskId)
+{
+ struct MapObject *mapObject = &gMapObjects[gPlayerAvatar.mapObjectId];
+ if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject))
+ {
+ s16 value = gTasks[taskId].data[1]++;
+
+ if (value < 10)
+ {
+ FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay16AnimId(player_get_direction_lower_nybble()));
+ }
+ else
+ {
+ gTasks[taskId].func = Task_WateringBerryTreeAnim_3;
+ }
+ }
+}
+
+static void Task_WateringBerryTreeAnim_3(u8 taskId)
+{
+ SetPlayerAvatarTransitionFlags(sub_80597D0());
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+}
+
+void DoWateringBerryTreeAnim(void)
+{
+ CreateTask(Task_WateringBerryTreeAnim_0, 80);
+}
diff --git a/src/field/fldeff_cut.c b/src/field/fldeff_cut.c
index 6e7f14a8c..599c916a2 100644
--- a/src/field/fldeff_cut.c
+++ b/src/field/fldeff_cut.c
@@ -23,8 +23,6 @@ extern void (*gUnknown_03005CE4)(void);
extern struct SpriteTemplate gSpriteTemplate_CutGrass;
-extern struct MapPosition gUnknown_0203923C;
-
extern u8 gLastFieldPokeMenuOpened;
extern u8 S_UseCut[];
diff --git a/src/field/fldeff_decoration.c b/src/field/fldeff_decoration.c
new file mode 100644
index 000000000..b0ac30062
--- /dev/null
+++ b/src/field/fldeff_decoration.c
@@ -0,0 +1,309 @@
+#include "global.h"
+#include "event_data.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "field_map_obj.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "text.h"
+
+extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36];
+extern const struct SpriteTemplate gSpriteTemplate_83D26A0;
+
+static void sub_80C68EC(u8);
+static void DoBalloonSoundEffect(s16);
+void SpriteCB_SandPillar_0(struct Sprite *);
+void SpriteCB_SandPillar_1(struct Sprite *);
+void SpriteCB_SandPillar_2(struct Sprite *);
+
+void sub_80C68A4(s16 metatileId, s16 x, s16 y)
+{
+ u8 taskId = CreateTask(sub_80C68EC, 0);
+
+ gTasks[taskId].data[0] = metatileId;
+ gTasks[taskId].data[1] = x;
+ gTasks[taskId].data[2] = y;
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].data[4] = 1;
+}
+
+static void sub_80C68EC(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[3] == 6)
+ data[3] = 0;
+ else
+ data[3]++;
+
+ if (data[3] == 0)
+ {
+ if (data[4] == 2)
+ DoBalloonSoundEffect(data[0]);
+ MapGridSetMetatileIdAt(data[1], data[2], data[0] + data[4]);
+ CurrentMapDrawMetatileAt(data[1], data[2]);
+ if (data[4] == 3)
+ DestroyTask(taskId);
+ else
+ data[4]++;
+ }
+}
+
+static void DoBalloonSoundEffect(s16 metatileId)
+{
+ switch (metatileId)
+ {
+ case 824:
+ PlaySE(SE_FUUSEN1);
+ break;
+ case 828:
+ PlaySE(SE_FUUSEN2);
+ break;
+ case 832:
+ PlaySE(SE_FUUSEN3);
+ break;
+ case 552:
+ PlaySE(SE_TOY_DANGO);
+ break;
+ }
+}
+
+bool8 FldEff_Nop47(void)
+{
+ return FALSE;
+}
+
+bool8 FldEff_Nop48(void)
+{
+ return FALSE;
+}
+
+static void sub_80C69C4(s16 x, s16 y)
+{
+ PlaySE(SE_TOY_KABE);
+ MapGridSetMetatileIdAt(x, y, 630);
+ MapGridSetMetatileIdAt(x, y - 1, 622);
+ CurrentMapDrawMetatileAt(x, y);
+ CurrentMapDrawMetatileAt(x, y - 1);
+}
+
+static void sub_80C6A14(u8 taskId)
+{
+ if (gTasks[taskId].data[0] == 7)
+ {
+ sub_80C69C4(gTasks[taskId].data[1], gTasks[taskId].data[2]);
+ DestroyTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].data[0]++;
+ }
+}
+
+void sub_80C6A54(s16 x, s16 y)
+{
+ u8 dir = player_get_direction_lower_nybble();
+ if (dir == DIR_SOUTH)
+ {
+ sub_80C69C4(x, y);
+ }
+ else if (dir == DIR_NORTH)
+ {
+ u8 taskId = CreateTask(sub_80C6A14, 5);
+ gTasks[taskId].data[0] = 0;
+ gTasks[taskId].data[1] = x;
+ gTasks[taskId].data[2] = y;
+ }
+}
+
+static void Task_DecorationSoundEffect(u8 taskId)
+{
+ if (gTasks[taskId].data[1] == 7)
+ {
+ switch (gTasks[taskId].data[0])
+ {
+ case 632:
+ PlaySE(SE_TOY_C);
+ break;
+ case 633:
+ PlaySE(SE_TOY_D);
+ break;
+ case 634:
+ PlaySE(SE_TOY_E);
+ break;
+ case 635:
+ PlaySE(SE_TOY_F);
+ break;
+ case 636:
+ PlaySE(SE_TOY_G);
+ break;
+ case 637:
+ PlaySE(SE_TOY_A);
+ break;
+ case 638:
+ PlaySE(SE_TOY_B);
+ break;
+ case 691:
+ PlaySE(SE_TOY_C1);
+ break;
+ }
+
+ DestroyTask(taskId);
+ }
+ else
+ {
+ gTasks[taskId].data[1]++;
+ }
+}
+
+void DoDecorationSoundEffect(s16 arg)
+{
+ u8 taskId = CreateTask(Task_DecorationSoundEffect, 5);
+ gTasks[taskId].data[0] = arg;
+ gTasks[taskId].data[1] = 0;
+}
+
+void SpriteCB_YellowCave4Sparkle(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+ if (sprite->data[0] == 8)
+ PlaySE(SE_W215);
+ if (sprite->data[0] >= 32)
+ DestroySprite(sprite);
+}
+
+void DoYellowCave4Sparkle(void)
+{
+ s16 x = gMapObjects[gPlayerAvatar.mapObjectId].coords2.x;
+ s16 y = gMapObjects[gPlayerAvatar.mapObjectId].coords2.y;
+ u8 spriteId;
+
+ sub_8060470(&x, &y, 8, 4);
+ spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], x, y, 0);
+ if (spriteId != MAX_SPRITES)
+ {
+ gSprites[spriteId].coordOffsetEnabled = TRUE;
+ gSprites[spriteId].oam.priority = 1;
+ gSprites[spriteId].oam.paletteNum = 5;
+ gSprites[spriteId].callback = SpriteCB_YellowCave4Sparkle;
+ gSprites[spriteId].data[0] = 0;
+ }
+}
+
+bool8 FldEff_SandPillar(void)
+{
+ s16 x, y;
+
+ ScriptContext2_Enable();
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ gFieldEffectArguments[5] = x;
+ gFieldEffectArguments[6] = y;
+
+ switch (player_get_direction_lower_nybble())
+ {
+ case DIR_SOUTH:
+ CreateSprite(
+ &gSpriteTemplate_83D26A0,
+ gSprites[gPlayerAvatar.spriteId].oam.x + 8,
+ gSprites[gPlayerAvatar.spriteId].oam.y + 32,
+ 0);
+ break;
+ case DIR_NORTH:
+ CreateSprite(
+ &gSpriteTemplate_83D26A0,
+ gSprites[gPlayerAvatar.spriteId].oam.x + 8,
+ gSprites[gPlayerAvatar.spriteId].oam.y,
+ 148);
+ break;
+ case DIR_WEST:
+ CreateSprite(
+ &gSpriteTemplate_83D26A0,
+ gSprites[gPlayerAvatar.spriteId].oam.x - 8,
+ gSprites[gPlayerAvatar.spriteId].oam.y + 16,
+ 148);
+ break;
+ case DIR_EAST:
+ CreateSprite(
+ &gSpriteTemplate_83D26A0,
+ gSprites[gPlayerAvatar.spriteId].oam.x + 24,
+ gSprites[gPlayerAvatar.spriteId].oam.y + 16,
+ 148);
+ break;
+ }
+
+ return FALSE;
+}
+
+void SpriteCB_SandPillar_0(struct Sprite *sprite)
+{
+ PlaySE(SE_W088);
+ if (MapGridGetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1) == 646)
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 3586);
+ else
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1, 644);
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 522);
+ CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6] - 1);
+ CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]);
+ sprite->data[0] = 0;
+ sprite->callback = SpriteCB_SandPillar_1;
+}
+
+void SpriteCB_SandPillar_1(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 18)
+ {
+ sprite->data[0]++;
+ }
+ else
+ {
+ MapGridSetMetatileIdAt(gFieldEffectArguments[5], gFieldEffectArguments[6], 3724);
+ CurrentMapDrawMetatileAt(gFieldEffectArguments[5], gFieldEffectArguments[6]);
+ sprite->data[0] = 0;
+ sprite->callback = SpriteCB_SandPillar_2;
+ }
+}
+
+void SpriteCB_SandPillar_2(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SAND_PILLAR);
+ EnableBothScriptContexts();
+}
+
+void GetShieldToyTVDecorationInfo(void)
+{
+ s16 x, y;
+ s32 metatileId;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+
+ metatileId = MapGridGetMetatileIdAt(x, y);
+
+ switch (metatileId)
+ {
+ case 822:
+ ConvertIntToDecimalStringN(gStringVar1, 100, STR_CONV_MODE_LEFT_ALIGN, 3);
+ StringCopy(gStringVar2, gSecretBaseText_GoldRank);
+ gScriptResult = 0;
+ break;
+ case 734:
+ ConvertIntToDecimalStringN(gStringVar1, 50, STR_CONV_MODE_LEFT_ALIGN, 2);
+ StringCopy(gStringVar2, gSecretBaseText_SilverRank);
+ gScriptResult = 0;
+ break;
+ case 756:
+ gScriptResult = 1;
+ break;
+ case 757:
+ gScriptResult = 2;
+ break;
+ case 758:
+ gScriptResult = 3;
+ break;
+ }
+}
diff --git a/src/field/fldeff_poison.c b/src/field/fldeff_poison.c
new file mode 100644
index 000000000..0a0cf5539
--- /dev/null
+++ b/src/field/fldeff_poison.c
@@ -0,0 +1,44 @@
+#include "global.h"
+#include "fldeff_poison.h"
+#include "task.h"
+#include "songs.h"
+#include "sound.h"
+
+static void Task_FieldPoisonEffect(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ data[1] += 2;
+ if (data[1] > 8)
+ {
+ data[0]++;
+ }
+ break;
+ case 1:
+ data[1] -= 2;
+ if (data[1] == 0)
+ {
+ data[0]++;
+ }
+ break;
+ case 2:
+ DestroyTask(taskId);
+ return;
+ }
+
+ REG_MOSAIC = (data[1] << 4) | data[1];
+}
+
+void DoFieldPoisonEffect(void)
+{
+ PlaySE(SE_DOKU);
+ CreateTask(Task_FieldPoisonEffect, 80);
+}
+
+bool32 FieldPoisonEffectIsRunning(void)
+{
+ return FuncIsActiveTask(Task_FieldPoisonEffect);
+}
diff --git a/src/field/fldeff_recordmixing.c b/src/field/fldeff_recordmixing.c
new file mode 100644
index 000000000..ec72885b5
--- /dev/null
+++ b/src/field/fldeff_recordmixing.c
@@ -0,0 +1,83 @@
+#include "global.h"
+#include "field_map_obj.h"
+#include "fldeff_recordmixing.h"
+#include "sprite.h"
+
+extern const struct OamData gFieldOamData_32x8;
+
+static const u8 sSpriteImage_83D26C0[] = INCBIN_U8("graphics/unknown_sprites/83D2860/0.4bpp");
+static const u8 sSpriteImage_83D2740[] = INCBIN_U8("graphics/unknown_sprites/83D2860/1.4bpp");
+static const u8 sSpriteImage_83D27C0[] = INCBIN_U8("graphics/unknown_sprites/83D2860/2.4bpp");
+static const u16 sPalette_3D2840[] = INCBIN_U16("graphics/unknown/unknown_3D2840.gbapal");
+
+
+static const struct SpriteFrameImage sSpriteImageTable_83FD950[] =
+{
+ { sSpriteImage_83D26C0, sizeof(sSpriteImage_83D26C0) },
+ { sSpriteImage_83D2740, sizeof(sSpriteImage_83D2740) },
+ { sSpriteImage_83D27C0, sizeof(sSpriteImage_83D27C0) },
+};
+
+static const struct SpritePalette sUnknown_083D2878 = { sPalette_3D2840, 0x1000 };
+
+static const union AnimCmd sSpriteAnim_83D2880[] =
+{
+ ANIMCMD_FRAME(0, 30),
+ ANIMCMD_FRAME(1, 30),
+ ANIMCMD_FRAME(2, 30),
+ ANIMCMD_JUMP(0),
+};
+
+static const union AnimCmd *const sSpriteAnimTable_83D2890[] =
+{
+ sSpriteAnim_83D2880,
+};
+
+static const struct SpriteTemplate sSpriteTemplate_83D2894 =
+{
+ .tileTag = 0xFFFF,
+ .paletteTag = 0x1000,
+ .oam = &gFieldOamData_32x8,
+ .anims = sSpriteAnimTable_83D2890,
+ .images = sSpriteImageTable_83FD950,
+ .affineAnims = gDummySpriteAffineAnimTable,
+ .callback = SpriteCallbackDummy,
+};
+
+u8 CreateRecordMixingSprite(void)
+{
+ u8 spriteId;
+
+ LoadSpritePalette(&sUnknown_083D2878);
+
+ spriteId = CreateSprite(&sSpriteTemplate_83D2894, 0, 0, 82);
+
+ if (spriteId == MAX_SPRITES)
+ {
+ return MAX_SPRITES;
+ }
+ else
+ {
+ struct Sprite *sprite = &gSprites[spriteId];
+ sub_8060388(16, 13, &sprite->pos1.x, &sprite->pos1.y);
+ sprite->coordOffsetEnabled = TRUE;
+ sprite->pos1.x += 16;
+ sprite->pos1.y += 2;
+ }
+
+ return spriteId;
+}
+
+void DestroyRecordMixingSprite(void)
+{
+ int i;
+
+ for (i = 0; i < MAX_SPRITES; i++)
+ {
+ if (gSprites[i].template == &sSpriteTemplate_83D2894)
+ {
+ FreeSpritePalette(&gSprites[i]);
+ DestroySprite(&gSprites[i]);
+ }
+ }
+}
diff --git a/src/field/fldeff_secret_base_pc.c b/src/field/fldeff_secret_base_pc.c
new file mode 100644
index 000000000..ead970b27
--- /dev/null
+++ b/src/field/fldeff_secret_base_pc.c
@@ -0,0 +1,69 @@
+#include "global.h"
+#include "event_data.h"
+#include "field_camera.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "fieldmap.h"
+#include "script.h"
+#include "songs.h"
+#include "sound.h"
+#include "task.h"
+
+static void Task_SecretBasePCTurnOn(u8);
+
+u32 FldEff_SecretBasePCTurnOn(void)
+{
+ s16 x, y;
+ u8 taskId;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ taskId = CreateTask(Task_SecretBasePCTurnOn, 0);
+ gTasks[taskId].data[0] = x;
+ gTasks[taskId].data[1] = y;
+ gTasks[taskId].data[2] = 0;
+
+ return 0;
+}
+
+static void Task_SecretBasePCTurnOn(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[2])
+ {
+ case 4:
+ case 12:
+ MapGridSetMetatileIdAt(data[0], data[1], 548);
+ CurrentMapDrawMetatileAt(data[0], data[1]);
+ break;
+ case 8:
+ case 16:
+ MapGridSetMetatileIdAt(data[0], data[1], 544);
+ CurrentMapDrawMetatileAt(data[0], data[1]);
+ break;
+ case 20:
+ MapGridSetMetatileIdAt(data[0], data[1], 548);
+ CurrentMapDrawMetatileAt(data[0], data[1]);
+ FieldEffectActiveListRemove(FLDEFF_SECRET_BASE_PC_TURN_ON);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ return;
+ }
+
+ data[2]++;
+}
+
+void DoSecretBasePCTurnOffEffect(void)
+{
+ s16 x, y;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&x, &y);
+ PlaySE(SE_PC_OFF);
+
+ if (!VarGet(VAR_0x4054))
+ MapGridSetMetatileIdAt(x, y, 3616);
+ else
+ MapGridSetMetatileIdAt(x, y, 3617);
+
+ CurrentMapDrawMetatileAt(x, y);
+}
diff --git a/src/field/fldeff_secretpower.c b/src/field/fldeff_secretpower.c
new file mode 100644
index 000000000..5ec4407ae
--- /dev/null
+++ b/src/field/fldeff_secretpower.c
@@ -0,0 +1,304 @@
+#include "global.h"
+#include "event_data.h"
+#include "fieldmap.h"
+#include "field_effect.h"
+#include "field_player_avatar.h"
+#include "metatile_behavior.h"
+#include "metatile_behaviors.h"
+#include "overworld.h"
+#include "pokemon_menu.h"
+#include "rom6.h"
+#include "script.h"
+#include "secret_base.h"
+#include "songs.h"
+#include "sound.h"
+
+extern u8 gUnknown_081A2CE6[];
+extern u8 gUnknown_081A2D3E[];
+extern u8 gUnknown_081A2D96[];
+
+extern struct SpriteTemplate gSpriteTemplate_83D2614;
+extern struct SpriteTemplate gSpriteTemplate_83D262C;
+extern struct SpriteTemplate gSpriteTemplate_83D2644;
+
+void sub_80C639C(void);
+void sub_80C63E8(void);
+void sub_80C6468(struct Sprite *);
+void sub_80C6498(struct Sprite *);
+void sub_80C64A8(void);
+void sub_80C64F4(void);
+void sub_80C65C4(struct Sprite *);
+void sub_80C65FC(struct Sprite *);
+void sub_80C660C(void);
+void sub_80C6658(void);
+void sub_80C66D8(struct Sprite *sprite);
+void sub_80C6708(struct Sprite *sprite);
+
+void sub_80C6264(void)
+{
+ sub_80BBFD8(&gUnknown_0203923C, gMapHeader.events);
+ sub_80BB5E4();
+}
+
+void sub_80C6280(void)
+{
+ switch (gFieldEffectArguments[1])
+ {
+ case 1:
+ gFieldEffectArguments[5] = 8;
+ gFieldEffectArguments[6] = 40;
+ break;
+ case 2:
+ gFieldEffectArguments[5] = 8;
+ gFieldEffectArguments[6] = 8;
+ break;
+ case 3:
+ gFieldEffectArguments[5] = -8;
+ gFieldEffectArguments[6] = 24;
+ break;
+ case 4:
+ gFieldEffectArguments[5] = 24;
+ gFieldEffectArguments[6] = 24;
+ break;
+ }
+}
+
+bool8 SetUpFieldMove_SecretPower(void)
+{
+ u8 behavior;
+
+ sub_80BB63C();
+
+ if (gScriptResult == 1 || player_get_direction_lower_nybble() != DIR_NORTH)
+ return FALSE;
+
+ GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y);
+ behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y);
+
+ if (MetatileBehavior_IsSecretBaseCave(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C639C;
+ return TRUE;
+ }
+
+ if (MetatileBehavior_IsSecretBaseTree(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C64A8;
+ return TRUE;
+ }
+
+ if (MetatileBehavior_IsSecretBaseShrub(behavior) == TRUE)
+ {
+ sub_80C6264();
+ gFieldCallback = FieldCallback_Teleport;
+ gUnknown_03005CE4 = sub_80C660C;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_80C639C(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2CE6);
+}
+
+bool8 FldEff_UseSecretPowerCave(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C63E8 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C63E8;
+
+ return FALSE;
+}
+
+void sub_80C63E8(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_CAVE);
+ FieldEffectStart(FLDEFF_SECRET_POWER_CAVE);
+}
+
+bool8 FldEff_SecretPowerCave(void)
+{
+ sub_80C6280();
+ CreateSprite(
+ &gSpriteTemplate_83D2614,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+ return FALSE;
+}
+
+void sub_80C644C(struct Sprite *sprite)
+{
+ PlaySE(SE_W088);
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6468;
+}
+
+void sub_80C6468(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 40)
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] == 20 )
+ sub_80BB800();
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6498;
+ }
+}
+
+void sub_80C6498(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_CAVE);
+ EnableBothScriptContexts();
+}
+
+void sub_80C64A8(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2D3E);
+}
+
+bool8 FldEff_UseSecretPowerTree(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C64F4 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C64F4;
+
+ return FALSE;
+}
+
+void sub_80C64F4(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_TREE);
+ FieldEffectStart(FLDEFF_SECRET_POWER_TREE);
+}
+
+bool8 FldEff_SecretPowerTree(void)
+{
+ s16 behavior = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y) & 0xFFF;
+
+ if (behavior == MB_SECRET_BASE_SPOT_TREE_1)
+ {
+ gFieldEffectArguments[7] = 0;
+ }
+
+ if (behavior == MB_SECRET_BASE_SPOT_TREE_2)
+ {
+ gFieldEffectArguments[7] = 2;
+ }
+
+ sub_80C6280();
+
+ CreateSprite(
+ &gSpriteTemplate_83D262C,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+
+ if (gFieldEffectArguments[7] == 1 || gFieldEffectArguments[7] == 3)
+ sub_80BB800();
+
+ return FALSE;
+}
+
+void sub_80C6598(struct Sprite *sprite)
+{
+ PlaySE(SE_W010);
+ sprite->animNum = gFieldEffectArguments[7];
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C65C4;
+}
+
+void sub_80C65C4(struct Sprite *sprite)
+{
+ sprite->data[0]++;
+
+ if (sprite->data[0] >= 40)
+ {
+ if (gFieldEffectArguments[7] == 0 || gFieldEffectArguments[7] == 2)
+ sub_80BB800();
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C65FC;
+ }
+}
+
+
+void sub_80C65FC(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_TREE);
+ EnableBothScriptContexts();
+}
+
+void sub_80C660C(void)
+{
+ gFieldEffectArguments[0] = gLastFieldPokeMenuOpened;
+ ScriptContext1_SetupScript(gUnknown_081A2D96);
+}
+
+bool8 FldEff_UseSecretPowerShrub(void)
+{
+ u8 taskId = oei_task_add();
+
+ gTasks[taskId].data[8] = (uintptr_t)sub_80C6658 >> 16;
+ gTasks[taskId].data[9] = (uintptr_t)sub_80C6658;
+
+ return FALSE;
+}
+
+void sub_80C6658(void)
+{
+ FieldEffectActiveListRemove(FLDEFF_USE_SECRET_POWER_SHRUB);
+ FieldEffectStart(FLDEFF_SECRET_POWER_SHRUB);
+}
+
+bool8 FldEff_SecretPowerShrub(void)
+{
+ sub_80C6280();
+ CreateSprite(
+ &gSpriteTemplate_83D2644,
+ gSprites[gPlayerAvatar.spriteId].oam.x + gFieldEffectArguments[5],
+ gSprites[gPlayerAvatar.spriteId].oam.y + gFieldEffectArguments[6],
+ 148);
+ return FALSE;
+}
+
+void sub_80C66BC(struct Sprite *sprite)
+{
+ PlaySE(SE_W077);
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C66D8;
+}
+
+void sub_80C66D8(struct Sprite *sprite)
+{
+ if (sprite->data[0] < 40)
+ {
+ sprite->data[0]++;
+ if (sprite->data[0] == 20 )
+ sub_80BB800();
+ }
+ else
+ {
+ sprite->data[0] = 0;
+ sprite->callback = sub_80C6708;
+ }
+}
+
+
+void sub_80C6708(struct Sprite *sprite)
+{
+ FieldEffectStop(sprite, FLDEFF_SECRET_POWER_SHRUB);
+ EnableBothScriptContexts();
+}
diff --git a/src/field/secret_base.c b/src/field/secret_base.c
index 8c1b7c8c1..34352f39a 100644
--- a/src/field/secret_base.c
+++ b/src/field/secret_base.c
@@ -12,6 +12,7 @@
#include "field_specials.h"
#include "field_weather.h"
#include "fieldmap.h"
+#include "fldeff_decoration.h"
#include "link.h"
#include "main.h"
#include "sound.h"
@@ -47,11 +48,6 @@ static void sub_80BCBF8(u8 taskId);
static void sub_80BCC54(u8 taskId);
static void Task_SecretBasePC_Registry(u8 taskId);
-extern void DoDecorationSoundEffect(s16 metatileId);
-extern void sub_80C6A54(s16 x, s16 y);
-extern void sub_80C68A4(s16 metatileId, s16 x, s16 y);
-extern void DoYellowCave4Sparkle(void);
-
extern u8 gUnknown_0815F399[];
extern u8 gUnknown_0815F49A[];
extern u8 gUnknown_020387DC;