diff options
author | Marcus Huderle <huderlem@gmail.com> | 2017-11-19 19:51:37 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-19 19:51:37 -0800 |
commit | 0f42ef11742cfc141b720846777e43d96a64ffc3 (patch) | |
tree | aae4004235e52acb73289336d37e09b4a8677dbf /src | |
parent | 4a365e9230962daf875a0444d51d76639c07c827 (diff) | |
parent | 71ab629e9e4f29fc502411d41b0fd53064d94e02 (diff) |
Merge pull request #463 from sceptillion/master
decompile fldeff_recordmixing
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/battle_setup.c | 2 | ||||
-rw-r--r-- | src/engine/record_mixing.c | 2 | ||||
-rw-r--r-- | src/field/field_effect.c | 2 | ||||
-rw-r--r-- | src/field/field_poison.c | 2 | ||||
-rw-r--r-- | src/field/fldeff_berrytree.c | 56 | ||||
-rw-r--r-- | src/field/fldeff_cut.c | 2 | ||||
-rw-r--r-- | src/field/fldeff_decoration.c | 309 | ||||
-rw-r--r-- | src/field/fldeff_poison.c | 44 | ||||
-rw-r--r-- | src/field/fldeff_recordmixing.c | 83 | ||||
-rw-r--r-- | src/field/fldeff_secret_base_pc.c | 69 | ||||
-rw-r--r-- | src/field/fldeff_secretpower.c | 304 | ||||
-rw-r--r-- | src/field/secret_base.c | 6 |
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; |