diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2018-03-31 14:37:24 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2018-03-31 14:37:24 -0400 |
commit | 0015d6fe2c6a53c5f757599122ae9fd1a156a69f (patch) | |
tree | 81b7269c767da1ad4a5a9ac01e58ead5e92f0983 /src/fldeff_secretpower.c | |
parent | 46bc01f0dd1a3435b3c6ce71e1be0d19b7aaa5bd (diff) | |
parent | 59f81c5f2a25ec77baf4a30c3da9ccb7675d1562 (diff) |
Merge branch 'master' into contest_link_80C2020
Diffstat (limited to 'src/fldeff_secretpower.c')
-rw-r--r-- | src/fldeff_secretpower.c | 526 |
1 files changed, 526 insertions, 0 deletions
diff --git a/src/fldeff_secretpower.c b/src/fldeff_secretpower.c new file mode 100644 index 000000000..d1df03d84 --- /dev/null +++ b/src/fldeff_secretpower.c @@ -0,0 +1,526 @@ +#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 "constants/songs.h" +#include "sound.h" + +extern u8 gUnknown_081A2CE6[]; +extern u8 gUnknown_081A2D3E[]; +extern u8 gUnknown_081A2D96[]; + +const u8 gSpriteImage_83D198C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/0.4bpp"); +const u8 gSpriteImage_83D1A0C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/1.4bpp"); +const u8 gSpriteImage_83D1A8C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/2.4bpp"); +const u8 gSpriteImage_83D1B0C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/3.4bpp"); +const u8 gSpriteImage_83D1B8C[] = INCBIN_U8("graphics/unknown_sprites/83D259C/4.4bpp"); +const u8 gUnusedEmptySpace_83D1C0C[32] = {0}; +const u16 gFieldEffectObjectPalette7[] = INCBIN_U16("graphics/field_effect_objects/palettes/07.gbapal"); +const u8 gSpriteImage_83D1C4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/0.4bpp"); +const u8 gSpriteImage_83D1CCC[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/1.4bpp"); +const u8 gSpriteImage_83D1D4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/2.4bpp"); +const u8 gSpriteImage_83D1DCC[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/3.4bpp"); +const u8 gSpriteImage_83D1E4C[] = INCBIN_U8("graphics/unknown_sprites/83D25EC/4.4bpp"); +const u8 gSpriteImage_83D1ECC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/0.4bpp"); +const u8 gSpriteImage_83D1F4C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/1.4bpp"); +const u8 gSpriteImage_83D1FCC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/2.4bpp"); +const u8 gSpriteImage_83D204C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/3.4bpp"); +const u8 gSpriteImage_83D20CC[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/4.4bpp"); +const u8 gSpriteImage_83D214C[] = INCBIN_U8("graphics/unknown_sprites/83D25C4/5.4bpp"); // unused +const u16 gFieldEffectObjectPalette8[] = INCBIN_U16("graphics/field_effect_objects/palettes/08.gbapal"); +const u8 gSpriteImage_83D21EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/0.4bpp"); +const u8 gSpriteImage_83D22EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/1.4bpp"); +const u8 gSpriteImage_83D23EC[] = INCBIN_U8("graphics/unknown_sprites/83D2688/2.4bpp"); + +const struct OamData gOamData_83D24EC = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 2, + .paletteNum = 0, + .affineParam = 0, +}; + +const union AnimCmd gSpriteAnim_83D24F4[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D250C[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D2524[] = +{ + ANIMCMD_FRAME(4, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(0, 8), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D253C[] = +{ + ANIMCMD_FRAME(0, 8, .hFlip = TRUE), + ANIMCMD_FRAME(1, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(3, 8, .hFlip = TRUE), + ANIMCMD_FRAME(4, 8, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D2554[] = +{ + ANIMCMD_FRAME(4, 8, .hFlip = TRUE), + ANIMCMD_FRAME(3, 8, .hFlip = TRUE), + ANIMCMD_FRAME(2, 8, .hFlip = TRUE), + ANIMCMD_FRAME(1, 8, .hFlip = TRUE), + ANIMCMD_FRAME(0, 8, .hFlip = TRUE), + ANIMCMD_END, +}; + +const union AnimCmd gSpriteAnim_83D256C[] = +{ + ANIMCMD_FRAME(0, 8), + ANIMCMD_FRAME(1, 8), + ANIMCMD_FRAME(2, 8), + ANIMCMD_FRAME(3, 8), + ANIMCMD_FRAME(4, 8), + ANIMCMD_END, +}; + +const union AnimCmd *const gSpriteAnimTable_83D2584[] = +{ + gSpriteAnim_83D24F4, +}; + +const union AnimCmd *const gSpriteAnimTable_83D2588[] = +{ + gSpriteAnim_83D250C, + gSpriteAnim_83D2524, + gSpriteAnim_83D253C, + gSpriteAnim_83D2554, +}; + +const union AnimCmd *const gSpriteAnimTable_83D2598[] = +{ + gSpriteAnim_83D256C, +}; + +const struct SpriteFrameImage gSpriteImageTable_83D259C[] = +{ + {gSpriteImage_83D198C, 0x80}, + {gSpriteImage_83D1A0C, 0x80}, + {gSpriteImage_83D1A8C, 0x80}, + {gSpriteImage_83D1B0C, 0x80}, + {gSpriteImage_83D1B8C, 0x80}, +}; + +const struct SpriteFrameImage gSpriteImageTable_83D25C4[] = +{ + {gSpriteImage_83D1ECC, 0x80}, + {gSpriteImage_83D1F4C, 0x80}, + {gSpriteImage_83D1FCC, 0x80}, + {gSpriteImage_83D204C, 0x80}, + {gSpriteImage_83D20CC, 0x80}, +}; + +const struct SpriteFrameImage gSpriteImageTable_83D25EC[] = +{ + {gSpriteImage_83D1C4C, 0x80}, + {gSpriteImage_83D1CCC, 0x80}, + {gSpriteImage_83D1D4C, 0x80}, + {gSpriteImage_83D1DCC, 0x80}, + {gSpriteImage_83D1E4C, 0x80}, +}; + +void sub_80C644C(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_83D2614 = +{ + .tileTag = 0xFFFF, + .paletteTag = 4099, + .oam = &gOamData_83D24EC, + .anims = gSpriteAnimTable_83D2584, + .images = gSpriteImageTable_83D259C, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80C644C, +}; + +void sub_80C6598(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_83D262C = +{ + .tileTag = 0xFFFF, + .paletteTag = 4104, + .oam = &gOamData_83D24EC, + .anims = gSpriteAnimTable_83D2588, + .images = gSpriteImageTable_83D25C4, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80C6598, +}; + +void sub_80C66BC(struct Sprite *); +const struct SpriteTemplate gSpriteTemplate_83D2644 = +{ + .tileTag = 0xFFFF, + .paletteTag = 4104, + .oam = &gOamData_83D24EC, + .anims = gSpriteAnimTable_83D2598, + .images = gSpriteImageTable_83D25EC, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = sub_80C66BC, +}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo7 = {gFieldEffectObjectPalette7, 0x1003}; +const struct SpritePalette gFieldEffectObjectPaletteInfo8 = {gFieldEffectObjectPalette8, 0x1008}; + +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; + } +} + +#if DEBUG + +void debug_sub_80D93F4(void) +{ + u8 metatile; + + sub_80BB63C(); + + if (gSpecialVar_Result == 1 || player_get_direction_lower_nybble() != 2) + { + ScriptContext2_Disable(); + return; + } + + GetXYCoordsOneStepInFrontOfPlayer(&gUnknown_0203923C.x, &gUnknown_0203923C.y); + metatile = MapGridGetMetatileBehaviorAt(gUnknown_0203923C.x, gUnknown_0203923C.y); + if (MetatileBehavior_IsSecretBaseCave(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C639C(); + } + else if (MetatileBehavior_IsSecretBaseTree(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C64A8(); + } + else if (MetatileBehavior_IsSecretBaseShrub(metatile) == TRUE) + { + sub_80C6264(); + gLastFieldPokeMenuOpened = 0; + sub_80C660C(); + } + else + { + ScriptContext2_Disable(); + } +} + +#endif + +bool8 SetUpFieldMove_SecretPower(void) +{ + u8 behavior; + + sub_80BB63C(); + + if (gSpecialVar_Result == 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(); +} |