From 416ef99e4217e1f309b7560974fb5dabfa1329a8 Mon Sep 17 00:00:00 2001 From: scnorton Date: Tue, 6 Jun 2017 17:58:40 -0400 Subject: Pick up decompiling field_effect.s --- src/field_effect.c | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index bbc1144c1..e13809d27 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1,8 +1,11 @@ #include "global.h" -#include "field_effect.h" +#include "data2.h" #include "field_weather.h" +#include "decompress.h" #include "sprite.h" +#include "palette.h" #include "text.h" +#include "field_effect.h" typedef bool8 (*FldEffCmd)(u8 **, u32 *); @@ -207,3 +210,96 @@ bool8 FieldEffectActiveListContains(u8 id) return TRUE; return FALSE; } + +u8 CreateTrainerSprite_BirchSpeech(u8 gender, s16 x, s16 y, u8 subpriority, u8 *buffer) +{ + struct SpriteTemplate spriteTemplate; + LoadCompressedObjectPaletteOverrideBuffer(&gTrainerFrontPicPaletteTable[gender], buffer); + LoadCompressedObjectPicOverrideBuffer(&gTrainerFrontPicTable[gender], buffer); + spriteTemplate.tileTag = gTrainerFrontPicTable[gender].tag; + spriteTemplate.paletteTag = gTrainerFrontPicPaletteTable[gender].tag; + spriteTemplate.oam = &gOamData_839F0F4; + spriteTemplate.anims = gDummySpriteAnimTable; + spriteTemplate.images = NULL; + spriteTemplate.affineAnims = gDummySpriteAffineAnimTable; + spriteTemplate.callback = SpriteCallbackDummy; + return CreateSprite(&spriteTemplate, x, y, subpriority); +} + +void LoadTrainerGfx_TrainerCard(u8 gender, u16 palOffset, u8 *dest) +{ + LZDecompressVram(gTrainerFrontPicTable[gender].data, dest); + LoadCompressedPalette(gTrainerFrontPicPaletteTable[gender].data, palOffset, 0x20); +} + +u8 CreateBirchSprite(s16 x, s16 y, u8 subpriority) +{ + LoadSpritePalette(&gUnknown_0839F114); + return CreateSprite(&gSpriteTemplate_839F128, x, y, subpriority); +} + +u8 CreateMonSprite_PicBox(u16 species, s16 x, s16 y, u8 subpriority) +{ + DecompressPicFromTable_2(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, gUnknown_081FAF4C[3], gUnknown_081FAF4C[3], species); + LoadCompressedObjectPalette(&gMonPaletteTable[species]); + GetMonSpriteTemplate_803C56C(species, 3); + gUnknown_02024E8C.paletteTag = gMonPaletteTable[0].tag; + sub_807DE38(IndexOfSpritePaletteTag(gMonPaletteTable[0].tag) + 0x10); + return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); +} + +u8 CreateMonSprite_FieldMove(u16 species, u32 d, u32 g, s16 x, s16 y, u8 subpriority) +{ + const struct SpritePalette *spritePalette; + HandleLoadSpecialPokePic(&gMonFrontPicTable[species], gMonFrontPicCoords[species].coords, gMonFrontPicCoords[species].y_offset, (u32)gUnknown_081FAF4C[3] /* this is actually u8* or something, pointing to ewram */, gUnknown_081FAF4C[3], species, g); + spritePalette = sub_80409C8(species, d, g); + LoadCompressedObjectPalette(spritePalette); + GetMonSpriteTemplate_803C56C(species, 3); + gUnknown_02024E8C.paletteTag = spritePalette->tag; + sub_807DE38(IndexOfSpritePaletteTag(spritePalette->tag) + 0x10); + return CreateSprite(&gUnknown_02024E8C, x, y, subpriority); +} + +void FreeResourcesAndDestroySprite(struct Sprite *sprite) +{ + sub_807DE68(); + FreeSpritePaletteByTag(GetSpritePaletteTagByPaletteNum(sprite->oam.paletteNum)); + if (sprite->oam.affineMode != 0) + { + FreeOamMatrix(sprite->oam.matrixNum); + } + DestroySprite(sprite); +} + +#undef NONMATCHING +#ifdef NONMATCHING +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed += (((0x1f - curRed) * r) >> 4); + curGreen += (((0x1f - curGreen) * g) >> 4); + curBlue += (((0x1f - curBlue) * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} + +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + int curRed; + int curGreen; + int curBlue; + + curRed = gPlttBufferUnfaded[i] & 0x1f; + curGreen = (gPlttBufferUnfaded[i] & (0x1f << 5)) >> 5; + curBlue = (gPlttBufferUnfaded[i] & (0x1f << 10)) >> 10; + curRed -= ((curRed * r) >> 4); + curGreen -= ((curGreen * g) >> 4); + curBlue -= ((curBlue * b) >> 4); + gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); +} +#endif -- cgit v1.2.3 From a89c10aa0a2426096a9588f2a5294825f69e3e7f Mon Sep 17 00:00:00 2001 From: scnorton Date: Tue, 6 Jun 2017 18:56:46 -0400 Subject: Pokecenter Heal and Hall Of Fame Record Effect, 1 --- src/field_effect.c | 266 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 266 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index e13809d27..72fd281af 100644 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -5,6 +5,7 @@ #include "sprite.h" #include "palette.h" #include "text.h" +#include "task.h" #include "field_effect.h" typedef bool8 (*FldEffCmd)(u8 **, u32 *); @@ -302,4 +303,269 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) curBlue -= ((curBlue * b) >> 4); gPlttBufferFaded[i] = RGB(curRed, curGreen, curBlue); } +#else +__attribute__((naked)) +void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r7,lr}\n" + "\tmov r7, r9\n" + "\tmov r6, r8\n" + "\tpush {r6,r7}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D00 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r9, r5\n" + "\tmov r8, r4\n" + "\tmov r6, r8\n" + "\tands r6, r5\n" + "\tmov r8, r6\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 2\n" + "\tands r6, r4\n" + "\tlsrs r6, 5\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 7\n" + "\tands r4, r5\n" + "\tlsrs r4, 10\n" + "\tmov r7, r9\n" + "\tmov r5, r8\n" + "\tsubs r7, r5\n" + "\tmov r12, r7\n" + "\tmov r7, r12\n" + "\tmuls r7, r1\n" + "\tadds r1, r7, 0\n" + "\tasrs r1, 4\n" + "\tadd r8, r1\n" + "\tmov r5, r9\n" + "\tsubs r1, r5, r6\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tadds r6, r1\n" + "\tsubs r5, r4\n" + "\tmov r9, r5\n" + "\tmov r1, r9\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tadds r4, r1\n" + "\tmov r7, r8\n" + "\tlsls r7, 16\n" + "\tlsls r6, 21\n" + "\torrs r6, r7\n" + "\tlsls r4, 26\n" + "\torrs r4, r6\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D04 @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3,r4}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D00: .4byte gPlttBufferUnfaded\n" + "_08085D04: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} + +__attribute__((naked)) +void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) +{ + asm(".syntax unified\n" + "\tpush {r4-r6,lr}\n" + "\tmov r6, r8\n" + "\tpush {r6}\n" + "\tlsls r0, 16\n" + "\tlsls r1, 24\n" + "\tlsrs r1, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tlsls r3, 24\n" + "\tlsrs r3, 24\n" + "\tldr r4, _08085D78 @ =gPlttBufferUnfaded\n" + "\tlsrs r0, 15\n" + "\tadds r4, r0, r4\n" + "\tldrh r4, [r4]\n" + "\tmovs r5, 0x1F\n" + "\tmov r8, r5\n" + "\tmov r6, r8\n" + "\tands r6, r4\n" + "\tmov r8, r6\n" + "\tmovs r5, 0xF8\n" + "\tlsls r5, 2\n" + "\tands r5, r4\n" + "\tlsrs r5, 5\n" + "\tmovs r6, 0xF8\n" + "\tlsls r6, 7\n" + "\tands r4, r6\n" + "\tlsrs r4, 10\n" + "\tmov r6, r8\n" + "\tmuls r6, r1\n" + "\tadds r1, r6, 0\n" + "\tasrs r1, 4\n" + "\tmov r6, r8\n" + "\tsubs r6, r1\n" + "\tadds r1, r5, 0\n" + "\tmuls r1, r2\n" + "\tasrs r1, 4\n" + "\tsubs r5, r1\n" + "\tadds r1, r4, 0\n" + "\tmuls r1, r3\n" + "\tasrs r1, 4\n" + "\tsubs r4, r1\n" + "\tlsls r6, 16\n" + "\tlsls r5, 21\n" + "\torrs r5, r6\n" + "\tlsls r4, 26\n" + "\torrs r4, r5\n" + "\tlsrs r4, 16\n" + "\tldr r1, _08085D7C @ =gPlttBufferFaded\n" + "\tadds r0, r1\n" + "\tstrh r4, [r0]\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r6}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08085D78: .4byte gPlttBufferUnfaded\n" + "_08085D7C: .4byte gPlttBufferFaded\n" + ".syntax divided"); +} #endif + +void Task_PokecenterHeal(u8 taskId); +extern const void (*gUnknown_0839F268[4])(struct Task *); +u8 CreatePokeballGlowSprite(s16, s16, s16, u16); +u8 PokecenterHealEffectHelper(s16, s16); + +bool8 FldEff_PokecenterHeal(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_PokecenterHeal, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x5d; + task->data[3] = 0x24; + task->data[4] = 0x7c; + task->data[5] = 0x18; + return FALSE; +} + +void Task_PokecenterHeal(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0839F268[task->data[0]](task); +} + +void PokecenterHealEffect_0(struct Task *task) +{ + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 1); + task->data[7] = PokecenterHealEffectHelper(task->data[4], task->data[5]); +} + +void PokecenterHealEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 1) + { + gSprites[task->data[7]].data0++; + task->data[0]++; + } +} + +void PokecenterHealEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 4) + { + task->data[0]++; + } +} + +void PokecenterHealEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_POKECENTER_HEAL); + DestroyTask(FindTaskIdByFunc(Task_PokecenterHeal)); + } +} + +void Task_HallOfFameRecord(u8 taskId); +extern const void (*gUnknown_0839F278[4])(struct Task *); +void HallOfFameRecordEffectHelper(u8, u8, u8, u8); + +bool8 FldEff_HallOfFameRecord(void) +{ + u8 nPokemon; + struct Task *task; + + nPokemon = CalculatePlayerPartyCount(); + task = &gTasks[CreateTask(Task_HallOfFameRecord, 0xff)]; + task->data[1] = nPokemon; + task->data[2] = 0x75; + task->data[3] = 0x34; + return FALSE; +} + +void Task_HallOfFameRecord(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + gUnknown_0839F278[task->data[0]](task); +} + +void HallOfFameRecordEffect_0(struct Task *task) +{ + u8 taskId; + task->data[0]++; + task->data[6] = CreatePokeballGlowSprite(task->data[1], task->data[2], task->data[3], 0); + taskId = FindTaskIdByFunc(Task_HallOfFameRecord); + HallOfFameRecordEffectHelper(taskId, 0x78, 0x18, 0); + HallOfFameRecordEffectHelper(taskId, 0x28, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0x48, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xa8, 0x08, 1); + HallOfFameRecordEffectHelper(taskId, 0xc8, 0x08, 1); +} + +void HallOfFameRecordEffect_1(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 1) + { + task->data[15]++; // was this ever initialized? is this ever used? + task->data[0]++; + } +} + +void HallOfFameRecordEffect_2(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 4) + { + task->data[0]++; + } +} + +void HallOfFameRecordEffect_3(struct Task *task) +{ + if (gSprites[task->data[6]].data0 > 6) + { + DestroySprite(&gSprites[task->data[6]]); + FieldEffectActiveListRemove(FLDEFF_HALL_OF_FAME_RECORD); + DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); + } +} -- cgit v1.2.3 From 12a379873526bbaf819ed3dc8ff70a9ee1c3f397 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 6 Jun 2017 22:23:10 -0400 Subject: Pokecenter and HOF field effects, 2 --- src/field_effect.c | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 214 insertions(+), 1 deletion(-) mode change 100644 => 100755 src/field_effect.c (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c old mode 100644 new mode 100755 index 72fd281af..1dfc7e107 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -6,6 +6,8 @@ #include "palette.h" #include "text.h" #include "task.h" +#include "sound.h" +#include "songs.h" #include "field_effect.h" typedef bool8 (*FldEffCmd)(u8 **, u32 *); @@ -508,7 +510,7 @@ void PokecenterHealEffect_3(struct Task *task) void Task_HallOfFameRecord(u8 taskId); extern const void (*gUnknown_0839F278[4])(struct Task *); -void HallOfFameRecordEffectHelper(u8, u8, u8, u8); +void HallOfFameRecordEffectHelper(s16, s16, s16, u8); bool8 FldEff_HallOfFameRecord(void) { @@ -569,3 +571,214 @@ void HallOfFameRecordEffect_3(struct Task *task) DestroyTask(FindTaskIdByFunc(Task_HallOfFameRecord)); } } + +void SpriteCB_PokeballGlowEffect(struct Sprite *); +extern const void (*gUnknown_0839F288[8])(struct Sprite *); +extern const struct SpriteTemplate gSpriteTemplate_839F208; +extern const struct SpriteTemplate gSpriteTemplate_839F220; +extern const struct SpriteTemplate gSpriteTemplate_839F238; +extern const struct SpriteTemplate gSpriteTemplate_839F250; +extern const struct SubspriteTable gUnknown_0839F1A0; +extern const struct SubspriteTable gUnknown_0839F1C8; +extern const struct Coords16 gUnknown_0839F2A8[6]; + +u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateInvisibleSprite(SpriteCB_PokeballGlowEffect); + sprite = &gSprites[spriteId]; + sprite->pos2.x = x; + sprite->pos2.y = y; + sprite->data5 = data5; + sprite->data6 = data6; + sprite->data7 = spriteId; + return spriteId; +} + +void SpriteCB_PokeballGlowEffect(struct Sprite *sprite) +{ + gUnknown_0839F288[sprite->data0](sprite); +} + +void PokeballGlowEffect_0(struct Sprite *sprite) +{ + u8 endSpriteId; + if (sprite->data1 == 0 || (--sprite->data1) == 0) + { + sprite->data1 = 25; + endSpriteId = CreateSpriteAtEnd(&gSpriteTemplate_839F208, gUnknown_0839F2A8[sprite->data2].x + sprite->pos2.x, gUnknown_0839F2A8[sprite->data2].y + sprite->pos2.y, 0); + gSprites[endSpriteId].oam.priority = 2; + gSprites[endSpriteId].data0 = sprite->data7; + sprite->data2++; + sprite->data6--; + PlaySE(SE_BOWA); + } + if (sprite->data6 == 0) + { + sprite->data1 = 32; + sprite->data0++; + } +} + +extern const u8 gUnknown_0839F2C0[4]; // red +extern const u8 gUnknown_0839F2C4[4]; // green +extern const u8 gUnknown_0839F2C8[4]; // blue + +void PokeballGlowEffect_1(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->data0++; + sprite->data1 = 8; + sprite->data2 = 0; + sprite->data3 = 0; + if (sprite->data5) + { + PlayFanfare(BGM_ME_ASA); + } + } +} + +void PokeballGlowEffect_2(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data1) == 0) + { + sprite->data1 = 8; + sprite->data2++; + sprite->data2 &= 3; + if (sprite->data2 == 0) + { + sprite->data3++; + } + } + phase = (sprite->data2 + 3) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = (sprite->data2 + 2) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = (sprite->data2 + 1) & 3; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + phase = sprite->data2; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + if (sprite->data3 > 2) + { + sprite->data0++; + sprite->data1 = 8; + sprite->data2 = 0; + } +} + +void PokeballGlowEffect_3(struct Sprite *sprite) +{ + u8 phase; + if ((--sprite->data1) == 0) + { + sprite->data1 = 8; + sprite->data2++; + sprite->data2 &= 3; + if (sprite->data2 == 3) + { + sprite->data0++; + sprite->data1 = 30; + } + } + phase = sprite->data2; + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x108, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x106, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x102, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x105, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); + MultiplyInvertedPaletteRGBComponents((IndexOfSpritePaletteTag(0x1007) << 4) + 0x103, gUnknown_0839F2C0[phase], gUnknown_0839F2C4[phase], gUnknown_0839F2C8[phase]); +} + +void PokeballGlowEffect_4(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->data0++; + } +} + +void PokeballGlowEffect_5(struct Sprite *sprite) +{ + sprite->data0++; +} + +void PokeballGlowEffect_6(struct Sprite *sprite) +{ + if (sprite->data5 == 0 || IsFanfareTaskInactive()) + { + sprite->data0++; + } +} + +void PokeballGlowEffect_7(struct Sprite *sprite) +{ +} + +void SpriteCB_PokeballGlow(struct Sprite *sprite) +{ + if (gSprites[sprite->data0].data0 > 4) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +u8 PokecenterHealEffectHelper(s16 x, s16 y) +{ + u8 spriteIdAtEnd; + struct Sprite *sprite; + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F220, x, y, 0); + sprite = &gSprites[spriteIdAtEnd]; + sprite->oam.priority = 2; + sprite->invisible = 1; + SetSubspriteTables(sprite, &gUnknown_0839F1A0); + return spriteIdAtEnd; +} + +void SpriteCB_PokecenterMonitor(struct Sprite *sprite) +{ + if (sprite->data0 != 0) + { + sprite->data0 = 0; + sprite->invisible = 0; + StartSpriteAnim(sprite, 1); + } + if (sprite->animEnded) + { + FieldEffectFreeGraphicsResources(sprite); + } +} + +void HallOfFameRecordEffectHelper(s16 a0, s16 a1, s16 a2, u8 a3) +{ + u8 spriteIdAtEnd; + if (!a3) + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F238, a1, a2, 0); + SetSubspriteTables(&gSprites[spriteIdAtEnd], &gUnknown_0839F1C8); + } else + { + spriteIdAtEnd = CreateSpriteAtEnd(&gSpriteTemplate_839F250, a1, a2, 0); + } + gSprites[spriteIdAtEnd].invisible = 1; + gSprites[spriteIdAtEnd].data0 = a0; +} + +void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) +{ + if (gTasks[sprite->data0].data[15]) + { + if (sprite->data1 == 0 || (--sprite->data1) == 0) + { + sprite->data1 = 16; + sprite->invisible ^= 1; + } + sprite->data2++; + } + if (sprite->data2 > 127) + { + FieldEffectFreeGraphicsResources(sprite); + } +} -- cgit v1.2.3 From d48792a69d0687f50401db08e5b133cd60a9a81a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Tue, 6 Jun 2017 23:18:03 -0400 Subject: Some functions related to queueing overworld fly fldeff --- src/field_effect.c | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 1dfc7e107..931116c16 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1,13 +1,20 @@ #include "global.h" +#include "asm.h" #include "data2.h" +#include "script.h" +#include "main.h" #include "field_weather.h" #include "decompress.h" #include "sprite.h" #include "palette.h" #include "text.h" +#include "rom4.h" #include "task.h" #include "sound.h" #include "songs.h" +#include "decoration.h" +#include "field_map_obj_helpers.h" +#include "field_map_obj.h" #include "field_effect.h" typedef bool8 (*FldEffCmd)(u8 **, u32 *); @@ -782,3 +789,87 @@ void SpriteCB_HallOfFameMonitor(struct Sprite *sprite) FieldEffectFreeGraphicsResources(sprite); } } + +void mapldr_080842E8(void); +void mapldr_08084390(void); +void task00_8084310(u8); +void c3_080843F8(u8); + +void sub_80865BC(void) +{ + SetMainCallback2(c2_exit_to_overworld_2_switch); + gUnknown_0300485C = mapldr_080842E8; +} + +void mapldr_080842E8(void) +{ + pal_fill_black(); + CreateTask(task00_8084310, 0); + ScriptContext2_Enable(); + FreezeMapObjects(); + gUnknown_0300485C = NULL; +} + +void task00_8084310(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (!task->data[0]) + { + if (!sub_807D770()) + { + return; + } + gUnknown_0202FF84[0] = gLastFieldPokeMenuOpened; + if ((int)gUnknown_0202FF84[0] > 5) + { + gUnknown_0202FF84[0] = 0; + } + FieldEffectStart(FLDEFF_USE_FLY); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_USE_FLY)) + { + flag_var_implications_of_teleport_(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gUnknown_0300485C = mapldr_08084390; + DestroyTask(taskId); + } +} + +void mapldr_08084390(void) +{ + sub_8053E90(); + pal_fill_black(); + CreateTask(c3_080843F8, 0); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + if (gPlayerAvatar.flags & 0x08) + { + FieldObjectTurn(&gMapObjects[gPlayerAvatar.mapObjectId], DIR_WEST); + } + ScriptContext2_Enable(); + FreezeMapObjects(); + gUnknown_0300485C = NULL; +} + +void c3_080843F8(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + if (task->data[0] == 0) + { + if (gPaletteFade.active) + { + return; + } + FieldEffectStart(FLDEFF_FLY_IN); + task->data[0]++; + } + if (!FieldEffectActiveListContains(FLDEFF_FLY_IN)) + { + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(taskId); + } +} -- cgit v1.2.3 From bbc25771031be86bf19f11ddf2b078dd5364ca30 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 7 Jun 2017 08:50:09 -0400 Subject: Up through sub_80867AC (nonmatching wip) --- src/field_effect.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 931116c16..ad8fa3648 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -13,6 +13,7 @@ #include "sound.h" #include "songs.h" #include "decoration.h" +#include "field_player_avatar.h" #include "field_map_obj_helpers.h" #include "field_map_obj.h" #include "field_effect.h" @@ -873,3 +874,43 @@ void c3_080843F8(u8 taskId) DestroyTask(taskId); } } + +extern void pal_fill_for_map_transition(void); +void sub_8086774(u8); +extern const bool8 (*gUnknown_0839F2CC[7])(struct Task *); +extern void CameraObjectReset2(void); + +void sub_8086748(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + CreateTask(sub_8086774, 0); + gUnknown_0300485C = NULL; +} + +void sub_8086774(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2CC[task->data[0]](task)); +} + +bool8 sub_80867AC(struct Task *task) +{ + struct MapObject *playerObject; + struct Sprite *playerSprite; + playerObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + playerSprite = &gSprites[gPlayerAvatar.spriteId]; + CameraObjectReset2(); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + gPlayerAvatar.unk6 = 1; + FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[4] = playerSprite->subspriteMode; + playerObject->mapobj_bit_27 = 1; + playerSprite->oam.priority = 1; + playerSprite->subspriteMode = 2; + task->data[0]++; +} + -- cgit v1.2.3 From 585cab7a47066e5e70d89180e7e7154652058400 Mon Sep 17 00:00:00 2001 From: scnorton Date: Wed, 7 Jun 2017 15:45:12 -0400 Subject: sub_8086870 (nonmatching) --- src/field_effect.c | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 91 insertions(+), 3 deletions(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index ad8fa3648..a40b6d0cb 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -894,10 +894,10 @@ void sub_8086774(u8 taskId) { struct Task *task; task = &gTasks[taskId]; - while (gUnknown_0839F2CC[task->data[0]](task)); + while (gUnknown_0839F2CC[task->data[0]](task)); // return code signifies whether to continue blocking here } -bool8 sub_80867AC(struct Task *task) +bool8 sub_80867AC(struct Task *task) // gUnknown_0839F2CC[0] { struct MapObject *playerObject; struct Sprite *playerSprite; @@ -908,9 +908,97 @@ bool8 sub_80867AC(struct Task *task) gPlayerAvatar.unk6 = 1; FieldObjectSetSpecialAnim(playerObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); task->data[4] = playerSprite->subspriteMode; - playerObject->mapobj_bit_27 = 1; + playerObject->mapobj_bit_26 = 1; playerSprite->oam.priority = 1; playerSprite->subspriteMode = 2; task->data[0]++; + return TRUE; +} + +bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] +{ + if (sub_807D770()) + { + task->data[0]++; + } + return FALSE; +} + +#ifdef NONMATCHING +bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + int ctcvy; + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = sprite->centerToCornerVecY; + ctcvy = -(centerToCornerVecY << 17); + sprite->pos2.y = -((sprite->pos1.y + centerToCornerVecY + gSpriteCoordOffsetY) + (ctcvy >> 16)); + task->data[1] = 1; + task->data[2] = 0; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + PlaySE(SE_RU_HYUU); + task->data[0]++; + return FALSE; } +#else +__attribute__((naked)) +bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] +{ + asm_unified("\tpush {r4-r6,lr}\n" + "\tadds r5, r0, 0\n" + "\tldr r6, _080868D4 @ =gPlayerAvatar\n" + "\tldrb r0, [r6, 0x4]\n" + "\tlsls r2, r0, 4\n" + "\tadds r2, r0\n" + "\tlsls r2, 2\n" + "\tldr r0, _080868D8 @ =gSprites\n" + "\tadds r2, r0\n" + "\tadds r0, r2, 0\n" + "\tadds r0, 0x29\n" + "\tmovs r4, 0\n" + "\tldrsb r4, [r0, r4] @ =gSprites[gPlayerAvatar.spriteId].centerToCornerVecY\n" + "\tlsls r0, r4, 17\n" + "\tnegs r0, r0\n" + "\tldrh r1, [r2, 0x22] @ =gSprites[gPlayerAvatar.spriteId].pos1.y\n" + "\tldr r3, _080868DC @ =gSpriteCoordOffsetY\n" + "\tadds r1, r4\n" + "\tldrh r3, [r3]\n" + "\tadds r1, r3\n" + "\tasrs r0, 16\n" + "\tadds r0, r1\n" + "\tnegs r0, r0\n" + "\tmovs r1, 0\n" + "\tstrh r0, [r2, 0x26]\n" + "\tmovs r0, 0x1\n" + "\tstrh r0, [r5, 0xA]\n" + "\tstrh r1, [r5, 0xC]\n" + "\tldr r2, _080868E0 @ =gMapObjects\n" + "\tldrb r0, [r6, 0x5]\n" + "\tlsls r1, r0, 3\n" + "\tadds r1, r0\n" + "\tlsls r1, 2\n" + "\tadds r1, r2\n" + "\tldrb r2, [r1, 0x1]\n" + "\tmovs r0, 0x21\n" + "\tnegs r0, r0\n" + "\tands r0, r2\n" + "\tstrb r0, [r1, 0x1]\n" + "\tmovs r0, 0x2B\n" + "\tbl PlaySE\n" + "\tldrh r0, [r5, 0x8]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r5, 0x8]\n" + "\tmovs r0, 0\n" + "\tpop {r4-r6}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_080868D4: .4byte gPlayerAvatar\n" + "_080868D8: .4byte gSprites\n" + "_080868DC: .4byte gSpriteCoordOffsetY\n" + "_080868E0: .4byte gMapObjects"); +} +#endif + -- cgit v1.2.3 From e4ccb588f4104e7b800d1a18927536617e0e284a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 7 Jun 2017 19:08:27 -0400 Subject: Fly-related functions? --- src/field_effect.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index a40b6d0cb..664e59ecf 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2,6 +2,7 @@ #include "asm.h" #include "data2.h" #include "script.h" +#include "trig.h" #include "main.h" #include "field_weather.h" #include "decompress.h" @@ -16,6 +17,7 @@ #include "field_player_avatar.h" #include "field_map_obj_helpers.h" #include "field_map_obj.h" +#include "field_camera.h" #include "field_effect.h" typedef bool8 (*FldEffCmd)(u8 **, u32 *); @@ -879,6 +881,7 @@ extern void pal_fill_for_map_transition(void); void sub_8086774(u8); extern const bool8 (*gUnknown_0839F2CC[7])(struct Task *); extern void CameraObjectReset2(void); +extern void CameraObjectReset1(void); void sub_8086748(void) { @@ -1001,4 +1004,212 @@ bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] } #endif +bool8 sub_80868E4(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y += task->data[1]; + if (task->data[1] < 8) + { + task->data[2] += task->data[1]; + if (task->data[2] & 0xf) + { + task->data[1] <<= 1; + } + } + if (task->data[3] == 0 && sprite->pos2.y >= -16) + { + task->data[3]++; + mapObject->mapobj_bit_26 = 0; + sprite->subspriteMode = task->data[4]; + mapObject->mapobj_bit_2 = 1; + } + if (sprite->pos2.y >= 0) + { + PlaySE(SE_W070); + mapObject->mapobj_bit_3 = 1; + mapObject->mapobj_bit_5 = 1; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_808699C(struct Task *task) +{ + task->data[0]++; + task->data[1] = 4; + task->data[2] = 0; + SetCameraPanningCallback(NULL); + return TRUE; +} + +bool8 sub_80869B8(struct Task *task) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if ((task->data[2] & 3) == 0) + { + task->data[1] >>= 1; + } + if (task->data[1] == 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80869F8(struct Task *task) +{ + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + InstallCameraPanAheadCallback(); + DestroyTask(FindTaskIdByFunc(sub_8086774)); + return FALSE; +} + +void sub_8086A68(u8); +extern const bool8 (*gUnknown_0839F2E8[6])(struct Task *); +extern void sub_80B4824(u8); +void sub_8086B98(struct Task *); +void sub_8086BE4(struct Task *); +void sub_8086C30(void); +void sub_8086C40(void); + +void sub_8086A2C(u8 a0, u8 priority) +{ + u8 taskId; + taskId = CreateTask(sub_8086A68, priority); + gTasks[taskId].data[1] = 0; + if (a0 == 0x6a) + { + gTasks[taskId].data[1] = 1; + } +} + +void sub_8086A68(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F2E8[task->data[0]](task)); +} + +bool8 sub_8086AA0(struct Task *task) +{ + FreezeMapObjects(); + CameraObjectReset2(); + sub_80B4824(task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086AC0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(player_get_direction_lower_nybble())); + task->data[0]++; + task->data[2] = 0; + task->data[3] = 0; + if ((u8)task->data[1] == 0) + { + task->data[0] = 4; + } + PlaySE(SE_ESUKA); + } + return FALSE; +} + +bool8 sub_8086B30(struct Task *task) +{ + sub_8086B98(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B54(struct Task *task) +{ + sub_8086B98(task); + sub_8086C40(); + return FALSE; +} + +bool8 sub_8086B64(struct Task *task) +{ + sub_8086BE4(task); + if (task->data[2] > 3) + { + sub_8086C30(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8086B88(struct Task *task) +{ + sub_8086BE4(task); + sub_8086C40(); + return FALSE; +} + +void sub_8086B98(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[2]); + sprite->pos2.y = Sin(0x94, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} +void sub_8086BE4(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[2]); + sprite->pos2.y = Sin(0x76, task->data[2]); + task->data[3]++; + if (task->data[3] & 1) + { + task->data[2]++; + } +} + +extern void sub_8053FF8(void); +extern void fade_8080918(void); +bool8 sub_8054034(void); +void sub_8086C94(void); +void sub_80B483C(void); + +void sub_8086C30(void) +{ + sub_8053FF8(); + fade_8080918(); +} + +void sub_8086C40(void) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + sub_80B483C(); + warp_in(); + gUnknown_0300485C = sub_8086C94; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_8086A68)); + } +} -- cgit v1.2.3 From 3da6d1f0007a61e808a57bd33a5068a1a241bf5f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 7 Jun 2017 21:14:40 -0400 Subject: okay this isn't fly, but wtf is it? whatever it is, it's finished --- src/field_effect.c | 142 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 136 insertions(+), 6 deletions(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 664e59ecf..f3319169f 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1076,11 +1076,19 @@ bool8 sub_80869F8(struct Task *task) void sub_8086A68(u8); extern const bool8 (*gUnknown_0839F2E8[6])(struct Task *); +extern const bool8 (*gUnknown_0839F300[7])(struct Task *); extern void sub_80B4824(u8); +extern void sub_8053FF8(void); +extern void fade_8080918(void); + void sub_8086B98(struct Task *); void sub_8086BE4(struct Task *); void sub_8086C30(void); void sub_8086C40(void); +bool8 sub_8054034(void); +void sub_8086C94(void); +void sub_80B483C(void); +void sub_8086CBC(u8); void sub_8086A2C(u8 a0, u8 priority) { @@ -1190,12 +1198,6 @@ void sub_8086BE4(struct Task *task) } } -extern void sub_8053FF8(void); -extern void fade_8080918(void); -bool8 sub_8054034(void); -void sub_8086C94(void); -void sub_80B483C(void); - void sub_8086C30(void) { sub_8053FF8(); @@ -1213,3 +1215,131 @@ void sub_8086C40(void) DestroyTask(FindTaskIdByFunc(sub_8086A68)); } } + +void sub_8086C94(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + CreateTask(sub_8086CBC, 0); + gUnknown_0300485C = NULL; +} + +void sub_8086CBC(u8 taskId) +{ + struct Task *task; + task = &gTasks[taskId]; + while (gUnknown_0839F300[task->data[0]](task)); +} + +bool8 sub_8086CF4(struct Task *task) +{ + struct MapObject *mapObject; + s16 x; + s16 y; + u8 behavior; + CameraObjectReset2(); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(DIR_EAST)); + PlayerGetDestCoords(&x, &y); + behavior = MapGridGetMetatileBehaviorAt(x, y); + task->data[0]++; + task->data[1] = 16; + if (behavior == 0x6b) + { + behavior = 1; + task->data[0] = 3; + } else + { + behavior = 0; + } + sub_80B4824(behavior); + return TRUE; +} + +bool8 sub_8086D70(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086DB0(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x84, task->data[1]); + sprite->pos2.y = Sin(0x94, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0] = 5; + } + return FALSE; +} + +bool8 sub_8086E10(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[0]++; + return FALSE; +} + +bool8 sub_8086E50(struct Task *task) +{ + struct Sprite *sprite; + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.x = Cos(0x7c, task->data[1]); + sprite->pos2.y = Sin(0x76, task->data[1]); + task->data[2]++; + if (task->data[2] & 1) + { + task->data[1]--; + } + if (task->data[1] == 0) + { + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + } + return FALSE; +} + +extern bool8 sub_80B4850(void); + +bool8 sub_8086EB0(struct Task *task) +{ + if (sub_80B4850()) + { + return FALSE; + } + sub_80B483C(); + task->data[0]++; + return TRUE; +} + +bool8 sub_8086ED4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + CameraObjectReset1(); + ScriptContext2_Disable(); + FieldObjectSetSpecialAnim(mapObject, GetGoSpeed0AnimId(DIR_EAST)); + DestroyTask(FindTaskIdByFunc(sub_8086CBC)); + } + return FALSE; +} -- cgit v1.2.3 From 459f56eab50d34bf06c32ec06593340e0ce68702 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 8 Jun 2017 18:51:43 -0400 Subject: Waterfall field effect --- src/field_effect.c | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index f3319169f..7c1c3f282 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -17,6 +17,7 @@ #include "field_player_avatar.h" #include "field_map_obj_helpers.h" #include "field_map_obj.h" +#include "metatile_behavior.h" #include "field_camera.h" #include "field_effect.h" @@ -1343,3 +1344,76 @@ bool8 sub_8086ED4(struct Task *task) } return FALSE; } + +void sub_8086F64(u8); +extern const bool8 (*gUnknown_0839F31C[5])(struct Task *, struct MapObject *); + +bool8 FldEff_UseWaterfall(void) +{ + u8 taskId; + taskId = CreateTask(sub_8086F64, 0xff); + gTasks[taskId].data[1] = gUnknown_0202FF84[0]; + sub_8086F64(taskId); + return FALSE; +} + +void sub_8086F64(u8 taskId) +{ + while (gUnknown_0839F31C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId])); +} + +bool8 sub_8086FB0(struct Task *task, struct MapObject *mapObject) +{ + ScriptContext2_Enable(); + gPlayerAvatar.unk6 = 1; + task->data[0]++; + return FALSE; +} + +bool8 waterfall_1_do_anim_probably(struct Task *task, struct MapObject *mapObject) +{ + ScriptContext2_Enable(); + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject)) + { + FieldObjectClearAnimIfSpecialAnimFinished(mapObject); + gUnknown_0202FF84[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } + return FALSE; +} + +bool8 waterfall_2_wait_anim_finish_probably(struct Task *task, struct MapObject *mapObject) +{ + if (FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + return FALSE; + } + task->data[0]++; + return TRUE; +} + +bool8 sub_8087030(struct Task *task, struct MapObject *mapObject) +{ + FieldObjectSetSpecialAnim(mapObject, GetSimpleGoAnimId(DIR_NORTH)); + task->data[0]++; + return FALSE; +} + +bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) +{ + if (!FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + return FALSE; + } + if (MetatileBehavior_IsWaterfall(mapObject->mapobj_unk_1E)) + { + task->data[0] = 3; + return TRUE; + } + ScriptContext2_Disable(); + gPlayerAvatar.unk6 = 0; + DestroyTask(FindTaskIdByFunc(sub_8086F64)); + FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); + return FALSE; +} -- cgit v1.2.3 From 77c679492c15a5b30e4338d2366c2958d7cff4d9 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 8 Jun 2017 19:09:43 -0400 Subject: Dive field effect --- src/field_effect.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 7c1c3f282..af6f5a36a 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1417,3 +1417,51 @@ bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) FieldEffectActiveListRemove(FLDEFF_USE_WATERFALL); return FALSE; } + +void Task_Dive(u8); +extern const bool8 (*gUnknown_0839F330[3])(struct Task *); +extern int dive_warp(struct MapPosition *, u16); + +bool8 FldEff_UseDive(void) +{ + u8 taskId; + taskId = CreateTask(Task_Dive, 0xff); + gTasks[taskId].data[15] = gUnknown_0202FF84[0]; + gTasks[taskId].data[14] = gUnknown_0202FF84[1]; + Task_Dive(taskId); + return FALSE; +} + +void Task_Dive(u8 taskId) +{ + while (gUnknown_0839F330[gTasks[taskId].data[0]](&gTasks[taskId])); +} + +bool8 sub_8087124(struct Task *task) +{ + gPlayerAvatar.unk6 = 1; + task->data[0]++; + return FALSE; +} + +bool8 dive_2_unknown(struct Task *task) +{ + ScriptContext2_Enable(); + gUnknown_0202FF84[0] = task->data[15]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + return FALSE; +} + +bool8 dive_3_unknown(struct Task *task) +{ + struct MapPosition mapPosition; + PlayerGetDestCoords(&mapPosition.x, &mapPosition.y); + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + dive_warp(&mapPosition, gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E); + DestroyTask(FindTaskIdByFunc(Task_Dive)); + FieldEffectActiveListRemove(FLDEFF_USE_DIVE); + } + return FALSE; +} -- cgit v1.2.3 From 14e1400cfdf8cddc4839164fdcc9f5506764a455 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 9 Jun 2017 11:07:49 -0400 Subject: Field Effect first half of lavaridge gym fall down --- src/field_effect.c | 182 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 118 insertions(+), 64 deletions(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index af6f5a36a..320c61b29 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -928,16 +928,13 @@ bool8 sub_8086854(struct Task *task) // gUnknown_0839F2CC[1] return FALSE; } -#ifdef NONMATCHING bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] { struct Sprite *sprite; s16 centerToCornerVecY; - int ctcvy; sprite = &gSprites[gPlayerAvatar.spriteId]; - centerToCornerVecY = sprite->centerToCornerVecY; - ctcvy = -(centerToCornerVecY << 17); - sprite->pos2.y = -((sprite->pos1.y + centerToCornerVecY + gSpriteCoordOffsetY) + (ctcvy >> 16)); + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); task->data[1] = 1; task->data[2] = 0; gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; @@ -945,65 +942,6 @@ bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] task->data[0]++; return FALSE; } -#else -__attribute__((naked)) -bool8 sub_8086870(struct Task *task) // gUnknown_0839F2CC[2] -{ - asm_unified("\tpush {r4-r6,lr}\n" - "\tadds r5, r0, 0\n" - "\tldr r6, _080868D4 @ =gPlayerAvatar\n" - "\tldrb r0, [r6, 0x4]\n" - "\tlsls r2, r0, 4\n" - "\tadds r2, r0\n" - "\tlsls r2, 2\n" - "\tldr r0, _080868D8 @ =gSprites\n" - "\tadds r2, r0\n" - "\tadds r0, r2, 0\n" - "\tadds r0, 0x29\n" - "\tmovs r4, 0\n" - "\tldrsb r4, [r0, r4] @ =gSprites[gPlayerAvatar.spriteId].centerToCornerVecY\n" - "\tlsls r0, r4, 17\n" - "\tnegs r0, r0\n" - "\tldrh r1, [r2, 0x22] @ =gSprites[gPlayerAvatar.spriteId].pos1.y\n" - "\tldr r3, _080868DC @ =gSpriteCoordOffsetY\n" - "\tadds r1, r4\n" - "\tldrh r3, [r3]\n" - "\tadds r1, r3\n" - "\tasrs r0, 16\n" - "\tadds r0, r1\n" - "\tnegs r0, r0\n" - "\tmovs r1, 0\n" - "\tstrh r0, [r2, 0x26]\n" - "\tmovs r0, 0x1\n" - "\tstrh r0, [r5, 0xA]\n" - "\tstrh r1, [r5, 0xC]\n" - "\tldr r2, _080868E0 @ =gMapObjects\n" - "\tldrb r0, [r6, 0x5]\n" - "\tlsls r1, r0, 3\n" - "\tadds r1, r0\n" - "\tlsls r1, 2\n" - "\tadds r1, r2\n" - "\tldrb r2, [r1, 0x1]\n" - "\tmovs r0, 0x21\n" - "\tnegs r0, r0\n" - "\tands r0, r2\n" - "\tstrb r0, [r1, 0x1]\n" - "\tmovs r0, 0x2B\n" - "\tbl PlaySE\n" - "\tldrh r0, [r5, 0x8]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r5, 0x8]\n" - "\tmovs r0, 0\n" - "\tpop {r4-r6}\n" - "\tpop {r1}\n" - "\tbx r1\n" - "\t.align 2, 0\n" - "_080868D4: .4byte gPlayerAvatar\n" - "_080868D8: .4byte gSprites\n" - "_080868DC: .4byte gSpriteCoordOffsetY\n" - "_080868E0: .4byte gMapObjects"); -} -#endif bool8 sub_80868E4(struct Task *task) { @@ -1465,3 +1403,119 @@ bool8 dive_3_unknown(struct Task *task) } return FALSE; } + +void sub_80871D0(u8); +extern const bool8 (*gUnknown_0839F33C[6])(struct Task *, struct MapObject *, struct Sprite *); +void mapldr_080851BC(void); + +void sub_80871B8(u8 priority) +{ + CreateTask(sub_80871D0, priority); +} + +void sub_80871D0(u8 taskId) +{ + while (gUnknown_0839F33C[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_808722C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + FreezeMapObjects(); + CameraObjectReset2(); + SetCameraPanningCallback(NULL); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_26 = 1; + task->data[1] = 1; + task->data[0]++; + return TRUE; +} + +bool8 sub_8087264(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + SetCameraPanning(0, task->data[1]); + task->data[1] = -task->data[1]; + task->data[2]++; + if (task->data[2] > 7) + { + task->data[2] = 0; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8087298(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite->pos2.y = 0; + task->data[3] = 1; + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + FieldEffectStart(FLDEFF_LAVARIDGE_GYM_WARP); + PlaySE(SE_W153); + task->data[0]++; + return TRUE; +} + +bool8 sub_80872E4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + s16 centerToCornerVecY; + SetCameraPanning(0, task->data[1]); + if (task->data[1] = -task->data[1], ++task->data[2] <= 17) + { + if (!(task->data[2] & 1) && (task->data[1] <= 3)) + { + task->data[1] <<= 1; + } + } else if (!(task->data[2] & 4) && (task->data[1] > 0)) + { + task->data[1] >>= 1; + } + if (task->data[2] > 6) + { + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + if (sprite->pos2.y > -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY)) + { + sprite->pos2.y -= task->data[3]; + if (task->data[3] <= 7) + { + task->data[3]++; + } + } else + { + task->data[4] = 1; + } + } + if (task->data[5] == 0 && sprite->pos2.y < -0x10) + { + task->data[5]++; + mapObject->mapobj_bit_26 = 1; + sprite->oam.priority = 1; + sprite->subspriteMode = 2; + } + if (task->data[1] == 0 && task->data[4] != 0) + { + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80873D8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sub_8053FF8(); + fade_8080918(); + task->data[0]++; + return FALSE; +} + +bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + warp_in(); + gUnknown_0300485C = mapldr_080851BC; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80871D0)); + } + return FALSE; +} -- cgit v1.2.3 From d7c21854332787d2f932bbe2934456850994f730 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 9 Jun 2017 11:34:18 -0400 Subject: Second half of Flannery gym animation (increased uncertainty about which direction it is for) --- src/field_effect.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 320c61b29..20e23c8fa 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1519,3 +1519,71 @@ bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite } return FALSE; } + +void sub_8087470(u8); +extern const bool8 (*gUnknown_0839F354[4])(struct Task *, struct MapObject *, struct Sprite *); +extern u8 sub_80608A4(u8); + +void mapldr_080851BC(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + gUnknown_0300485C = NULL; + CreateTask(sub_8087470, 0); +} + +void sub_8087470(u8 taskId) +{ + while (gUnknown_0839F354[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80874CC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + CameraObjectReset2(); + FreezeMapObjects(); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_13 = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80874FC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (sub_807D770()) + { + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_8087548(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + sprite = &gSprites[task->data[1]]; + if (sprite->animCmdIndex > 1) + { + task->data[0]++; + mapObject->mapobj_bit_13 = 0; + CameraObjectReset1(); + PlaySE(SE_W091); + FieldObjectSetSpecialAnim(mapObject, sub_80608A4(DIR_EAST)); + } + return FALSE; +} + +bool8 sub_808759C(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + gPlayerAvatar.unk6 = 0; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087470)); + } + return FALSE; +} -- cgit v1.2.3 From 95b82b5dbb11e63f4cbaa09981dea04f9b729777 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 9 Jun 2017 13:59:11 -0400 Subject: FldEff_LavaridgeGymWarp --- src/field_effect.c | 99 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 20e23c8fa..1661245c5 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1587,3 +1587,102 @@ bool8 sub_808759C(struct Task *task, struct MapObject *mapObject, struct Sprite } return FALSE; } + +extern void sub_8060470(s16 *x, s16 *y, s16 dx, s16 dy); +extern const struct SpriteTemplate *const gFieldEffectObjectTemplatePointers[36]; + +u8 FldEff_LavaridgeGymWarp(void) +{ + u8 spriteId; + sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[33], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + gSprites[spriteId].oam.priority = gUnknown_0202FF84[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_8087638(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_LAVARIDGE_GYM_WARP); + } +} + +void sub_808766C(u8); +extern const bool8 (*gUnknown_0839F364[5])(struct Task *, struct MapObject *, struct Sprite *); + +void sub_8087654(u8 priority) +{ + CreateTask(sub_808766C, priority); +} + +void sub_808766C(u8 taskId) +{ + while(gUnknown_0839F364[gTasks[taskId].data[0]](&gTasks[taskId], &gMapObjects[gPlayerAvatar.mapObjectId], &gSprites[gPlayerAvatar.spriteId])); +} + +bool8 sub_80876C8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + FreezeMapObjects(); + CameraObjectReset2(); + gPlayerAvatar.unk6 = 1; + mapObject->mapobj_bit_26 = 1; + task->data[0]++; + return FALSE; +} + +bool8 sub_80876F8(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + if (task->data[1] > 3) + { + gUnknown_0202FF84[0] = mapObject->coords2.x; + gUnknown_0202FF84[1] = mapObject->coords2.y; + gUnknown_0202FF84[2] = sprite->subpriority - 1; + gUnknown_0202FF84[3] = sprite->oam.priority; + task->data[1] = FieldEffectStart(FLDEFF_POP_OUT_OF_ASH); + task->data[0]++; + } else + { + task->data[1]++; + FieldObjectSetSpecialAnim(mapObject, GetStepInPlaceDelay4AnimId(mapObject->mapobj_unk_18)); + PlaySE(SE_FU_ZUZUZU); + } + } + return FALSE; +} + +bool8 sub_8087774(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (gSprites[task->data[1]].animCmdIndex == 2) + { + mapObject->mapobj_bit_13 = 1; + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80877AC(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!FieldEffectActiveListContains(FLDEFF_POP_OUT_OF_ASH)) + { + sub_8053FF8(); + fade_8080918(); + task->data[0]++; + } + return FALSE; +} + +bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + warp_in(); + gUnknown_0300485C = sub_8086748; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_808766C)); + } + return FALSE; +} -- cgit v1.2.3 From 5980e95c3daadaa2fe91713fa72b36eeead7678f Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Fri, 9 Jun 2017 20:05:28 -0400 Subject: FldEff_PopOutOfAsh (misnamed?) --- src/field_effect.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 133 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 1661245c5..f20c2ed60 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1675,6 +1675,11 @@ bool8 sub_80877AC(struct Task *task, struct MapObject *mapObject, struct Sprite return FALSE; } +void sub_80878C4(u8); +extern u8 gUnknown_0839F380[5]; +extern const void (*gUnknown_0839F378[2])(struct Task *); +void mapldr_080859D4(void); + bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) { if (!gPaletteFade.active && sub_8054034() == TRUE) @@ -1686,3 +1691,131 @@ bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite } return FALSE; } + +u8 FldEff_PopOutOfAsh(void) +{ + u8 spriteId; + sub_8060470((s16 *)&gUnknown_0202FF84[0], (s16 *)&gUnknown_0202FF84[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[32], gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + gSprites[spriteId].oam.priority = gUnknown_0202FF84[3]; + gSprites[spriteId].coordOffsetEnabled = 1; + return spriteId; +} + +void sub_808788C(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_POP_OUT_OF_ASH); + } +} + +void sub_80878A8(void) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + CreateTask(sub_80878C4, 0x50); +} + +void sub_80878C4(u8 taskId) +{ + gUnknown_0839F378[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80878F4(struct Task *task) +{ + task->data[0]++; + task->data[14] = 64; + task->data[15] = player_get_direction_lower_nybble(); +} + +void sub_8087914(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + if (task->data[14] != 0 && (--task->data[14]) == 0) + { + sub_8053FF8(); + fade_8080918(); + } + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + if (task->data[14] == 0 && !gPaletteFade.active && sub_8054034() == TRUE) + { + FieldObjectSetDirection(mapObject, task->data[15]); + sub_8053678(); + warp_in(); + gUnknown_0300485C = mapldr_080859D4; + SetMainCallback2(CB2_LoadMap); + DestroyTask(FindTaskIdByFunc(sub_80878C4)); + } else if (task->data[1] == 0 || (--task->data[1]) == 0) + { + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); + if (task->data[2] < 12) + { + task->data[2]++; + } + task->data[1] = 8 >> (task->data[2] >> 2); + } + } +} + +void sub_8087A74(u8); +extern const void (*gUnknown_0839F388[2])(struct Task *); + +void mapldr_080859D4(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + gUnknown_0300485C = NULL; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + CreateTask(sub_8087A74, 0); +} + +void sub_8087A74(u8 taskId) +{ + gUnknown_0839F388[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087AA4(struct Task *task) +{ + if (sub_807D770()) + { + task->data[0]++; + task->data[15] = player_get_direction_lower_nybble(); + } +} + +void sub_8087AC8(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + if (FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) && !FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + return; + } + if (task->data[2] >= 32 && task->data[15] == player_get_direction_lower_nybble()) + { + mapObject->mapobj_bit_13 = 0; + ScriptContext2_Disable(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087A74)); + return; + } + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(unknown_0839F380[mapObject->mapobj_unk_18])); + if (task->data[2] < 32) + { + task->data[2]++; + } + task->data[1] = task->data[2] >> 2; + } + mapObject->mapobj_bit_13 ^= 1; +} -- cgit v1.2.3 From 66b7c04c71d54baf37f0928dd50004af87596993 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Jun 2017 09:57:36 -0400 Subject: Another map-changing field effect (evil team hideout warp pads?) --- src/field_effect.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 189 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index f20c2ed60..8a874efb6 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -1819,3 +1819,192 @@ void sub_8087AC8(struct Task *task) } mapObject->mapobj_bit_13 ^= 1; } + +void sub_8087BBC(u8); +extern const void (*gUnknown_0839F390[4])(struct Task *); +void mapldr_08085D88(void); + +void sub_8087BA8(void) +{ + CreateTask(sub_8087BBC, 0); +} + +void sub_8087BBC(u8 taskId) +{ + gUnknown_0839F390[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087BEC(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + CameraObjectReset2(); + task->data[15] = player_get_direction_lower_nybble(); + task->data[0]++; +} + +void sub_8087C14(struct Task *task) +{ + struct MapObject *mapObject; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[1] == 0 || (--task->data[1]) == 0) + { + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + task->data[1] = 8; + task->data[2]++; + } + if (task->data[2] > 7 && task->data[15] == mapObject->mapobj_unk_18) + { + task->data[0]++; + task->data[1] = 4; + task->data[2] = 8; + task->data[3] = 1; + PlaySE(SE_TK_WARPIN); + } +} + +void sub_8087CA4(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + u8 unknown_0839F380[5]; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((--task->data[1]) <= 0) + { + task->data[1] = 4; + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + } + sprite->pos1.y -= task->data[3]; + task->data[4] += task->data[3]; + if ((--task->data[2]) <= 0 && (task->data[2] = 4, task->data[3] < 8)) + { + task->data[3] <<= 1; + } + if (task->data[4] > 8 && (sprite->oam.priority = 1, sprite->subspriteMode != 0)) + { + sprite->subspriteMode = 2; + } + if (task->data[4] >= 0xa8) + { + task->data[0]++; + sub_8053FF8(); + fade_8080918(); + } +} + +void sub_8087D78(struct Task *task) +{ + if (!gPaletteFade.active && sub_8054034() == TRUE) + { + sub_8053570(); + warp_in(); + SetMainCallback2(CB2_LoadMap); + gUnknown_0300485C = mapldr_08085D88; + DestroyTask(FindTaskIdByFunc(sub_8087BBC)); + } +} + +void sub_8087E1C(u8); +extern const void (*gUnknown_0839F3A0[3])(struct Task *); + +void mapldr_08085D88(void) +{ + sub_8053E90(); + pal_fill_for_map_transition(); + ScriptContext2_Enable(); + FreezeMapObjects(); + gUnknown_0300485C = NULL; + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 1; + CameraObjectReset2(); + CreateTask(sub_8087E1C, 0); +} + +void sub_8087E1C(u8 taskId) +{ + gUnknown_0839F3A0[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8087E4C(struct Task *task) +{ + struct Sprite *sprite; + s16 centerToCornerVecY; + if (sub_807D770()) + { + sprite = &gSprites[gPlayerAvatar.spriteId]; + centerToCornerVecY = -(sprite->centerToCornerVecY << 1); + sprite->pos2.y = -(sprite->pos1.y + sprite->centerToCornerVecY + gSpriteCoordOffsetY + centerToCornerVecY); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_13 = 0; + task->data[0]++; + task->data[1] = 8; + task->data[2] = 1; + task->data[14] = sprite->subspriteMode; + task->data[15] = player_get_direction_lower_nybble(); + PlaySE(SE_TK_WARPIN); + } +} + +void sub_8087ED8(struct Task *task) +{ + u8 unknown_0839F380[5]; + struct MapObject *mapObject; + struct Sprite *sprite; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[gPlayerAvatar.spriteId]; + if ((sprite->pos2.y += task->data[1]) >= -8) + { + if (task->data[13] == 0) + { + task->data[13]++; + mapObject->mapobj_bit_2 = 1; + sprite->subspriteMode = task->data[14]; + } + } else + { + sprite->oam.priority = 1; + if (sprite->subspriteMode != 0) + { + sprite->subspriteMode = 2; + } + } + if (sprite->pos2.y >= -0x30 && task->data[1] > 1 && !(sprite->pos2.y & 1)) + { + task->data[1]--; + } + if ((--task->data[2]) == 0) + { + task->data[2] = 4; + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + } + if (sprite->pos2.y >= 0) + { + sprite->pos2.y = 0; + task->data[0]++; + task->data[1] = 1; + task->data[2] = 0; + } +} + +void sub_8087FDC(struct Task *task) +{ + u8 unknown_0839F380[5]; + struct MapObject *mapObject; + memcpy(unknown_0839F380, gUnknown_0839F380, sizeof gUnknown_0839F380); + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if ((--task->data[1]) == 0) + { + FieldObjectTurn(mapObject, unknown_0839F380[mapObject->mapobj_unk_18]); + task->data[1] = 8; + if ((++task->data[2]) > 4 && task->data[14] == mapObject->mapobj_unk_18) + { + ScriptContext2_Disable(); + CameraObjectReset1(); + UnfreezeMapObjects(); + DestroyTask(FindTaskIdByFunc(sub_8087E1C)); + } + } +} -- cgit v1.2.3 From 40bcba1a64f2377166b419ecbabf8ac4a097b8ef Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Jun 2017 10:07:06 -0400 Subject: Init functions for FieldMoveShowMon --- src/field_effect.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 8a874efb6..3a56dfdcb 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2008,3 +2008,35 @@ void sub_8087FDC(struct Task *task) } } } + +void sub_8088120(u8); +void sub_808847C(u8); +u8 sub_8088830(u32, u32, u32); + +bool8 FldEff_FieldMoveShowMon(void) +{ + u8 taskId; + if (is_light_level_1_2_3_5_or_6(sav1_map_get_light_level()) == TRUE) + { + taskId = CreateTask(sub_8088120, 0xff); + } else + { + taskId = CreateTask(sub_808847C, 0xff); + } + gTasks[taskId].data[15] = sub_8088830(gUnknown_0202FF84[0], gUnknown_0202FF84[1], gUnknown_0202FF84[2]); + return FALSE; +} + +bool8 FldEff_FieldMoveShowMonInit(void) +{ + struct Pokemon *pokemon; + u32 flag = gUnknown_0202FF84[0] & 0x80000000; + pokemon = &gPlayerParty[(u8)gUnknown_0202FF84[0]]; + gUnknown_0202FF84[0] = GetMonData(pokemon, MON_DATA_SPECIES); + gUnknown_0202FF84[1] = GetMonData(pokemon, MON_DATA_OT_ID); + gUnknown_0202FF84[2] = GetMonData(pokemon, MON_DATA_PERSONALITY); + gUnknown_0202FF84[0] |= flag; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + return FALSE; +} -- cgit v1.2.3 From 19c16e2f94dda9fe354692f6e449b271e845ad22 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sat, 10 Jun 2017 21:36:41 -0400 Subject: Attempt at decompiling field effect for sending out pokemon for field move --- src/field_effect.c | 280 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 3a56dfdcb..5719245e5 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -7,6 +7,7 @@ #include "field_weather.h" #include "decompress.h" #include "sprite.h" +#include "menu.h" #include "palette.h" #include "text.h" #include "rom4.h" @@ -2012,6 +2013,13 @@ void sub_8087FDC(struct Task *task) void sub_8088120(u8); void sub_808847C(u8); u8 sub_8088830(u32, u32, u32); +extern const void (*gUnknown_0839F3AC[7])(struct Task *); +extern const void (*gUnknown_0839F3C8[7])(struct Task *); +extern const u32 gFieldMoveStreaksTiles[]; +extern const u16 gFieldMoveStreaksPalette[16]; +void sub_80883DC(void); +void sub_808843C(u16); +void sub_8088890(struct Sprite *); bool8 FldEff_FieldMoveShowMon(void) { @@ -2040,3 +2048,275 @@ bool8 FldEff_FieldMoveShowMonInit(void) FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); return FALSE; } + +void sub_8088120(u8 taskId) +{ + gUnknown_0839F3AC[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088150(struct Task *task) +{ + task->data[11] = REG_WININ; + task->data[12] = REG_WINOUT; + StoreWordInTwoHalfwords(&task->data[13], (u32)gMain.vblankCallback); + task->data[1] = 0xf0f1; + task->data[2] = 0x5051; + task->data[3] = 0x3f; + task->data[4] = 0x3e; + REG_WIN0H = task->data[1]; + REG_WIN0V = task->data[2]; + REG_WININ = task->data[3]; + REG_WINOUT = task->data[4]; + SetVBlankCallback(sub_80883DC); + task->data[0]++; +} + +void sub_80881C0(struct Task *task) +{ + u32 zero; + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + CpuSet(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x100); + zero = 0; + CpuSet(&zero, (void *)(VRAM + delta), 0x5000200); + LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); + sub_808843C(delta); + task->data[0]++; +} + +#ifdef NONMATCHING +void sub_8088228(struct Task *task) +{ + s16 v0; + s16 v2; + s16 v3; + task->data[5] -= 16; + // The order in which registers are loaded is incorrect. + v0 = ((u16)task->data[1] >> 8) - 0x10; + v2 = ((u16)task->data[2] >> 8) - 2; + v3 = ((u16)task->data[2] & 0xff) + 2; + if (v0 < 0) + { + v0 = 0; + } + if (v2 < 0x28) + { + v2 = 0x28; + } + if (v3 > 0x78) + { + v3 = 0x78; + } + task->data[1] = (v0 << 8) | (task->data[1] & 0xff); + task->data[2] = (v2 << 8) | v3; + if (v0 == 0 && v2 == 0x28 && v3 == 0x78) + { + gSprites[task->data[15]].callback = sub_8088890; + task->data[0]++; + } +} +#else +__attribute__((naked)) +void sub_8088228(struct Task *task) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tadds r3, r0, 0\n" + "\tldrh r0, [r3, 0x12]\n" + "\tsubs r0, 0x10\n" + "\tstrh r0, [r3, 0x12]\n" + "\tldrh r6, [r3, 0xA]\n" + "\tldrh r2, [r3, 0xC]\n" + "\tmovs r7, 0xFF\n" + "\tlsrs r1, r6, 8\n" + "\tsubs r1, 0x10\n" + "\tlsls r1, 16\n" + "\tlsrs r0, r2, 8\n" + "\tsubs r0, 0x2\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tadds r0, r7, 0\n" + "\tands r0, r2\n" + "\tadds r5, r0, 0x2\n" + "\tlsrs r2, r1, 16\n" + "\tcmp r1, 0\n" + "\tbge _08088254\n" + "\tmovs r2, 0\n" + "_08088254:\n" + "\tlsls r0, r4, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, 0x27\n" + "\tbgt _0808825E\n" + "\tmovs r4, 0x28\n" + "_0808825E:\n" + "\tcmp r5, 0x78\n" + "\tble _08088264\n" + "\tmovs r5, 0x78\n" + "_08088264:\n" + "\tlsls r2, 16\n" + "\tasrs r2, 16\n" + "\tlsls r1, r2, 8\n" + "\tadds r0, r7, 0\n" + "\tands r0, r6\n" + "\torrs r1, r0\n" + "\tstrh r1, [r3, 0xA]\n" + "\tlsls r0, r4, 16\n" + "\tasrs r4, r0, 16\n" + "\tlsls r0, r4, 8\n" + "\tadds r1, r5, 0\n" + "\torrs r0, r1\n" + "\tstrh r0, [r3, 0xC]\n" + "\tcmp r2, 0\n" + "\tbne _080882A4\n" + "\tcmp r4, 0x28\n" + "\tbne _080882A4\n" + "\tcmp r1, 0x78\n" + "\tbne _080882A4\n" + "\tldr r2, _080882AC @ =gSprites\n" + "\tmovs r0, 0x26\n" + "\tldrsh r1, [r3, r0]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tadds r2, 0x1C\n" + "\tadds r0, r2\n" + "\tldr r1, _080882B0 @ =sub_8088890\n" + "\tstr r1, [r0]\n" + "\tldrh r0, [r3, 0x8]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r3, 0x8]\n" + "_080882A4:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_080882AC: .4byte gSprites\n" + "_080882B0: .4byte sub_8088890"); +} +#endif + +void sub_80882B4(struct Task *task) +{ + task->data[5] -= 0x10; + if (gSprites[task->data[15]].data7) + { + task->data[0]++; + } +} + +#ifdef NONMATCHING +void sub_80882E4(struct Task *task) +{ + s16 v2; + s16 v3; + task->data[5] -= 0x10; + // The order in which registers are loaded is incorrect. + v2 = (task->data[2] >> 8) + 6; + v3 = (task->data[2] & 0xff) - 6; + if (v2 > 0x50) + { + v2 = 0x50; + } + if (v3 < 0x51) + { + v3 = 0x51; + } + task->data[2] = (v2 << 8) | v3; + if (v2 == 0x50 && v3 == 0x51) + { + task->data[0]++; + } +} +#else +__attribute__((naked)) +void sub_80882E4(struct Task *task) +{ + asm_unified("\tpush {r4,lr}\n" + "\tadds r3, r0, 0\n" + "\tldrh r0, [r3, 0x12]\n" + "\tsubs r0, 0x10\n" + "\tstrh r0, [r3, 0x12]\n" + "\tldrh r2, [r3, 0xC]\n" + "\tlsls r1, r2, 16\n" + "\tmovs r0, 0xFF\n" + "\tasrs r1, 24\n" + "\tadds r1, 0x6\n" + "\tlsls r1, 16\n" + "\tands r0, r2\n" + "\tsubs r0, 0x6\n" + "\tlsls r0, 16\n" + "\tlsrs r2, r0, 16\n" + "\tlsrs r4, r1, 16\n" + "\tasrs r1, 16\n" + "\tcmp r1, 0x50\n" + "\tble _0808830C\n" + "\tmovs r4, 0x50\n" + "_0808830C:\n" + "\tlsls r0, r2, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, 0x50\n" + "\tbgt _08088316\n" + "\tmovs r2, 0x51\n" + "_08088316:\n" + "\tlsls r0, r4, 16\n" + "\tasrs r0, 16\n" + "\tlsls r1, r0, 8\n" + "\tlsls r2, 16\n" + "\tasrs r2, 16\n" + "\torrs r1, r2\n" + "\tstrh r1, [r3, 0xC]\n" + "\tcmp r0, 0x50\n" + "\tbne _08088332\n" + "\tcmp r2, 0x51\n" + "\tbne _08088332\n" + "\tldrh r0, [r3, 0x8]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r3, 0x8]\n" + "_08088332:\n" + "\tpop {r4}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +void sub_8088338(struct Task *task) +{ + u32 zero; + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + zero = 0; + CpuSet(&zero, (void *)VRAM + bg0cnt, 0x5000200); + task->data[1] = 0xf1; + task->data[2] = 0xa1; + task->data[3] = task->data[11]; + task->data[4] = task->data[12]; + task->data[0]++; +} + +void sub_8088380(struct Task *task) +{ + IntrCallback callback; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + SetVBlankCallback(callback); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_8088120)); +} + +void sub_80883DC(void) +{ + struct Task *task; + IntrCallback callback; + task = &gTasks[FindTaskIdByFunc(sub_8088120)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&callback); + callback(); + REG_WIN0H = task->data[1]; + REG_WIN0V = task->data[2]; + REG_WININ = task->data[3]; + REG_WINOUT = task->data[4]; + REG_BG0HOFS = task->data[5]; + REG_BG0VOFS = task->data[6]; +} -- cgit v1.2.3 From 1ebb2b84a202b345435356381fb0dea9a5d7033d Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Jun 2017 10:21:44 -0400 Subject: Use CpuCopy and CpuFill macros --- src/field_effect.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 5719245e5..f9645613b 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2017,6 +2017,7 @@ extern const void (*gUnknown_0839F3AC[7])(struct Task *); extern const void (*gUnknown_0839F3C8[7])(struct Task *); extern const u32 gFieldMoveStreaksTiles[]; extern const u16 gFieldMoveStreaksPalette[16]; +extern const u16 gFieldMoveStreaksTilemap[0x140]; void sub_80883DC(void); void sub_808843C(u16); void sub_8088890(struct Sprite *); @@ -2073,14 +2074,12 @@ void sub_8088150(struct Task *task) void sub_80881C0(struct Task *task) { - u32 zero; u16 offset; u16 delta; offset = ((REG_BG0CNT >> 2) << 14); delta = ((REG_BG0CNT >> 8) << 11); - CpuSet(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x100); - zero = 0; - CpuSet(&zero, (void *)(VRAM + delta), 0x5000200); + CpuCopy16(gFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x200); + CpuFill32(0, (void *)(VRAM + delta), 0x800); LoadPalette(gFieldMoveStreaksPalette, 0xf0, 0x20); sub_808843C(delta); task->data[0]++; @@ -2282,11 +2281,9 @@ void sub_80882E4(struct Task *task) void sub_8088338(struct Task *task) { - u32 zero; u16 bg0cnt; bg0cnt = (REG_BG0CNT >> 8) << 11; - zero = 0; - CpuSet(&zero, (void *)VRAM + bg0cnt, 0x5000200); + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); task->data[1] = 0xf1; task->data[2] = 0xa1; task->data[3] = task->data[11]; @@ -2320,3 +2317,14 @@ void sub_80883DC(void) REG_BG0HOFS = task->data[5]; REG_BG0VOFS = task->data[6]; } + +void sub_808843C(u16 offs) +{ + u16 i; + u16 *dest; + dest = (u16 *)(VRAM + 0x140 + offs); + for (i=0; i<0x140; i++, dest++) + { + *dest = gFieldMoveStreaksTilemap[i] | 0xf000; + } +} -- cgit v1.2.3 From ba16f9d35f5c6f5daee0a24301d8c48031f6c4df Mon Sep 17 00:00:00 2001 From: scnorton Date: Sun, 11 Jun 2017 14:12:18 -0400 Subject: Get those two functions matching. Thanks camthesaxman\! --- src/field_effect.c | 152 +++++------------------------------------------------ 1 file changed, 12 insertions(+), 140 deletions(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index f9645613b..cd58e84ba 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2085,17 +2085,18 @@ void sub_80881C0(struct Task *task) task->data[0]++; } -#ifdef NONMATCHING void sub_8088228(struct Task *task) { s16 v0; s16 v2; s16 v3; task->data[5] -= 16; - // The order in which registers are loaded is incorrect. - v0 = ((u16)task->data[1] >> 8) - 0x10; - v2 = ((u16)task->data[2] >> 8) - 2; - v3 = ((u16)task->data[2] & 0xff) + 2; + v0 = ((u16)task->data[1] >> 8); + v2 = ((u16)task->data[2] >> 8); + v3 = ((u16)task->data[2] & 0xff); + v0 -= 16; + v2 -= 2; + v3 += 2; if (v0 < 0) { v0 = 0; @@ -2116,103 +2117,25 @@ void sub_8088228(struct Task *task) task->data[0]++; } } -#else -__attribute__((naked)) -void sub_8088228(struct Task *task) -{ - asm_unified("\tpush {r4-r7,lr}\n" - "\tadds r3, r0, 0\n" - "\tldrh r0, [r3, 0x12]\n" - "\tsubs r0, 0x10\n" - "\tstrh r0, [r3, 0x12]\n" - "\tldrh r6, [r3, 0xA]\n" - "\tldrh r2, [r3, 0xC]\n" - "\tmovs r7, 0xFF\n" - "\tlsrs r1, r6, 8\n" - "\tsubs r1, 0x10\n" - "\tlsls r1, 16\n" - "\tlsrs r0, r2, 8\n" - "\tsubs r0, 0x2\n" - "\tlsls r0, 16\n" - "\tlsrs r4, r0, 16\n" - "\tadds r0, r7, 0\n" - "\tands r0, r2\n" - "\tadds r5, r0, 0x2\n" - "\tlsrs r2, r1, 16\n" - "\tcmp r1, 0\n" - "\tbge _08088254\n" - "\tmovs r2, 0\n" - "_08088254:\n" - "\tlsls r0, r4, 16\n" - "\tasrs r0, 16\n" - "\tcmp r0, 0x27\n" - "\tbgt _0808825E\n" - "\tmovs r4, 0x28\n" - "_0808825E:\n" - "\tcmp r5, 0x78\n" - "\tble _08088264\n" - "\tmovs r5, 0x78\n" - "_08088264:\n" - "\tlsls r2, 16\n" - "\tasrs r2, 16\n" - "\tlsls r1, r2, 8\n" - "\tadds r0, r7, 0\n" - "\tands r0, r6\n" - "\torrs r1, r0\n" - "\tstrh r1, [r3, 0xA]\n" - "\tlsls r0, r4, 16\n" - "\tasrs r4, r0, 16\n" - "\tlsls r0, r4, 8\n" - "\tadds r1, r5, 0\n" - "\torrs r0, r1\n" - "\tstrh r0, [r3, 0xC]\n" - "\tcmp r2, 0\n" - "\tbne _080882A4\n" - "\tcmp r4, 0x28\n" - "\tbne _080882A4\n" - "\tcmp r1, 0x78\n" - "\tbne _080882A4\n" - "\tldr r2, _080882AC @ =gSprites\n" - "\tmovs r0, 0x26\n" - "\tldrsh r1, [r3, r0]\n" - "\tlsls r0, r1, 4\n" - "\tadds r0, r1\n" - "\tlsls r0, 2\n" - "\tadds r2, 0x1C\n" - "\tadds r0, r2\n" - "\tldr r1, _080882B0 @ =sub_8088890\n" - "\tstr r1, [r0]\n" - "\tldrh r0, [r3, 0x8]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r3, 0x8]\n" - "_080882A4:\n" - "\tpop {r4-r7}\n" - "\tpop {r0}\n" - "\tbx r0\n" - "\t.align 2, 0\n" - "_080882AC: .4byte gSprites\n" - "_080882B0: .4byte sub_8088890"); -} -#endif void sub_80882B4(struct Task *task) { - task->data[5] -= 0x10; + task->data[5] -= 16; if (gSprites[task->data[15]].data7) { task->data[0]++; } } -#ifdef NONMATCHING void sub_80882E4(struct Task *task) { s16 v2; s16 v3; - task->data[5] -= 0x10; - // The order in which registers are loaded is incorrect. - v2 = (task->data[2] >> 8) + 6; - v3 = (task->data[2] & 0xff) - 6; + task->data[5] -= 16; + v2 = (task->data[2] >> 8); + v3 = (task->data[2] & 0xff); + v2 += 6; + v3 -= 6; if (v2 > 0x50) { v2 = 0x50; @@ -2227,57 +2150,6 @@ void sub_80882E4(struct Task *task) task->data[0]++; } } -#else -__attribute__((naked)) -void sub_80882E4(struct Task *task) -{ - asm_unified("\tpush {r4,lr}\n" - "\tadds r3, r0, 0\n" - "\tldrh r0, [r3, 0x12]\n" - "\tsubs r0, 0x10\n" - "\tstrh r0, [r3, 0x12]\n" - "\tldrh r2, [r3, 0xC]\n" - "\tlsls r1, r2, 16\n" - "\tmovs r0, 0xFF\n" - "\tasrs r1, 24\n" - "\tadds r1, 0x6\n" - "\tlsls r1, 16\n" - "\tands r0, r2\n" - "\tsubs r0, 0x6\n" - "\tlsls r0, 16\n" - "\tlsrs r2, r0, 16\n" - "\tlsrs r4, r1, 16\n" - "\tasrs r1, 16\n" - "\tcmp r1, 0x50\n" - "\tble _0808830C\n" - "\tmovs r4, 0x50\n" - "_0808830C:\n" - "\tlsls r0, r2, 16\n" - "\tasrs r0, 16\n" - "\tcmp r0, 0x50\n" - "\tbgt _08088316\n" - "\tmovs r2, 0x51\n" - "_08088316:\n" - "\tlsls r0, r4, 16\n" - "\tasrs r0, 16\n" - "\tlsls r1, r0, 8\n" - "\tlsls r2, 16\n" - "\tasrs r2, 16\n" - "\torrs r1, r2\n" - "\tstrh r1, [r3, 0xC]\n" - "\tcmp r0, 0x50\n" - "\tbne _08088332\n" - "\tcmp r2, 0x51\n" - "\tbne _08088332\n" - "\tldrh r0, [r3, 0x8]\n" - "\tadds r0, 0x1\n" - "\tstrh r0, [r3, 0x8]\n" - "_08088332:\n" - "\tpop {r4}\n" - "\tpop {r0}\n" - "\tbx r0"); -} -#endif void sub_8088338(struct Task *task) { -- cgit v1.2.3 From 433a33ad6516fe18ce378edbb1539e805708d06e Mon Sep 17 00:00:00 2001 From: scnorton Date: Sun, 11 Jun 2017 14:58:09 -0400 Subject: Most of darkness field move streaks field effect --- src/field_effect.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 1 deletion(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index cd58e84ba..53f8aaed4 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2015,9 +2015,12 @@ void sub_808847C(u8); u8 sub_8088830(u32, u32, u32); extern const void (*gUnknown_0839F3AC[7])(struct Task *); extern const void (*gUnknown_0839F3C8[7])(struct Task *); -extern const u32 gFieldMoveStreaksTiles[]; +extern const u32 gFieldMoveStreaksTiles[0x200]; extern const u16 gFieldMoveStreaksPalette[16]; extern const u16 gFieldMoveStreaksTilemap[0x140]; +extern const u32 gDarknessFieldMoveStreaksTiles[0x80]; +extern const u16 gDarknessFieldMoveStreaksPalette[16]; +extern const u16 gDarknessFieldMoveStreaksTilemap[0x140]; void sub_80883DC(void); void sub_808843C(u16); void sub_8088890(struct Sprite *); @@ -2200,3 +2203,107 @@ void sub_808843C(u16 offs) *dest = gFieldMoveStreaksTilemap[i] | 0xf000; } } + +void sub_80886B0(void); +bool8 sub_8088708(struct Task *); +void sub_80886F8(struct Task *); +bool8 sub_80887C0(struct Task *); + +void sub_808847C(u8 taskId) +{ + gUnknown_0839F3C8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80884AC(struct Task *task) +{ + REG_BG0HOFS = task->data[1]; + REG_BG0VOFS = task->data[2]; + StoreWordInTwoHalfwords((u16 *)&task->data[13], (u32)gMain.vblankCallback); + SetVBlankCallback(sub_80886B0); + task->data[0]++; +} + +void sub_80884E8(struct Task *task) +{ + u16 offset; + u16 delta; + offset = ((REG_BG0CNT >> 2) << 14); + delta = ((REG_BG0CNT >> 8) << 11); + task->data[12] = delta; + CpuCopy16(gDarknessFieldMoveStreaksTiles, (void *)(VRAM + offset), 0x80); + CpuFill32(0, (void *)(VRAM + delta), 0x800); + LoadPalette(gDarknessFieldMoveStreaksPalette, 0xf0, 0x20); + task->data[0]++; +} + +void sub_8088554(struct Task *task) +{ + if (sub_8088708(task)) + { + REG_WIN1H = 0x00f0; + REG_WIN1V = 0x2878; + gSprites[task->data[15]].callback = sub_8088890; + task->data[0]++; + } + sub_80886F8(task); +} + +void sub_80885A8(struct Task *task) +{ + sub_80886F8(task); + if (gSprites[task->data[15]].data7) + { + task->data[0]++; + } +} + +void sub_80885D8(struct Task *task) +{ + sub_80886F8(task); + task->data[3] = task->data[1] & 7; + task->data[4] = 0; + REG_WIN1H = 0xffff; + REG_WIN1V = 0xffff; + task->data[0]++; +} + +void sub_808860C(struct Task *task) +{ + sub_80886F8(task); + if (sub_80887C0(task)) + { + task->data[0]++; + } +} + +void sub_808862C(struct Task *task) +{ + IntrCallback intrCallback; + u16 bg0cnt; + bg0cnt = (REG_BG0CNT >> 8) << 11; + CpuFill32(0, (void *)VRAM + bg0cnt, 0x800); + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + SetVBlankCallback(intrCallback); + SetUpWindowConfig(&gWindowConfig_81E6CE4); + InitMenuWindow(&gWindowConfig_81E6CE4); + FreeResourcesAndDestroySprite(&gSprites[task->data[15]]); + FieldEffectActiveListRemove(FLDEFF_FIELD_MOVE_SHOW_MON); + DestroyTask(FindTaskIdByFunc(sub_808847C)); +} + +void sub_80886B0(void) +{ + IntrCallback intrCallback; + struct Task *task; + task = &gTasks[FindTaskIdByFunc(sub_808847C)]; + LoadWordFromTwoHalfwords((u16 *)&task->data[13], (u32 *)&intrCallback); + intrCallback(); + REG_BG0HOFS = task->data[1]; + REG_BG0VOFS = task->data[2]; +} + +void sub_80886F8(struct Task *task) +{ + task->data[1] -= 16; + task->data[3] += 16; +} -- cgit v1.2.3 From a3162cb844dbbc6bbfd850163526c42cc0191d1c Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Jun 2017 21:04:00 -0400 Subject: Finish FldEff_FieldMoveShowMon except solitary nonmatching function --- src/field_effect.c | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 210 insertions(+), 2 deletions(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 53f8aaed4..12a5e1092 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2017,10 +2017,10 @@ extern const void (*gUnknown_0839F3AC[7])(struct Task *); extern const void (*gUnknown_0839F3C8[7])(struct Task *); extern const u32 gFieldMoveStreaksTiles[0x200]; extern const u16 gFieldMoveStreaksPalette[16]; -extern const u16 gFieldMoveStreaksTilemap[0x140]; +extern const u16 gFieldMoveStreaksTilemap[10 * 32]; extern const u32 gDarknessFieldMoveStreaksTiles[0x80]; extern const u16 gDarknessFieldMoveStreaksPalette[16]; -extern const u16 gDarknessFieldMoveStreaksTilemap[0x140]; +extern const u16 gDarknessFieldMoveStreaksTilemap[10 * 32]; void sub_80883DC(void); void sub_808843C(u16); void sub_8088890(struct Sprite *); @@ -2307,3 +2307,211 @@ void sub_80886F8(struct Task *task) task->data[1] -= 16; task->data[3] += 16; } + +#ifdef NONMATCHING +bool8 sub_8088708(struct Task *task) +{ + u16 i; + u16 srcOffs; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = (task->data[3] >> 3) & 0x1f; + if (dstOffs >= task->data[4]) + { + dstOffs = (32 - dstOffs) & 0x1f; + srcOffs = (32 - task->data[4]) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = gDarknessFieldMoveStreaksTilemap[srcOffs + i * 32] | 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = gDarknessFieldMoveStreaksTilemap[((srcOffs + 1) & 0x1f) + i * 32] | 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} +#else +__attribute__((naked)) +bool8 sub_8088708(struct Task *task) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x4\n" + "\tadds r5, r0, 0\n" + "\tldrh r2, [r5, 0x10]\n" + "\tmovs r1, 0x10\n" + "\tldrsh r0, [r5, r1]\n" + "\tcmp r0, 0x1F\n" + "\tble _08088724\n" + "\tmovs r0, 0x1\n" + "\tb _080887A8\n" + "_08088724:\n" + "\tldrh r0, [r5, 0xE]\n" + "\tlsls r0, 16\n" + "\tasrs r3, r0, 19\n" + "\tmovs r1, 0x1F\n" + "\tands r3, r1\n" + "\tmovs r4, 0x10\n" + "\tldrsh r0, [r5, r4]\n" + "\tcmp r3, r0\n" + "\tblt _080887A6\n" + "\tmovs r0, 0x20\n" + "\tsubs r3, r0, r3\n" + "\tands r3, r1\n" + "\tsubs r0, r2\n" + "\tmov r12, r0\n" + "\tmov r7, r12\n" + "\tands r7, r1\n" + "\tmov r12, r7\n" + "\tldrh r0, [r5, 0x20]\n" + "\tldr r1, _080887B8 @ =0x06000140\n" + "\tadds r1, r0\n" + "\tmov r8, r1\n" + "\tmovs r4, 0\n" + "\tldr r7, _080887BC @ =gDarknessFieldMoveStreaksTilemap\n" + "\tmov r10, r7\n" + "\tmovs r0, 0xF0\n" + "\tlsls r0, 8\n" + "\tmov r9, r0\n" + "\tadds r1, r3, 0x1\n" + "\tmovs r0, 0x1F\n" + "\tands r1, r0\n" + "\tstr r1, [sp]\n" + "\tmov r6, r12\n" + "\tadds r6, 0x1\n" + "\tands r6, r0\n" + "_08088768:\n" + "\tlsls r1, r4, 5\n" + "\tadds r2, r1, r3\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tmov r7, r12\n" + "\tadds r0, r7, r1\n" + "\tlsls r0, 1\n" + "\tadd r0, r10\n" + "\tldrh r0, [r0]\n" + "\tmov r7, r9\n" + "\torrs r0, r7\n" + "\tstrh r0, [r2]\n" + "\tldr r0, [sp]\n" + "\tadds r2, r1, r0\n" + "\tlsls r2, 1\n" + "\tadd r2, r8\n" + "\tadds r1, r6, r1\n" + "\tlsls r1, 1\n" + "\tadd r1, r10\n" + "\tldrh r0, [r1]\n" + "\tmov r1, r9\n" + "\torrs r0, r1\n" + "\tstrh r0, [r2]\n" + "\tadds r0, r4, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tcmp r4, 0x9\n" + "\tbls _08088768\n" + "\tldrh r0, [r5, 0x10]\n" + "\tadds r0, 0x2\n" + "\tstrh r0, [r5, 0x10]\n" + "_080887A6:\n" + "\tmovs r0, 0\n" + "_080887A8:\n" + "\tadd sp, 0x4\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_080887B8: .4byte 0x06000140\n" + "_080887BC: .4byte gDarknessFieldMoveStreaksTilemap"); +} +#endif + +bool8 sub_80887C0(struct Task *task) +{ + u16 i; + u16 dstOffs; + u16 *dest; + if (task->data[4] >= 32) + { + return TRUE; + } + dstOffs = task->data[3] >> 3; + if (dstOffs >= task->data[4]) + { + dstOffs = (task->data[1] >> 3) & 0x1f; + dest = (u16 *)(VRAM + 0x140 + (u16)task->data[12]); + for (i=0; i<10; i++) + { + dest[dstOffs + i * 32] = 0xf000; + dest[((dstOffs + 1) & 0x1f) + i * 32] = 0xf000; + } + task->data[4] += 2; + } + return FALSE; +} + +u8 sub_8088830(u32 a0, u32 a1, u32 a2) +{ + u16 v0; + u8 monSprite; + struct Sprite *sprite; + v0 = (a0 & 0x80000000) >> 16; + a0 &= 0x7fffffff; + monSprite = CreateMonSprite_FieldMove(a0, a1, a2, 0x140, 0x50, 0); + sprite = &gSprites[monSprite]; + sprite->callback = SpriteCallbackDummy; + sprite->oam.priority = 0; + sprite->data0 = a0; + sprite->data6 = v0; + return monSprite; +} + +void sub_80888D4(struct Sprite *); + +void sub_8088890(struct Sprite *sprite) +{ + if ((sprite->pos1.x -= 20) <= 0x78) + { + sprite->pos1.x = 0x78; + sprite->data1 = 30; + sprite->callback = sub_80888D4; + if (sprite->data6) + { + PlayCry2(sprite->data0, 0, 0x7d, 0xa); + } else + { + PlayCry1(sprite->data0, 0); + } + } +} + +void sub_80888F0(struct Sprite *); + +void sub_80888D4(struct Sprite *sprite) +{ + if ((--sprite->data1) == 0) + { + sprite->callback = sub_80888F0; + } +} + +void sub_80888F0(struct Sprite *sprite) +{ + if (sprite->pos1.x < -0x40) + { + sprite->data7 = 1; + } else + { + sprite->pos1.x -= 20; + } +} -- cgit v1.2.3 From 0ed7376e9ab879ce9a4628442540185d28dea537 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Sun, 11 Jun 2017 21:36:39 -0400 Subject: FldEff_UseSurf --- src/field_effect.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 12a5e1092..c7a7d8d5b 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2515,3 +2515,90 @@ void sub_80888F0(struct Sprite *sprite) sprite->pos1.x -= 20; } } + +void sub_8088954(u8); +extern const void (*gUnknown_0839F3E4[5])(struct Task *); + +u8 FldEff_UseSurf(void) +{ + u8 taskId; + taskId = CreateTask(sub_8088954, 0xff); + gTasks[taskId].data[15] = gUnknown_0202FF84[0]; + sav1_reset_battle_music_maybe(); + sub_8053FB0(0x016d); + return FALSE; +} + +void sub_8088954(u8 taskId) +{ + gUnknown_0839F3E4[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088984(struct Task *task) +{ + ScriptContext2_Enable(); + FreezeMapObjects(); + gPlayerAvatar.unk6 = 1; + SetPlayerAvatarStateMask(8); + PlayerGetDestCoords(&task->data[1], &task->data[2]); + MoveCoords(gMapObjects[gPlayerAvatar.mapObjectId].placeholder18, &task->data[1], &task->data[2]); + task->data[0]++; +} + +void sub_80889E4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_8088A30(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectCheckIfSpecialAnimFinishedOrInactive(mapObject)) + { + gUnknown_0202FF84[0] = task->data[15] | 0x80000000; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + task->data[0]++; + } +} + +void sub_8088A78(struct Task *task) +{ + struct MapObject *mapObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(3)); + FieldObjectClearAnimIfSpecialAnimFinished(mapObject); + FieldObjectSetSpecialAnim(mapObject, sub_80608D0(mapObject->placeholder18)); + gUnknown_0202FF84[0] = task->data[1]; + gUnknown_0202FF84[1] = task->data[2]; + gUnknown_0202FF84[2] = gPlayerAvatar.mapObjectId; + mapObject->mapobj_unk_1A = FieldEffectStart(FLDEFF_SURF_BLOB); + task->data[0]++; + } +} + +void sub_8088AF4(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + gPlayerAvatar.unk6 = 0; + gPlayerAvatar.flags &= 0xdf; + FieldObjectSetSpecialAnim(mapObject, GetFaceDirectionAnimId(mapObject->placeholder18)); + sub_8127ED0(mapObject->mapobj_unk_1A, 1); + UnfreezeMapObjects(); + ScriptContext2_Disable(); + FieldEffectActiveListRemove(FLDEFF_USE_SURF); + DestroyTask(FindTaskIdByFunc(sub_8088954)); + } +} -- cgit v1.2.3 From e74f4cc8c7aa66618212c6e5b74f21f4bbe29b6e Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Jun 2017 08:28:29 -0400 Subject: FldEff_NPCFlyOut --- src/field_effect.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index c7a7d8d5b..eeb12300b 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2602,3 +2602,40 @@ void sub_8088AF4(struct Task *task) DestroyTask(FindTaskIdByFunc(sub_8088954)); } } + +void sub_8088BC4(struct Sprite *); + +u8 FldEff_NPCFlyOut(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0x78, 0, 1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_8088BC4; + sprite->data1 = gUnknown_0202FF84[0]; + PlaySE(SE_W019); + return spriteId; +} + +void sub_8088BC4(struct Sprite *sprite) +{ + struct Sprite *npcSprite; + sprite->pos2.x = Cos(sprite->data2, 0x8c); + sprite->pos2.y = Sin(sprite->data2, 0x48); + sprite->data2 = (sprite->data2 + 4) & 0xff; + if (sprite->data0) + { + npcSprite = &gSprites[sprite->data1]; + npcSprite->coordOffsetEnabled = 0; + npcSprite->pos1.x = sprite->pos1.x + sprite->pos2.x; + npcSprite->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + npcSprite->pos2.x = 0; + npcSprite->pos2.y = 0; + } + if (sprite->data2 >= 0x80) + { + FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); + } +} -- cgit v1.2.3 From b3df9aad1ddbee7e467bf1799030a5f7987b5f32 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Jun 2017 09:26:59 -0400 Subject: FldEff_UseFly --- src/field_effect.c | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index eeb12300b..15f42c9f8 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2639,3 +2639,234 @@ void sub_8088BC4(struct Sprite *sprite) FieldEffectStop(sprite, FLDEFF_NPCFLY_OUT); } } + +void sub_8088C70(u8); +extern const void (*gUnknown_0839F3F8[9])(struct Task *); +extern void sub_8127EFC(u8, u8); +u8 sub_8088F60(void); +bool8 sub_8088FA4(u8); +void sub_8088FC0(u8); +void sub_8088FFC(u8, u8); +void sub_8089018(struct Sprite *); +void sub_80890D8(struct Sprite *); +extern const union AffineAnimCmd *gSpriteAffineAnimTable_0839F44C[]; + +u8 FldEff_UseFly(void) +{ + u8 taskId; + taskId = CreateTask(sub_8088C70, 0xfe); + gTasks[taskId].data[1] = gUnknown_0202FF84[0]; + return 0; +} + +void sub_8088C70(u8 taskId) +{ + gUnknown_0839F3F8[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_8088CA0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.unk6 = 0x01; + SetPlayerAvatarStateMask(1); + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_8088CF8(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + gUnknown_0202FF84[0] = task->data[1]; + FieldEffectStart(FLDEFF_FIELD_MOVE_SHOW_MON_INIT); + } +} + +void sub_8088D3C(struct Task *task) +{ + struct MapObject *mapObject; + if (!FieldEffectActiveListContains(FLDEFF_FIELD_MOVE_SHOW_MON)) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (task->data[15] & 0x08) + { + sub_8127ED0(mapObject->mapobj_unk_1A, 2); + sub_8127EFC(mapObject->mapobj_unk_1A, 0); + } + task->data[1] = sub_8088F60(); + task->data[0]++; + } +} + +void sub_8088D94(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + task->data[0]++; + task->data[2] = 16; + SetPlayerAvatarTransitionFlags(0x01); + FieldObjectSetSpecialAnim(&gMapObjects[gPlayerAvatar.mapObjectId], 0x02); + } +} + +void sub_8088DD8(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if ((task->data[2] == 0 || (--task->data[2]) == 0) && FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + PlaySE(SE_W019); + sub_8088FC0(task->data[1]); + } +} + +void sub_8088E2C(struct Task *task) +{ + struct MapObject *mapObject; + if ((++task->data[2]) >= 8) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x03)); + StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); + mapObject->mapobj_bit_12 = 1; + FieldObjectSetSpecialAnim(mapObject, 0x48); + if (task->data[15] & 0x08) + { + DestroySprite(&gSprites[mapObject->mapobj_unk_1A]); + } + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_8088EB4(struct Task *task) +{ + struct MapObject *mapObject; + if ((++task->data[2]) >= 10) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + FieldObjectClearAnimIfSpecialAnimActive(mapObject); + mapObject->mapobj_bit_12 = 0; + mapObject->mapobj_bit_22 = 0; + sub_8088FFC(task->data[1], mapObject->spriteId); + CameraObjectReset2(); + task->data[0]++; + } +} + +void sub_8088F10(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + fade_8080918(); + task->data[0]++; + } +} + +void sub_8088F30(struct Task *task) +{ + if (!gPaletteFade.active) + { + FieldEffectActiveListRemove(FLDEFF_USE_FLY); + DestroyTask(FindTaskIdByFunc(sub_8088C70)); + } +} + +u8 sub_8088F60(void) +{ + u8 spriteId; + struct Sprite *sprite; + spriteId = CreateSprite(gFieldEffectObjectTemplatePointers[26], 0xff, 0xb4, 0x1); + sprite = &gSprites[spriteId]; + sprite->oam.paletteNum = 0; + sprite->oam.priority = 1; + sprite->callback = sub_8089018; + return spriteId; +} + +u8 sub_8088FA4(u8 spriteId) +{ + return gSprites[spriteId].data7; +} + +void sub_8088FC0(u8 spriteId) +{ + struct Sprite *sprite; + sprite = &gSprites[spriteId]; + sprite->callback = sub_80890D8; + sprite->pos1.x = 0x78; + sprite->pos1.y = 0x00; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + memset(&sprite->data0, 0, 8 * sizeof(u16) /* zero all data cells */); + sprite->data6 = 0x40; +} + +void sub_8088FFC(u8 a0, u8 a1) +{ + gSprites[a0].data6 = a1; +} + +void sub_8089018(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data0 == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 0); + sprite->pos1.x = 0x76; + sprite->pos1.y = -0x30; + sprite->data0++; + sprite->data1 = 0x40; + sprite->data2 = 0x100; + } + sprite->data1 += (sprite->data2 >> 8); + sprite->pos2.x = Cos(sprite->data1, 0x78); + sprite->pos2.y = Sin(sprite->data1, 0x78); + if (sprite->data2 < 0x800) + { + sprite->data2 += 0x60; + } + if (sprite->data1 > 0x81) + { + sprite->data7++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + CalcCenterToCornerVec(sprite, sprite->oam.shape, sprite->oam.size, 0); + } + } +} + +void sub_80890D8(struct Sprite *sprite) +{ + struct Sprite *sprite1; + sprite->pos2.x = Cos(sprite->data2, 0x8c); + sprite->pos2.y = Sin(sprite->data2, 0x48); + sprite->data2 = (sprite->data2 + 4) & 0xff; + if (sprite->data6 != 0x40) + { + sprite1 = &gSprites[sprite->data6]; + sprite1->coordOffsetEnabled = 0; + sprite1->pos1.x = sprite->pos1.x + sprite->pos2.x; + sprite1->pos1.y = sprite->pos1.y + sprite->pos2.y - 8; + sprite1->pos2.x = 0; + sprite1->pos2.y = 0; + } + if (sprite->data2 >= 0x80) + { + sprite->data7 = 1; + } +} -- cgit v1.2.3 From e600694768b4badf5fca03e9671d13c54abedfd1 Mon Sep 17 00:00:00 2001 From: scnorton Date: Mon, 12 Jun 2017 12:16:45 -0400 Subject: Another sprite callback currently unlinked to any known/decompiled routine --- src/field_effect.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 15f42c9f8..9269f7db0 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2870,3 +2870,53 @@ void sub_80890D8(struct Sprite *sprite) sprite->data7 = 1; } } + +void sub_808914C(struct Sprite *sprite) +{ + if (sprite->data7 == 0) + { + if (sprite->data0 == 0) + { + sprite->oam.affineMode = 3; + sprite->affineAnims = gSpriteAffineAnimTable_0839F44C; + InitSpriteAffineAnim(sprite); + StartSpriteAffineAnim(sprite, 1); + sprite->pos1.x = 0x5e; + sprite->pos1.y = -0x20; + sprite->data0++; + sprite->data1 = 0xf0; + sprite->data2 = 0x800; + sprite->data4 = 0x80; + } + sprite->data1 += sprite->data2 >> 8; + sprite->data3 += sprite->data2 >> 8; + sprite->data1 &= 0xff; + sprite->pos2.x = Cos(sprite->data1, 0x20); + sprite->pos2.y = Sin(sprite->data1, 0x78); + if (sprite->data2 > 0x100) + { + sprite->data2 -= sprite->data4; + } + if (sprite->data4 < 0x100) + { + sprite->data4 += 24; + } + if (sprite->data2 < 0x100) + { + sprite->data2 = 0x100; + } + if (sprite->data3 >= 60) + { + sprite->data7++; + sprite->oam.affineMode = 0; + FreeOamMatrix(sprite->oam.matrixNum); + sprite->invisible = 1; + } + } +} + +void sub_8089230(u8 spriteId) +{ + sub_8088FC0(spriteId); + gSprites[spriteId].callback = sub_808914C; +} -- cgit v1.2.3 From db6818ca9149304463e5e2219ec90993a3af53b2 Mon Sep 17 00:00:00 2001 From: scnorton Date: Mon, 12 Jun 2017 13:58:12 -0400 Subject: FldEff_FlyIn (last remaining field effect) --- src/field_effect.c | 132 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 9269f7db0..6cff8b864 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -2920,3 +2920,135 @@ void sub_8089230(u8 spriteId) sub_8088FC0(spriteId); gSprites[spriteId].callback = sub_808914C; } + +void sub_8089270(u8); +extern const void (*gUnknown_0839F454[7])(struct Task *); +extern const s16 gUnknown_0839F470[18]; + +u8 FldEff_FlyIn(void) +{ + CreateTask(sub_8089270, 0xfe); + return 0; +} + +void sub_8089270(u8 taskId) +{ + gUnknown_0839F454[gTasks[taskId].data[0]](&gTasks[taskId]); +} + +void sub_80892A0(struct Task *task) +{ + struct MapObject *mapObject; + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + if (!FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(mapObject) || FieldObjectClearAnimIfSpecialAnimFinished(mapObject)) + { + task->data[0]++; + task->data[2] = 17; + task->data[15] = gPlayerAvatar.flags; + gPlayerAvatar.unk6 = 1; + SetPlayerAvatarStateMask(0x01); + if (task->data[15] & 0x08) + { + sub_8127ED0(mapObject->mapobj_unk_1A, 0); + } + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(0x3)); + CameraObjectReset2(); + FieldObjectTurn(mapObject, DIR_WEST); + StartSpriteAnim(&gSprites[mapObject->spriteId], 0x16); + mapObject->mapobj_bit_13 = 0; + task->data[1] = sub_8088F60(); + sub_8088FC0(task->data[1]); + sub_8088FFC(task->data[1], mapObject->spriteId); + } +} + +void sub_8089354(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + if (task->data[2] == 0 || (--task->data[2]) == 0) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + sub_8088FFC(task->data[1], 0x40); + sprite->pos1.x += sprite->pos2.x; + sprite->pos1.y += sprite->pos2.y; + sprite->pos2.x = 0; + sprite->pos2.y = 0; + task->data[0]++; + task->data[2] = 0; + } +} + +void sub_80893C0(struct Task *task) +{ + s16 unknown_0839F470[18]; + struct Sprite *sprite; + memcpy(unknown_0839F470, gUnknown_0839F470, sizeof gUnknown_0839F470); + sprite = &gSprites[gPlayerAvatar.spriteId]; + sprite->pos2.y = unknown_0839F470[task->data[2]]; + if ((++task->data[2]) >= 18) + { + task->data[0]++; + } +} + +void sub_8089414(struct Task *task) +{ + struct MapObject *mapObject; + struct Sprite *sprite; + if (sub_8088FA4(task->data[1])) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + sprite = &gSprites[mapObject->spriteId]; + mapObject->mapobj_bit_12 = 0; + sub_805C058(mapObject, mapObject->coords2.x, mapObject->coords2.y); + sprite->pos2.x = 0; + sprite->pos2.y = 0; + sprite->coordOffsetEnabled = 1; + sub_8059BF4(); + FieldObjectSetSpecialAnim(mapObject, 0x39); + task->data[0]++; + } +} + +void sub_808948C(struct Task *task) +{ + if (FieldObjectClearAnimIfSpecialAnimFinished(&gMapObjects[gPlayerAvatar.mapObjectId])) + { + task->data[0]++; + sub_8089230(task->data[1]); + } +} + +void sub_80894C4(struct Task *task) +{ + if (sub_8088FA4(task->data[1])) + { + DestroySprite(&gSprites[task->data[1]]); + task->data[0]++; + task->data[1] = 0x10; + } +} + +void fishE(struct Task *task) +{ + u8 state; + struct MapObject *mapObject; + if ((--task->data[1]) == 0) + { + mapObject = &gMapObjects[gPlayerAvatar.mapObjectId]; + state = 0; + if (task->data[15] & 0x08) + { + state = 3; + sub_8127ED0(mapObject->mapobj_unk_1A, 1); + } + sub_805B980(mapObject, GetPlayerAvatarGraphicsIdByStateId(state)); + FieldObjectTurn(mapObject, DIR_SOUTH); + gPlayerAvatar.flags = task->data[15]; + gPlayerAvatar.unk6 = 0; + FieldEffectActiveListRemove(FLDEFF_FLY_IN); + DestroyTask(FindTaskIdByFunc(sub_8089270)); + } +} -- cgit v1.2.3 From 8f48da59b18f0d0431e8c64d369d3e82f96be191 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Mon, 12 Jun 2017 20:57:16 -0400 Subject: Merge field_effects data into src/field_effect.c --- src/field_effect.c | 434 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 391 insertions(+), 43 deletions(-) (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c index 6cff8b864..8728155e1 100755 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -22,14 +22,402 @@ #include "field_camera.h" #include "field_effect.h" -typedef bool8 (*FldEffCmd)(u8 **, u32 *); +#define subsprite_table(ptr) {.subsprites = ptr, .subspriteCount = (sizeof ptr) / (sizeof(struct Subsprite))} + +#define obj_frame_tiles(ptr) {.data = (u8 *)ptr, .size = sizeof ptr} + +const u32 gSpriteImage_839DC14[] = INCBIN_U32("graphics/birch_speech/birch.4bpp"); +const u16 gBirchPalette[16] = INCBIN_U16("graphics/birch_speech/birch.gbapal"); +const u32 gSpriteImage_839E434[] = INCBIN_U32("graphics/misc/pokeball_glow.4bpp"); +const u16 gFieldEffectObjectPalette4[16] = INCBIN_U16("graphics/field_effect_objects/palettes/04.gbapal"); +const u32 gSpriteImage_839E474[] = INCBIN_U32("graphics/misc/pokecenter_monitor/0.4bpp"); +const u32 gSpriteImage_839E534[] = INCBIN_U32("graphics/misc/pokecenter_monitor/1.4bpp"); +const u32 gSpriteImage_839E5F4[] = INCBIN_U32("graphics/misc/big_hof_monitor.4bpp"); +const u32 gSpriteImage_839E7F4[] = INCBIN_U32("graphics/misc/small_hof_monitor.4bpp"); +const u16 gFieldEffectObjectPalette5[16] = INCBIN_U16("graphics/field_effect_objects/palettes/05.gbapal"); + +// Graphics for the lights streaking past your Pokemon when it uses a field move. +const u32 gFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/field_move_streaks.4bpp"); +const u16 gFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/field_move_streaks.gbapal"); +const u16 gFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/field_move_streaks_map.bin"); + +// The following light streaks effect is used when the map is dark (e.g. a cave). +const u32 gDarknessFieldMoveStreaksTiles[] = INCBIN_U32("graphics/misc/darkness_field_move_streaks.4bpp"); +const u16 gDarknessFieldMoveStreaksPalette[16] = INCBIN_U16("graphics/misc/darkness_field_move_streaks.gbapal"); +const u16 gDarknessFieldMoveStreaksTilemap[] = INCBIN_U16("graphics/misc/darkness_field_move_streaks_map.bin"); + +bool8 (*const gFieldEffectScriptFuncs[])(u8 **, u32 *) = { + FieldEffectCmd_loadtiles, + FieldEffectCmd_loadfadedpal, + FieldEffectCmd_loadpal, + FieldEffectCmd_callnative, + FieldEffectCmd_end, + FieldEffectCmd_loadgfx_callnative, + FieldEffectCmd_loadtiles_callnative, + FieldEffectCmd_loadfadedpal_callnative, +}; + +const struct OamData gOamData_839F0F4 = {.size = 3}; +const struct OamData gOamData_839F0FC = {.size = 0}; +const struct OamData gOamData_839F104 = {.size = 1}; + +const struct SpriteFrameImage gSpriteImageTable_839F10C[] = { + obj_frame_tiles(gSpriteImage_839DC14) +}; +const struct SpritePalette gUnknown_0839F114 = {.data = gBirchPalette, .tag = 0x1006}; + +const union AnimCmd gSpriteAnim_839F11C[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 1), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_839F124[] = { + gSpriteAnim_839F11C +}; + +const struct SpriteTemplate gSpriteTemplate_839F128 = { + .tileTag = 0xffff, + .paletteTag = 4102, + .oam = &gOamData_839F0F4, + .anims = (const union AnimCmd *const *)&gSpriteAnimTable_839F124, + .images = gSpriteImageTable_839F10C, + .affineAnims = (const union AffineAnimCmd *const *)&gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + +const struct SpritePalette gFieldEffectObjectPaletteInfo4 = {.data = gFieldEffectObjectPalette4, .tag = 0x1007}; +const struct SpritePalette gFieldEffectObjectPaletteInfo5 = {.data = gFieldEffectObjectPalette5, .tag = 0x1010}; +const struct OamData gOamData_839F150 = { + .shape = 1, + .size = 2 +}; + +const struct SpriteFrameImage gSpriteImageTable_839F158[] = { + obj_frame_tiles(gSpriteImage_839E434) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F160[] = { + obj_frame_tiles(gSpriteImage_839E474), + obj_frame_tiles(gSpriteImage_839E534) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F170[] = { + obj_frame_tiles(gSpriteImage_839E5F4) +}; + +const struct SpriteFrameImage gSpriteImageTable_839F178[] = { + {.data = (u8 *)gSpriteImage_839E7F4, .size = 0x200} // the macro breaks down here +}; + +const struct Subsprite Unknown_39F180[] = { + {.x = -12, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 0}, + {.x = 4, .y = -8, .priority = 2, .tileOffset = 2, .shape = 0, .size = 0}, + {.x = -12, .y = 0, .priority = 2, .tileOffset = 3, .shape = 1, .size = 0}, + {.x = 4, .y = 0, .priority = 2, .tileOffset = 5, .shape = 0, .size = 0} +}; + +const struct SubspriteTable gUnknown_0839F1A0 = subsprite_table(Unknown_39F180); + +const struct Subsprite Unknown_39F1A8[] = { + {.x = -32, .y = -8, .priority = 2, .tileOffset = 0, .shape = 1, .size = 1}, + {.x = 0, .y = -8, .priority = 2, .tileOffset = 4, .shape = 1, .size = 1}, + {.x = -32, .y = 0, .priority = 2, .tileOffset = 8, .shape = 1, .size = 1}, + {.x = 0, .y = 0, .priority = 2, .tileOffset = 12, .shape = 1, .size = 1} +}; + +const struct SubspriteTable gUnknown_0839F1C8 = subsprite_table(Unknown_39F1A8); + +const union AnimCmd gSpriteAnim_839F1D0[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 1), + ANIMCMD_JUMP(0) +}; + +const union AnimCmd gSpriteAnim_839F1D8[] = { + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_FRAME(.imageValue = 0, .duration = 16), + ANIMCMD_FRAME(.imageValue = 1, .duration = 16), + ANIMCMD_END +}; + +const union AnimCmd *const gSpriteAnimTable_839F1FC[] = { + gSpriteAnim_839F1D0, + gSpriteAnim_839F1D8 +}; + +const union AnimCmd *const gSpriteAnimTable_839F204[] = { + gSpriteAnim_839F1D0 +}; + +const struct SpriteTemplate gSpriteTemplate_839F208 = { + .tileTag = 0xffff, + .paletteTag = 4103, + .oam = &gOamData_839F0FC, + .anims = gSpriteAnimTable_839F1FC, + .images = gSpriteImageTable_839F158, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokeballGlow +}; + + +const struct SpriteTemplate gSpriteTemplate_839F220 = { + .tileTag = 0xffff, + .paletteTag = 4100, + .oam = &gOamData_839F104, + .anims = gSpriteAnimTable_839F1FC, + .images = gSpriteImageTable_839F160, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_PokecenterMonitor +}; + + +const struct SpriteTemplate gSpriteTemplate_839F238 = { + .tileTag = 0xffff, + .paletteTag = 4112, + .oam = &gOamData_839F104, + .anims = gSpriteAnimTable_839F204, + .images = gSpriteImageTable_839F170, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + + +const struct SpriteTemplate gSpriteTemplate_839F250 = { + .tileTag = 0xffff, + .paletteTag = 4112, + .oam = &gOamData_839F150, + .anims = gSpriteAnimTable_839F204, + .images = gSpriteImageTable_839F178, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCB_HallOfFameMonitor +}; + +void (*const gUnknown_0839F268[])(struct Task *) = { + PokecenterHealEffect_0, + PokecenterHealEffect_1, + PokecenterHealEffect_2, + PokecenterHealEffect_3 +}; + +void (*const gUnknown_0839F278[])(struct Task *) = { + HallOfFameRecordEffect_0, + HallOfFameRecordEffect_1, + HallOfFameRecordEffect_2, + HallOfFameRecordEffect_3 +}; + +void (*const gUnknown_0839F288[])(struct Sprite *) = { + PokeballGlowEffect_0, + PokeballGlowEffect_1, + PokeballGlowEffect_2, + PokeballGlowEffect_3, + PokeballGlowEffect_4, + PokeballGlowEffect_5, + PokeballGlowEffect_6, + PokeballGlowEffect_7 +}; + +const struct Coords16 gUnknown_0839F2A8[] = { + {.x = 0, .y = 0}, + {.x = 6, .y = 0}, + {.x = 0, .y = 4}, + {.x = 6, .y = 4}, + {.x = 0, .y = 8}, + {.x = 6, .y = 8} +}; + +const u8 gUnknown_0839F2C0[] = {16, 12, 8, 0}; +const u8 gUnknown_0839F2C4[] = {16, 12, 8, 0}; +const u8 gUnknown_0839F2C8[] = { 0, 0, 0, 0}; + +bool8 (*const gUnknown_0839F2CC[])(struct Task *) = { + sub_80867AC, + sub_8086854, + sub_8086870, + sub_80868E4, + sub_808699C, + sub_80869B8, + sub_80869F8 +}; + +bool8 (*const gUnknown_0839F2E8[])(struct Task *) = { + sub_8086AA0, + sub_8086AC0, + sub_8086B30, + sub_8086B54, + sub_8086B64, + sub_8086B88 +}; + +bool8 (*const gUnknown_0839F300[])(struct Task *) = { + sub_8086CF4, + sub_8086D70, + sub_8086DB0, + sub_8086E10, + sub_8086E50, + sub_8086EB0, + sub_8086ED4 +}; + +bool8 (*const gUnknown_0839F31C[])(struct Task *, struct MapObject *) = { + sub_8086FB0, + waterfall_1_do_anim_probably, + waterfall_2_wait_anim_finish_probably, + sub_8087030, + sub_8087058 +}; + +bool8 (*const gUnknown_0839F330[])(struct Task *) = { + sub_8087124, + dive_2_unknown, + dive_3_unknown +}; + +bool8 (*const gUnknown_0839F33C[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_808722C, + sub_8087264, + sub_8087298, + sub_80872E4, + sub_80873D8, + sub_80873F4 +}; + +bool8 (*const gUnknown_0839F354[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_80874CC, + sub_80874FC, + sub_8087548, + sub_808759C +}; + +bool8 (*const gUnknown_0839F364[])(struct Task *, struct MapObject *, struct Sprite *) = { + sub_80876C8, + sub_80876F8, + sub_8087774, + sub_80877AC, + sub_80877D4 +}; + +void (*const gUnknown_0839F378[])(struct Task *) = { + sub_80878F4, + sub_8087914 +}; + +const u8 gUnknown_0839F380[] = {1, 3, 4, 2, 1}; + +void (*const gUnknown_0839F388[])(struct Task *) = { + sub_8087AA4, + sub_8087AC8 +}; + +void (*const gUnknown_0839F390[])(struct Task *) = { + sub_8087BEC, + sub_8087C14, + sub_8087CA4, + sub_8087D78 +}; + +void (*const gUnknown_0839F3A0[])(struct Task *) = { + sub_8087E4C, + sub_8087ED8, + sub_8087FDC +}; + +void (*const gUnknown_0839F3AC[])(struct Task *) = { + sub_8088150, + sub_80881C0, + sub_8088228, + sub_80882B4, + sub_80882E4, + sub_8088338, + sub_8088380 +}; + +void (*const gUnknown_0839F3C8[])(struct Task *) = { + sub_80884AC, + sub_80884E8, + sub_8088554, + sub_80885A8, + sub_80885D8, + sub_808860C, + sub_808862C +}; + +void (*const gUnknown_0839F3E4[])(struct Task *) = { + sub_8088984, + sub_80889E4, + sub_8088A30, + sub_8088A78, + sub_8088AF4 +}; + +void (*const gUnknown_0839F3F8[])(struct Task *) = { + sub_8088CA0, + sub_8088CF8, + sub_8088D3C, + sub_8088D94, + sub_8088DD8, + sub_8088E2C, + sub_8088EB4, + sub_8088F10, + sub_8088F30 +}; + +const union AffineAnimCmd SpriteAffineAnim_839F41C[] = { + AFFINEANIMCMD_FRAME(8, 8, -30, 0), + AFFINEANIMCMD_FRAME(28, 28, 0, 30), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd SpriteAffineAnim_839F434[] = { + AFFINEANIMCMD_FRAME(256, 256, 64, 0), + AFFINEANIMCMD_FRAME(-10, -10, 0, 22), + AFFINEANIMCMD_END +}; + +const union AffineAnimCmd *const gSpriteAffineAnimTable_0839F44C[] = { + SpriteAffineAnim_839F41C, + SpriteAffineAnim_839F434 +}; + +void (*const gUnknown_0839F454[])(struct Task *) = { + sub_80892A0, + sub_8089354, + sub_80893C0, + sub_8089414, + sub_808948C, + sub_80894C4, + fishE +}; + +const s16 gUnknown_0839F470[] = { + -2, + -4, + -5, + -6, + -7, + -8, + -8, + -8, + -7, + -7, + -6, + -5, + -3, + -2, + 0, + 2, + 4, + 8 +}; static u8 sActiveList[32]; extern u8 *gFieldEffectScriptPointers[]; -extern FldEffCmd gFieldEffectScriptFuncs[]; - u32 FieldEffectStart(u8 id) { u8 *script; @@ -460,7 +848,6 @@ void MultiplyPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) #endif void Task_PokecenterHeal(u8 taskId); -extern const void (*gUnknown_0839F268[4])(struct Task *); u8 CreatePokeballGlowSprite(s16, s16, s16, u16); u8 PokecenterHealEffectHelper(s16, s16); @@ -521,7 +908,6 @@ void PokecenterHealEffect_3(struct Task *task) } void Task_HallOfFameRecord(u8 taskId); -extern const void (*gUnknown_0839F278[4])(struct Task *); void HallOfFameRecordEffectHelper(s16, s16, s16, u8); bool8 FldEff_HallOfFameRecord(void) @@ -585,14 +971,6 @@ void HallOfFameRecordEffect_3(struct Task *task) } void SpriteCB_PokeballGlowEffect(struct Sprite *); -extern const void (*gUnknown_0839F288[8])(struct Sprite *); -extern const struct SpriteTemplate gSpriteTemplate_839F208; -extern const struct SpriteTemplate gSpriteTemplate_839F220; -extern const struct SpriteTemplate gSpriteTemplate_839F238; -extern const struct SpriteTemplate gSpriteTemplate_839F250; -extern const struct SubspriteTable gUnknown_0839F1A0; -extern const struct SubspriteTable gUnknown_0839F1C8; -extern const struct Coords16 gUnknown_0839F2A8[6]; u8 CreatePokeballGlowSprite(s16 data6, s16 x, s16 y, u16 data5) { @@ -633,10 +1011,6 @@ void PokeballGlowEffect_0(struct Sprite *sprite) } } -extern const u8 gUnknown_0839F2C0[4]; // red -extern const u8 gUnknown_0839F2C4[4]; // green -extern const u8 gUnknown_0839F2C8[4]; // blue - void PokeballGlowEffect_1(struct Sprite *sprite) { if ((--sprite->data1) == 0) @@ -881,7 +1255,6 @@ void c3_080843F8(u8 taskId) extern void pal_fill_for_map_transition(void); void sub_8086774(u8); -extern const bool8 (*gUnknown_0839F2CC[7])(struct Task *); extern void CameraObjectReset2(void); extern void CameraObjectReset1(void); @@ -1015,8 +1388,6 @@ bool8 sub_80869F8(struct Task *task) } void sub_8086A68(u8); -extern const bool8 (*gUnknown_0839F2E8[6])(struct Task *); -extern const bool8 (*gUnknown_0839F300[7])(struct Task *); extern void sub_80B4824(u8); extern void sub_8053FF8(void); extern void fade_8080918(void); @@ -1285,7 +1656,6 @@ bool8 sub_8086ED4(struct Task *task) } void sub_8086F64(u8); -extern const bool8 (*gUnknown_0839F31C[5])(struct Task *, struct MapObject *); bool8 FldEff_UseWaterfall(void) { @@ -1358,7 +1728,6 @@ bool8 sub_8087058(struct Task *task, struct MapObject *mapObject) } void Task_Dive(u8); -extern const bool8 (*gUnknown_0839F330[3])(struct Task *); extern int dive_warp(struct MapPosition *, u16); bool8 FldEff_UseDive(void) @@ -1406,7 +1775,6 @@ bool8 dive_3_unknown(struct Task *task) } void sub_80871D0(u8); -extern const bool8 (*gUnknown_0839F33C[6])(struct Task *, struct MapObject *, struct Sprite *); void mapldr_080851BC(void); void sub_80871B8(u8 priority) @@ -1522,7 +1890,6 @@ bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite } void sub_8087470(u8); -extern const bool8 (*gUnknown_0839F354[4])(struct Task *, struct MapObject *, struct Sprite *); extern u8 sub_80608A4(u8); void mapldr_080851BC(void) @@ -1611,7 +1978,6 @@ void sub_8087638(struct Sprite *sprite) } void sub_808766C(u8); -extern const bool8 (*gUnknown_0839F364[5])(struct Task *, struct MapObject *, struct Sprite *); void sub_8087654(u8 priority) { @@ -1677,8 +2043,6 @@ bool8 sub_80877AC(struct Task *task, struct MapObject *mapObject, struct Sprite } void sub_80878C4(u8); -extern u8 gUnknown_0839F380[5]; -extern const void (*gUnknown_0839F378[2])(struct Task *); void mapldr_080859D4(void); bool8 sub_80877D4(struct Task *task, struct MapObject *mapObject, struct Sprite *sprite) @@ -1764,7 +2128,6 @@ void sub_8087914(struct Task *task) } void sub_8087A74(u8); -extern const void (*gUnknown_0839F388[2])(struct Task *); void mapldr_080859D4(void) { @@ -1822,7 +2185,6 @@ void sub_8087AC8(struct Task *task) } void sub_8087BBC(u8); -extern const void (*gUnknown_0839F390[4])(struct Task *); void mapldr_08085D88(void); void sub_8087BA8(void) @@ -1910,7 +2272,6 @@ void sub_8087D78(struct Task *task) } void sub_8087E1C(u8); -extern const void (*gUnknown_0839F3A0[3])(struct Task *); void mapldr_08085D88(void) { @@ -2013,14 +2374,6 @@ void sub_8087FDC(struct Task *task) void sub_8088120(u8); void sub_808847C(u8); u8 sub_8088830(u32, u32, u32); -extern const void (*gUnknown_0839F3AC[7])(struct Task *); -extern const void (*gUnknown_0839F3C8[7])(struct Task *); -extern const u32 gFieldMoveStreaksTiles[0x200]; -extern const u16 gFieldMoveStreaksPalette[16]; -extern const u16 gFieldMoveStreaksTilemap[10 * 32]; -extern const u32 gDarknessFieldMoveStreaksTiles[0x80]; -extern const u16 gDarknessFieldMoveStreaksPalette[16]; -extern const u16 gDarknessFieldMoveStreaksTilemap[10 * 32]; void sub_80883DC(void); void sub_808843C(u16); void sub_8088890(struct Sprite *); @@ -2517,7 +2870,6 @@ void sub_80888F0(struct Sprite *sprite) } void sub_8088954(u8); -extern const void (*gUnknown_0839F3E4[5])(struct Task *); u8 FldEff_UseSurf(void) { @@ -2641,7 +2993,6 @@ void sub_8088BC4(struct Sprite *sprite) } void sub_8088C70(u8); -extern const void (*gUnknown_0839F3F8[9])(struct Task *); extern void sub_8127EFC(u8, u8); u8 sub_8088F60(void); bool8 sub_8088FA4(u8); @@ -2649,7 +3000,6 @@ void sub_8088FC0(u8); void sub_8088FFC(u8, u8); void sub_8089018(struct Sprite *); void sub_80890D8(struct Sprite *); -extern const union AffineAnimCmd *gSpriteAffineAnimTable_0839F44C[]; u8 FldEff_UseFly(void) { @@ -2922,8 +3272,6 @@ void sub_8089230(u8 spriteId) } void sub_8089270(u8); -extern const void (*gUnknown_0839F454[7])(struct Task *); -extern const s16 gUnknown_0839F470[18]; u8 FldEff_FlyIn(void) { -- cgit v1.2.3 From 3d4c2f73cb19ef1f5215600c15272dd4d54c4fc0 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 14 Jun 2017 22:54:42 -0400 Subject: FILE MODES BrokeBack --- src/field_effect.c | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 src/field_effect.c (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c old mode 100755 new mode 100644 -- cgit v1.2.3 From d8f4d3da44d52ac56d93a41edb24cf0a803f5c67 Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Wed, 14 Jun 2017 23:02:07 -0400 Subject: Remove unnecessary macros --- src/field_effect.c | 1 - 1 file changed, 1 deletion(-) mode change 100644 => 100755 src/field_effect.c (limited to 'src/field_effect.c') diff --git a/src/field_effect.c b/src/field_effect.c old mode 100644 new mode 100755 index 8728155e1..2bf9b3dc9 --- a/src/field_effect.c +++ b/src/field_effect.c @@ -674,7 +674,6 @@ void FreeResourcesAndDestroySprite(struct Sprite *sprite) DestroySprite(sprite); } -#undef NONMATCHING #ifdef NONMATCHING void MultiplyInvertedPaletteRGBComponents(u16 i, u8 r, u8 g, u8 b) { -- cgit v1.2.3