diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/fldeff_groundshake.c | 123 | ||||
-rw-r--r-- | src/fldeff_sweetscent.c | 3 | ||||
-rw-r--r-- | src/fossil_specials.c | 1006 |
3 files changed, 1102 insertions, 30 deletions
diff --git a/src/fldeff_groundshake.c b/src/fldeff_groundshake.c index 34524ffd5..92aaf5238 100644 --- a/src/fldeff_groundshake.c +++ b/src/fldeff_groundshake.c @@ -5,7 +5,6 @@ #include "event_data.h" #include "field_camera.h" #include "field_map_obj.h" -#include "fldeff_groundshake.h" #include "malloc.h" #include "random.h" #include "script.h" @@ -13,9 +12,109 @@ #include "sprite.h" #include "task.h" -extern const struct SpriteTemplate gUnknown_08617E34; -extern const struct SpriteTemplate gUnknown_08617E60; +// structures +struct InnerStruct203CF18 +{ + u8 filler[0xC4]; +}; + +struct Struct203CF18 { + u8 taskId; + struct InnerStruct203CF18 unk4; +}; //size = 0xC8 + +// extern data +extern const struct SpriteSheet gUnknown_08617D94[]; +extern const s16 gUnknown_08617D64[][3]; + +// extern functions +extern void sub_8151B68(struct InnerStruct203CF18 *, const u8*); +extern void sub_8151B3C(struct InnerStruct203CF18 *); +extern void sub_8151CA8(struct InnerStruct203CF18 *, u8, u8); +extern void sub_8151C50(struct InnerStruct203CF18 *, u8, u8); +extern void sub_8151D28(struct InnerStruct203CF18 *, u8, u8); +extern void sub_8151E50(struct InnerStruct203CF18 *); + +// static functions +static void sub_81BE808(u8 taskId); +static void sub_81BE900(u8 taskId); +static void sub_81BE968(void); +static void sub_81BE9C0(u8 taskId); +static void sub_81BEA00(u8 taskId); +static void sub_81BEA20(void); +static void sub_81BEAD8(struct Sprite* sprite); +//.rodata +static const u8 gUnknown_08617E18[] = {0x3b, 0x43, 0x61, 0x00, 0x0f, 0x05, 0xff, 0x9b}; + +static const union AnimCmd gSpriteAnim_8617E20[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const gSpriteAnimTable_8617E28[] = +{ + gSpriteAnim_8617E20, +}; + +static const struct OamData gUnknown_08617E2C = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 0, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate gUnknown_08617E34 = { + 0x0FA0, 0xFFFF, &gUnknown_08617E2C, gSpriteAnimTable_8617E28, NULL, gDummySpriteAffineAnimTable, sub_81BEAD8 +}; + +static const union AnimCmd gSpriteAnim_8617E4C[] = +{ + ANIMCMD_FRAME(0, 12), + ANIMCMD_JUMP(0), +}; + +static const union AnimCmd *const gSpriteAnim_8617E54[] = +{ + gSpriteAnim_8617E4C, +}; + +static const struct OamData gSpriteAnim_8617E58 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 0, + .affineParam = 0, +}; + +static const struct SpriteTemplate gUnknown_08617E60 = { + 0x0FA0, 0xFFFF, &gSpriteAnim_8617E58, gSpriteAnim_8617E54, NULL, gDummySpriteAffineAnimTable, sub_81BEAD8 +}; + +// ewram +EWRAM_DATA struct Struct203CF18 *gUnknown_0203CF18 = NULL; + +//text bool8 sub_81BE66C(void) { if (!(gSaveBlock1Ptr->location.mapGroup == 0x0 && gSaveBlock1Ptr->location.mapNum == 0x1A)) @@ -90,7 +189,7 @@ void sub_81BE7F4(void) CreateTask(sub_81BE808, 0x8); } -void sub_81BE808(u8 taskId) +static void sub_81BE808(u8 taskId) { u8 mapObjectIdBuffer; struct MapObject *fieldMapObject; @@ -109,7 +208,7 @@ void sub_81BE808(u8 taskId) } } -void sp136_strengh_sound(u8 a, u8 b, u8 c, u8 d) +static void sp136_strengh_sound(u8 a, u8 b, u8 c, u8 d) { u8 taskId; @@ -123,7 +222,7 @@ void sp136_strengh_sound(u8 a, u8 b, u8 c, u8 d) PlaySE(SE_W070); } -void sub_81BE900(u8 taskId) +static void sub_81BE900(u8 taskId) { s16 *data; @@ -145,7 +244,7 @@ void sub_81BE900(u8 taskId) } } -void sub_81BE968(void) +static void sub_81BE968(void) { u8 taskId; @@ -154,8 +253,6 @@ void sub_81BE968(void) gTasks[taskId].data[0]++; } -extern const struct SpriteSheet gUnknown_08617D94[]; - void sub_81BE994(void) { LoadSpriteSheets(gUnknown_08617D94); @@ -164,7 +261,7 @@ void sub_81BE994(void) sp136_strengh_sound(2, 1, 16, 3); } -void sub_81BE9C0(u8 taskId) +static void sub_81BE9C0(u8 taskId) { u16 *data; @@ -174,14 +271,14 @@ void sub_81BE9C0(u8 taskId) gTasks[taskId].func = sub_81BEA00; } -void sub_81BEA00(u8 taskId) +static void sub_81BEA00(u8 taskId) { FreeSpriteTilesByTag(4000); DestroyTask(taskId); EnableBothScriptContexts(); } -void sub_81BEA20(void) +static void sub_81BEA20(void) { u8 count; u8 spriteId; @@ -202,7 +299,7 @@ void sub_81BEA20(void) } } -void sub_81BEAD8(struct Sprite* sprite) +static void sub_81BEAD8(struct Sprite* sprite) { sprite->data[1] += 2; sprite->pos2.y = (sprite->data[1] / 2); diff --git a/src/fldeff_sweetscent.c b/src/fldeff_sweetscent.c index 3dfcd640d..100e440a5 100644 --- a/src/fldeff_sweetscent.c +++ b/src/fldeff_sweetscent.c @@ -6,7 +6,6 @@ #include "field_effect.h" #include "field_player_avatar.h" #include "field_screen.h" -#include "fldeff_groundshake.h" #include "palette.h" #include "party_menu.h" #include "rom6.h" @@ -20,6 +19,8 @@ void hm2_sweet_scent(void); void sub_8159F5C(void); void sub_8159FEC(u8 taskId); void sub_815A090(u8 taskId); +void sub_81BE6B8(void); +void sub_81BE72C(void); bool8 SetUpFieldMove_SweetScent(void) { diff --git a/src/fossil_specials.c b/src/fossil_specials.c index c5539114d..749c37e4d 100644 --- a/src/fossil_specials.c +++ b/src/fossil_specials.c @@ -6,10 +6,10 @@ #include "field_camera.h" #include "field_map_obj.h" #include "fieldmap.h" -#include "fldeff_groundshake.h" #include "global.fieldmap.h" #include "gpu_regs.h" #include "malloc.h" +#include "menu.h" #include "random.h" #include "script.h" #include "sound.h" @@ -17,27 +17,129 @@ #include "task.h" #include "window.h" -//struct StructUnknown_0203CF14 +#define ROOT_FOSSIL_GFX_TILE_LENGTH 0x80 +#define ROOT_FOSSIL_GFX_PALETTE_LENGTH 0x100 +//struct struct Struct8617DA4 { u8 x; u8 y; u16 tileId; }; +struct Struct203CF10 { + u8 *buffer; + u8 curr_buffer_index; +}; -extern const struct Struct8617DA4 gUnknown_08617DA4[]; -extern const u8 gUnknown_08617274[]; //mirage tower -extern const u8 gUnknown_08617B94[]; //mirage tower tilemap +struct DynamicSpriteFrameImage{ + u8 *data; + u16 size; +}; -extern void * gUnknown_0203CF04; -extern void * gUnknown_0203CF08; -extern u16 (*gUnknown_0203CF14)[2]; +struct Struct203CF0C { + u8 *frameImageTiles; + struct DynamicSpriteFrameImage *frameImage; + u8 spriteId; + u16 *frameImagePalette; + u16 unk10; +}; +// static functions /*static*/ void sub_81BED50(u8 taskId); /*static*/ void sub_81BEBF4(u8 taskId); /*static*/ void sub_81BF028(u8 taskId); +/*static*/ void sub_81BF248(struct Sprite *); + +// .rodata +static const u8 gUnknown_08617274[] = {00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}; +static const u8 gMirageTower_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower.4bpp"); +static const u16 gUnknown_08617B94[] = INCBIN_U16("graphics/misc/mirage_tower.bin"); +static const u16 gRootFossil_Pal[] = INCBIN_U16("graphics/misc/fossil.gbapal"); +static const u8 gRootFossil_Gfx[] = INCBIN_U8("graphics/misc/fossil.4bpp"); +static const u8 gMirageTowerCrumbles_Gfx[] = INCBIN_U8("graphics/misc/mirage_tower_crumbles.4bpp"); +static const u16 gMirageTowerCrumbles_Palette[] = INCBIN_U16("graphics/misc/mirage_tower_crumbles.gbapal"); +const s16 gUnknown_08617D64[][3] = + { + { 0, 10, 65}, + { 17, 3, 50}, + {-12, 0, 75}, + { 10, 15, 90}, + { 7, 8, 65}, + {-18, 5, 75}, + { 22, -10, 55}, + {-24, -4, 65}, + }; + +const struct SpriteSheet gUnknown_08617D94[] = +{ + {gMirageTowerCrumbles_Gfx, 0x0080, 0x0fa0}, + {NULL} +}; + +static const struct Struct8617DA4 gUnknown_08617DA4[] = + { + {0x12, 0x35, 0x251}, + {0x13, 0x35, 0x251}, + {0x14, 0x35, 0x251}, + {0x12, 0x36, 0x251}, + {0x13, 0x36, 0x251}, + {0x14, 0x36, 0x251}, + {0x12, 0x37, 0x251}, + {0x13, 0x37, 0x251}, + {0x14, 0x37, 0x251}, + {0x12, 0x38, 0x251}, + {0x13, 0x38, 0x251}, + {0x14, 0x38, 0x251}, + {0x12, 0x39, 0x259}, + {0x13, 0x39, 0x259}, + {0x14, 0x39, 0x259}, + {0x12, 0x3A, 0x121}, + {0x13, 0x3A, 0x121}, + {0x14, 0x3A, 0x121}, + }; + +static const union AnimCmd gSpriteAnim_8617DEC[] = +{ + ANIMCMD_FRAME(0, 1), + ANIMCMD_END, +}; + +static const struct OamData gOamData_8617DF4 = +{ + .y = 0, + .affineMode = 0, + .objMode = 0, + .mosaic = 0, + .bpp = 0, + .shape = 0, + .x = 0, + .matrixNum = 0, + .size = 1, + .tileNum = 0, + .priority = 0, + .paletteNum = 3, + .affineParam = 0, +}; + +static const union AnimCmd *const gSpriteAnimTable_8617DFC[] = +{ + gSpriteAnim_8617DEC, +}; + +static const struct SpriteTemplate gUnknown_08617E00 = { + 0xFFFF, 0xFFFF, &gOamData_8617DF4, gSpriteAnimTable_8617DFC, NULL, gDummySpriteAffineAnimTable, SpriteCallbackDummy +}; + +// ewram +EWRAM_DATA u8* gUnknown_0203CF04 = NULL; +EWRAM_DATA u8* gUnknown_0203CF08 = NULL; +EWRAM_DATA struct Struct203CF0C *gUnknown_0203CF0C = NULL; +EWRAM_DATA struct Struct203CF10 *gUnknown_0203CF10 = NULL; +EWRAM_DATA u16 *gUnknown_0203CF14 = NULL; + +// text void sub_81BEB24(void) { u8 count; @@ -63,15 +165,15 @@ void sub_81BEB7C(void) void sub_81BEB90(void) { - SetGpuReg(REG_OFFSET_BG0HOFS, (*gUnknown_0203CF14)[0]); - SetGpuReg(REG_OFFSET_BG0VOFS, (*gUnknown_0203CF14)[1]); + SetGpuReg(REG_OFFSET_BG0HOFS, gUnknown_0203CF14[0]); + SetGpuReg(REG_OFFSET_BG0VOFS, gUnknown_0203CF14[1]); } void sub_81BEBB4(u8 taskId) { if(!(gTasks[taskId].data[0])) { - (*gUnknown_0203CF14)[0] = -(*gUnknown_0203CF14)[0]; + gUnknown_0203CF14[0] = -gUnknown_0203CF14[0]; gTasks[taskId].data[0] = 2; sub_81BEB90(); } @@ -79,6 +181,7 @@ void sub_81BEBB4(u8 taskId) gTasks[taskId].data[0]--; } + void sub_81BEBF4(u8 taskId) { u8 zero; @@ -91,8 +194,8 @@ void sub_81BEBF4(u8 taskId) gTasks[taskId].data[0]++; break; case 1: - gUnknown_0203CF04 = (u8 **) AllocZeroed(0x920); - gUnknown_0203CF08 = (u8 **) AllocZeroed(0x800); + gUnknown_0203CF04 = (u8 *)AllocZeroed(0x920); + gUnknown_0203CF08 = (u8 *)AllocZeroed(0x800); ChangeBgX(0, 0, 0); ChangeBgY(0, 0, 0); gTasks[taskId].data[0]++; @@ -117,13 +220,884 @@ void sub_81BEBF4(u8 taskId) gTasks[taskId].data[0]++; break; case 6: - gUnknown_0203CF14 = (u16(*)[2]) Alloc(4); + gUnknown_0203CF14 = (u16 *)Alloc(4); zero = 0; - (*gUnknown_0203CF14)[0] = 2; - (*gUnknown_0203CF14)[1] = zero; + gUnknown_0203CF14[0] = 2; + gUnknown_0203CF14[1] = zero; CreateTask(sub_81BEBB4, 0xA); DestroyTask(taskId); EnableBothScriptContexts(); break; } } + +#define OUTER_BUFFER_LENGTH 0x60 +#define INNER_BUFFER_LENGTH 0x30 + +//void sub_81BF2B8(u8 *buffer, u16 offset, u8 a, u8 buffer_size, u8 d); + +#ifdef NONMATCHING +void sub_81BED50(u8 taskId) +{ + u8 count, index, size, next_index, buffer_index, anotherTaskId, anotherCount; + u16 rand1, rand2, temp; + u8 left, right; + u16 left16, right16; + u8 *buffer; + struct Task *currTask; + + switch(gTasks[taskId].data[0]) + { + case 0: + gUnknown_0203CF10 = (struct Struct203CF10 *)AllocZeroed(OUTER_BUFFER_LENGTH << 3); + break; + case 2: + if(gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) + { + if(gTasks[taskId].data[1] > 1) + { + index = gTasks[taskId].data[3]; + gUnknown_0203CF10[index].buffer = (u8 *)Alloc(INNER_BUFFER_LENGTH); + for(count = 0; count <= (INNER_BUFFER_LENGTH - 1); count++) + gUnknown_0203CF10[index].buffer[count] = count; + for(count = 0; count <= (INNER_BUFFER_LENGTH - 1); count++) + { + rand1 = Random() % 0x30; + rand2 = Random() % 0x30; + temp = gUnknown_0203CF10[index].buffer[rand2]; + gUnknown_0203CF10[index].buffer[rand2] = gUnknown_0203CF10[index].buffer[rand1]; + gUnknown_0203CF10[index].buffer[rand1] = temp; + } + if(gTasks[taskId].data[3] <= (OUTER_BUFFER_LENGTH - 1)) + gTasks[taskId].data[3]++; + gTasks[taskId].data[1] = 0; + } + gTasks[taskId].data[1]++; + } + currTask = &(gTasks[taskId]); + right = currTask->data[3]; + left = currTask->data[2]; + while(left < right) + { + anotherCount = 0; + do + { + buffer = gUnknown_0203CF04; + buffer_index = gUnknown_0203CF10[left].curr_buffer_index; + gUnknown_0203CF10[left].curr_buffer_index = buffer_index + 1; + sub_81BF2B8(buffer, gUnknown_0203CF10[left].buffer[buffer_index] + (INNER_BUFFER_LENGTH * (OUTER_BUFFER_LENGTH - 1 - left)), 0, INNER_BUFFER_LENGTH, 1); + anotherCount++; + }while(!anotherCount); + + if(gUnknown_0203CF10[left].curr_buffer_index > (INNER_BUFFER_LENGTH - 1)) + { + Free(gUnknown_0203CF10[left].buffer); + gUnknown_0203CF10[left].buffer = NULL; + currTask->data[2]++; + if(left & 1) + gUnknown_0203CF04[1]--; + } + left++; + } + LoadBgTiles(0, gUnknown_0203CF04, 0x920, 0); + if(gUnknown_0203CF10[0x5F].curr_buffer_index > (INNER_BUFFER_LENGTH - 1)) + break; + return; + case 3: + UnsetBgTilemapBuffer(0); + anotherTaskId = FindTaskIdByFunc(sub_81BEBB4); + if(anotherTaskId != 0xFF) + DestroyTask(anotherTaskId); + gUnknown_0203CF14[1] = gUnknown_0203CF14[0] = 0; + + sub_81BEB90(); + + break; + case 4: + Free(gUnknown_0203CF14); + gUnknown_0203CF14 = NULL; + Free(gUnknown_0203CF10); + gUnknown_0203CF10 = NULL; + Free(gUnknown_0203CF04); + gUnknown_0203CF04 = NULL; + Free(gUnknown_0203CF08); + gUnknown_0203CF08 = NULL; + + break; + case 5: + SetGpuRegBits(0xC, 0x2); + SetGpuRegBits(0x8, 0x0); + SetBgAttribute(0, BG_CTRL_ATTR_MOSAIC, 0); + sub_81971D0(); + + break; + case 6: + ShowBg(0); + + break; + case 7: + DestroyTask(taskId); + EnableBothScriptContexts(); + break; + } + gTasks[taskId].data[0]++; +} +#else +ASM_DIRECT +void sub_81BED50(u8 taskId) +{ + asm("\n\ + .syntax unified\n\ + push {r4-r7,lr}\n\ + mov r7, r10\n\ + mov r6, r9\n\ + mov r5, r8\n\ + push {r5-r7}\n\ + sub sp, 0x10\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + mov r10, r0\n\ + ldr r1, =gTasks\n\ + lsls r0, 2\n\ + add r0, r10\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x8]\n\ + subs r0, 0x1\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + adds r6, r1, 0\n\ + cmp r0, 0x7\n\ + bls _081BED7C\n\ + b _081BF002\n\ + _081BED7C:\n\ + lsls r0, 2\n\ + ldr r1, =_081BED90\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .pool\n\ + .align 2, 0\n\ + _081BED90:\n\ + .4byte _081BEDB0\n\ + .4byte _081BF002\n\ + .4byte _081BEDC4\n\ + .4byte _081BEF64\n\ + .4byte _081BEF94\n\ + .4byte _081BEFD0\n\ + .4byte _081BEFF0\n\ + .4byte _081BEFF8\n\ + _081BEDB0:\n\ + ldr r4, =gUnknown_0203CF10\n\ + movs r0, 0xC0\n\ + lsls r0, 2\n\ + bl AllocZeroed\n\ + str r0, [r4]\n\ + b _081BF002\n\ + .pool\n\ + _081BEDC4:\n\ + mov r1, r10\n\ + lsls r0, r1, 2\n\ + adds r1, r0, r1\n\ + lsls r1, 3\n\ + adds r2, r1, r6\n\ + ldrh r3, [r2, 0xE]\n\ + movs r4, 0xE\n\ + ldrsh r1, [r2, r4]\n\ + str r0, [sp, 0x8]\n\ + cmp r1, 0x5F\n\ + bgt _081BEE8A\n\ + movs r1, 0xA\n\ + ldrsh r0, [r2, r1]\n\ + cmp r0, 0x1\n\ + ble _081BEE7C\n\ + lsls r0, r3, 24\n\ + lsrs r4, r0, 24\n\ + movs r0, 0x30\n\ + bl Alloc\n\ + ldr r3, =gUnknown_0203CF10\n\ + ldr r1, [r3]\n\ + lsls r2, r4, 3\n\ + adds r1, r2, r1\n\ + str r0, [r1]\n\ + movs r5, 0\n\ + adds r4, r2, 0\n\ + _081BEDFA:\n\ + ldr r0, [r3]\n\ + adds r0, r4, r0\n\ + ldr r0, [r0]\n\ + adds r0, r5\n\ + strb r5, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0x2F\n\ + bls _081BEDFA\n\ + movs r5, 0\n\ + ldr r7, =gUnknown_0203CF10\n\ + adds r6, r2, 0\n\ + _081BEE14:\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x30\n\ + bl __umodsi3\n\ + adds r4, r0, 0\n\ + lsls r4, 16\n\ + lsrs r4, 16\n\ + bl Random\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + movs r1, 0x30\n\ + bl __umodsi3\n\ + lsls r0, 16\n\ + lsrs r0, 16\n\ + ldr r1, [r7]\n\ + adds r1, r6, r1\n\ + ldr r1, [r1]\n\ + adds r0, r1, r0\n\ + ldrb r2, [r0]\n\ + adds r1, r4 \n\ + ldrb r1, [r1]\n\ + strb r1, [r0]\n\ + ldr r0, [r7]\n\ + adds r0, r6, r0\n\ + ldr r0, [r0]\n\ + adds r0, r4\n\ + strb r2, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0x2F\n\ + bls _081BEE14\n\ + ldr r0, =gTasks\n\ + ldr r1, [sp, 0x8]\n\ + add r1, r10\n\ + lsls r1, 3\n\ + adds r2, r1, r0\n\ + ldrh r3, [r2, 0xE]\n\ + movs r4, 0xE\n\ + ldrsh r1, [r2, r4]\n\ + adds r6, r0, 0\n\ + cmp r1, 0x5F\n\ + bgt _081BEE78\n\ + adds r0, r3, 0x1\n\ + strh r0, [r2, 0xE]\n\ + _081BEE78:\n\ + movs r0, 0\n\ + strh r0, [r2, 0xA]\n\ + _081BEE7C:\n\ + ldr r1, [sp, 0x8]\n\ + add r1, r10\n\ + lsls r1, 3\n\ + adds r1, r6\n\ + ldrh r0, [r1, 0xA]\n\ + adds r0, 0x1\n\ + strh r0, [r1, 0xA]\n\ + _081BEE8A:\n\ + ldr r0, [sp, 0x8]\n\ + add r0, r10\n\ + lsls r0, 3\n\ + adds r0, r6\n\ + ldrb r4, [r0, 0xE]\n\ + ldrb r5, [r0, 0xC]\n\ + lsls r0, r4, 16\n\ + cmp r5, r4\n\ + bcs _081BEF32\n\ + str r0, [sp, 0xC]\n\ + _081BEE9E:\n\ + movs r6, 0\n\ + adds r0, r5, 0x1\n\ + str r0, [sp, 0x4]\n\ + lsls r4, r5, 3\n\ + movs r2, 0x5F\n\ + subs r1, r2, r5\n\ + lsls r0, r1, 1\n\ + adds r0, r1\n\ + lsls r0, 4\n\ + mov r9, r0\n\ + _081BEEB2:\n\ + ldr r0, =gUnknown_0203CF04\n\ + ldr r0, [r0]\n\ + ldr r7, =gUnknown_0203CF10\n\ + ldr r3, [r7]\n\ + adds r3, r4, r3\n\ + ldrb r2, [r3, 0x4]\n\ + adds r1, r2, 0x1\n\ + strb r1, [r3, 0x4]\n\ + lsls r2, 24\n\ + lsrs r2, 24\n\ + ldr r1, [r3]\n\ + adds r1, r2\n\ + ldrb r1, [r1]\n\ + add r1, r9\n\ + lsls r1, 16\n\ + lsrs r1, 16\n\ + movs r2, 0x1\n\ + mov r8, r2\n\ + str r2, [sp]\n\ + movs r2, 0\n\ + movs r3, 0x30\n\ + bl sub_81BF2B8\n\ + adds r0, r6, 0x1\n\ + lsls r0, 24\n\ + lsrs r6, r0, 24\n\ + cmp r6, 0\n\ + beq _081BEEB2\n\ + ldr r0, [r7]\n\ + adds r1, r4, r0\n\ + ldrb r0, [r1, 0x4]\n\ + cmp r0, 0x2F\n\ + bls _081BEF24\n\ + ldr r0, [r1]\n\ + bl Free\n\ + ldr r0, [r7]\n\ + adds r0, r4, r0\n\ + movs r1, 0\n\ + str r1, [r0]\n\ + ldr r1, [sp, 0x8]\n\ + add r1, r10\n\ + lsls r1, 3\n\ + ldr r4, =gTasks\n\ + adds r1, r4\n\ + ldrh r0, [r1, 0xC]\n\ + adds r0, 0x1\n\ + strh r0, [r1, 0xC]\n\ + mov r0, r8\n\ + ands r5, r0\n\ + cmp r5, 0x1\n\ + bne _081BEF24\n\ + ldr r0, =gUnknown_0203CF14\n\ + ldr r1, [r0]\n\ + ldrh r0, [r1, 0x2]\n\ + subs r0, 0x1\n\ + strh r0, [r1, 0x2]\n\ + _081BEF24:\n\ + ldr r1, [sp, 0x4]\n\ + lsls r0, r1, 16\n\ + lsrs r5, r0, 16\n\ + ldr r2, [sp, 0xC]\n\ + lsrs r0, r2, 16\n\ + cmp r5, r0\n\ + bcc _081BEE9E\n\ + _081BEF32:\n\ + ldr r0, =gUnknown_0203CF04\n\ + ldr r1, [r0]\n\ + movs r2, 0x92\n\ + lsls r2, 4\n\ + movs r0, 0\n\ + movs r3, 0\n\ + bl LoadBgTiles\n\ + ldr r0, =gUnknown_0203CF10\n\ + ldr r0, [r0]\n\ + movs r4, 0xBE\n\ + lsls r4, 2\n\ + adds r0, r4\n\ + ldrb r0, [r0, 0x4]\n\ + cmp r0, 0x2F\n\ + bhi _081BF002\n\ + b _081BF014\n\ + .pool\n\ + _081BEF64:\n\ + movs r0, 0\n\ + bl UnsetBgTilemapBuffer\n\ + ldr r0, =sub_81BEBB4\n\ + bl FindTaskIdByFunc\n\ + lsls r0, 24\n\ + lsrs r0, 24\n\ + cmp r0, 0xFF\n\ + beq _081BEF7C\n\ + bl DestroyTask\n\ + _081BEF7C:\n\ + ldr r0, =gUnknown_0203CF14\n\ + ldr r1, [r0]\n\ + movs r0, 0\n\ + strh r0, [r1]\n\ + strh r0, [r1, 0x2]\n\ + bl sub_81BEB90\n\ + b _081BF002\n\ + .pool\n\ + _081BEF94:\n\ + ldr r4, =gUnknown_0203CF14\n\ + ldr r0, [r4]\n\ + bl Free\n\ + movs r5, 0\n\ + str r5, [r4]\n\ + ldr r4, =gUnknown_0203CF10\n\ + ldr r0, [r4]\n\ + bl Free\n\ + str r5, [r4]\n\ + ldr r4, =gUnknown_0203CF04\n\ + ldr r0, [r4]\n\ + bl Free\n\ + str r5, [r4]\n\ + ldr r4, =gUnknown_0203CF08\n\ + ldr r0, [r4]\n\ + bl Free\n\ + str r5, [r4]\n\ + b _081BF002\n\ + .pool\n\ + _081BEFD0:\n\ + movs r0, 0xC\n\ + movs r1, 0x2\n\ + bl SetGpuRegBits\n\ + movs r0, 0x8\n\ + movs r1, 0\n\ + bl SetGpuRegBits\n\ + movs r0, 0\n\ + movs r1, 0x7\n\ + movs r2, 0\n\ + bl SetBgAttribute\n\ + bl sub_81971D0\n\ + b _081BF002\n\ + _081BEFF0:\n\ + movs r0, 0\n\ + bl ShowBg\n\ + b _081BF002\n\ + _081BEFF8:\n\ + mov r0, r10\n\ + bl DestroyTask\n\ + bl EnableBothScriptContexts\n\ + _081BF002:\n\ + ldr r0, =gTasks\n\ + mov r2, r10\n\ + lsls r1, r2, 2\n\ + add r1, r10\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldrh r0, [r1, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r1, 0x8]\n\ + _081BF014:\n\ + add sp, 0x10\n\ + pop {r3-r5}\n\ + mov r8, r3\n\ + mov r9, r4\n\ + mov r10, r5\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING +void sub_81BF028(u8 taskId) +{ + u8 spriteId, zero; + u16 count, rand1, rand2, temp, switch_val; + u16 count2; + u32 count3; + + u8 *buffer; + struct SpriteTemplate fossilTemplate; +; + switch_val = gTasks[taskId].data[0] - 1; + switch(switch_val) + { + case 0: + gUnknown_0203CF0C = (struct Struct203CF0C *)AllocZeroed(0x14); + gUnknown_0203CF0C->frameImageTiles = (u8 *)AllocZeroed(ROOT_FOSSIL_GFX_TILE_LENGTH); + gUnknown_0203CF0C->frameImage = (struct InMemorySpriteFrameImage *)AllocZeroed(0x8); + gUnknown_0203CF0C->frameImagePalette = (u16 *)AllocZeroed(ROOT_FOSSIL_GFX_PALETTE_LENGTH << 1); + gUnknown_0203CF0C->unk10 = 0; + break; + case 1: + buffer = gUnknown_0203CF0C->frameImageTiles; + for(count = 0; count <= (ROOT_FOSSIL_GFX_TILE_LENGTH - 1); count++, buffer++) + *buffer = gRootFossil_Gfx[count]; + break; + case 2: + gUnknown_0203CF0C->frameImage->data = gUnknown_0203CF0C->frameImageTiles; + gUnknown_0203CF0C->frameImage->size = ROOT_FOSSIL_GFX_TILE_LENGTH; + break; + case 3: + fossilTemplate = gUnknown_08617E00; + fossilTemplate.images = (struct SpriteFrameImage *)(gUnknown_0203CF0C->frameImage); + + spriteId = CreateSprite(&fossilTemplate, 128, -10, 1); + gUnknown_0203CF0C->spriteId = spriteId; + zero = 0; + gSprites[gUnknown_0203CF0C->spriteId].centerToCornerVecX = zero; + gSprites[gUnknown_0203CF0C->spriteId].data[0] = gSprites[gUnknown_0203CF0C->spriteId].pos1.x; + gSprites[gUnknown_0203CF0C->spriteId].data[1] = 1; + case 4: + for(count = 0; count <= (ROOT_FOSSIL_GFX_PALETTE_LENGTH -1); count++) + gUnknown_0203CF0C->frameImagePalette[count] = count; + break; + case 5: + for(count = 0; count <= ((ROOT_FOSSIL_GFX_PALETTE_LENGTH <<1) -1); count++) + { + rand1 = Random() & 0xFF; + rand2 = Random() & 0xFF; + temp = gUnknown_0203CF0C->frameImagePalette[rand2]; + gUnknown_0203CF0C->frameImagePalette[rand2] = gUnknown_0203CF0C->frameImagePalette[rand1]; + gUnknown_0203CF0C->frameImagePalette[rand1] = temp; + } + gSprites[gUnknown_0203CF0C->spriteId].callback = sub_81BF248; + break; + case 6: + if(gSprites[gUnknown_0203CF0C->spriteId].callback != SpriteCallbackDummy) + return; + DestroySprite(&gSprites[gUnknown_0203CF0C->spriteId]); + Free(gUnknown_0203CF0C->frameImagePalette); + gUnknown_0203CF0C->frameImagePalette = NULL; + Free(gUnknown_0203CF0C->frameImage); + gUnknown_0203CF0C->frameImage = NULL; + Free(gUnknown_0203CF0C->frameImageTiles); + gUnknown_0203CF0C->frameImageTiles = NULL; + Free(gUnknown_0203CF0C); + gUnknown_0203CF0C = NULL; + break; + case 7: + EnableBothScriptContexts(); + } + gTasks[taskId].data[0]++; +} + +#else +ASM_DIRECT +void sub_81BF028(u8 taskId) +{ + asm("\n\ + .syntax unified\n\ + sub_81BF028: @ 81BF028\n\ + push {r4-r7,lr}\n\ + mov r7, r8\n\ + push {r7}\n\ + sub sp, 0x18\n\ + lsls r0, 24\n\ + lsrs r7, r0, 24\n\ + ldr r1, =gTasks\n\ + lsls r0, r7, 2\n\ + adds r0, r7\n\ + lsls r0, 3\n\ + adds r0, r1\n\ + ldrh r0, [r0, 0x8]\n\ + subs r0, 0x1\n\ + lsls r0, 16\n\ + asrs r0, 16\n\ + cmp r0, 0x7\n\ + bls _081BF04C\n\ + b _081BF228\n\ + _081BF04C:\n\ + lsls r0, 2\n\ + ldr r1, =_081BF060\n\ + adds r0, r1\n\ + ldr r0, [r0]\n\ + mov pc, r0\n\ + .pool\n\ + .align 2, 0\n\ + _081BF060:\n\ + .4byte _081BF080\n\ + .4byte _081BF0B4\n\ + .4byte _081BF0DC\n\ + .4byte _081BF0F0\n\ + .4byte _081BF148\n\ + .4byte _081BF170\n\ + .4byte _081BF1CC\n\ + .4byte _081BF224\n\ + _081BF080:\n\ + ldr r4, =gUnknown_0203CF0C\n\ + movs r0, 0x14\n\ + bl AllocZeroed\n\ + str r0, [r4]\n\ + movs r0, 0x80\n\ + bl AllocZeroed\n\ + ldr r1, [r4]\n\ + str r0, [r1]\n\ + movs r0, 0x8\n\ + bl AllocZeroed\n\ + ldr r1, [r4]\n\ + str r0, [r1, 0x4]\n\ + movs r0, 0x80\n\ + lsls r0, 2\n\ + bl AllocZeroed\n\ + ldr r1, [r4]\n\ + str r0, [r1, 0xC]\n\ + movs r0, 0\n\ + strh r0, [r1, 0x10]\n\ + b _081BF228\n\ + .pool\n\ + _081BF0B4:\n\ + ldr r0, =gUnknown_0203CF0C\n\ + ldr r0, [r0]\n\ + ldr r1, [r0]\n\ + movs r5, 0\n\ + ldr r2, =gRootFossil_Gfx\n\ + _081BF0BE:\n\ + adds r0, r5, r2\n\ + ldrb r0, [r0]\n\ + strb r0, [r1]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + adds r1, 0x1\n\ + cmp r5, 0x7F\n\ + bls _081BF0BE\n\ + b _081BF228\n\ + .pool\n\ + _081BF0DC:\n\ + ldr r0, =gUnknown_0203CF0C\n\ + ldr r0, [r0]\n\ + ldr r1, [r0, 0x4]\n\ + ldr r0, [r0]\n\ + str r0, [r1]\n\ + movs r0, 0x80\n\ + strh r0, [r1, 0x4]\n\ + b _081BF228\n\ + .pool\n\ + _081BF0F0:\n\ + mov r1, sp\n\ + ldr r0, =gUnknown_08617E00\n\ + ldm r0!, {r2-r4}\n\ + stm r1!, {r2-r4}\n\ + ldm r0!, {r2-r4}\n\ + stm r1!, {r2-r4}\n\ + ldr r4, =gUnknown_0203CF0C\n\ + ldr r0, [r4]\n\ + ldr r0, [r0, 0x4]\n\ + str r0, [sp, 0xC]\n\ + movs r2, 0x10\n\ + negs r2, r2\n\ + mov r0, sp\n\ + movs r1, 0x80\n\ + movs r3, 0x1\n\ + bl CreateSprite\n\ + ldr r1, [r4]\n\ + movs r3, 0\n\ + strb r0, [r1, 0x8]\n\ + ldr r2, =gSprites\n\ + ldr r0, [r4]\n\ + ldrb r1, [r0, 0x8]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + adds r0, 0x28\n\ + strb r3, [r0]\n\ + ldr r3, [r4]\n\ + ldrb r1, [r3, 0x8]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + ldrh r1, [r0, 0x20]\n\ + strh r1, [r0, 0x2E]\n\ + ldrb r1, [r3, 0x8]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r0, r2\n\ + movs r1, 0x1\n\ + strh r1, [r0, 0x30]\n\ + _081BF148:\n\ + movs r5, 0\n\ + ldr r2, =gUnknown_0203CF0C\n\ + _081BF14C:\n\ + ldr r0, [r2]\n\ + ldr r1, [r0, 0xC]\n\ + lsls r0, r5, 1\n\ + adds r0, r1\n\ + strh r5, [r0]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, 0xFF\n\ + bls _081BF14C\n\ + b _081BF228\n\ + .pool\n\ + _081BF170:\n\ + movs r5, 0\n\ + movs r6, 0xFF\n\ + ldr r0, =0x000001ff\n\ + mov r8, r0\n\ + _081BF178:\n\ + bl Random\n\ + adds r4, r6, 0\n\ + ands r4, r0\n\ + bl Random\n\ + adds r1, r6, 0\n\ + ands r1, r0\n\ + ldr r0, =gUnknown_0203CF0C\n\ + ldr r3, [r0]\n\ + ldr r0, [r3, 0xC]\n\ + lsls r1, 1\n\ + adds r1, r0\n\ + ldrh r2, [r1]\n\ + lsls r4, 1\n\ + adds r4, r0\n\ + ldrh r0, [r4]\n\ + strh r0, [r1]\n\ + strh r2, [r4]\n\ + adds r0, r5, 0x1\n\ + lsls r0, 16\n\ + lsrs r5, r0, 16\n\ + cmp r5, r8\n\ + bls _081BF178\n\ + ldr r2, =gSprites\n\ + ldrb r1, [r3, 0x8]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r0, 2\n\ + adds r2, 0x1C\n\ + adds r0, r2\n\ + ldr r1, =sub_81BF248\n\ + str r1, [r0]\n\ + b _081BF228\n\ + .pool\n\ + _081BF1CC:\n\ + ldr r3, =gSprites\n\ + ldr r5, =gUnknown_0203CF0C\n\ + ldr r0, [r5]\n\ + ldrb r1, [r0, 0x8]\n\ + lsls r0, r1, 4\n\ + adds r0, r1\n\ + lsls r2, r0, 2\n\ + adds r0, r3, 0\n\ + adds r0, 0x1C\n\ + adds r0, r2, r0\n\ + ldr r1, [r0]\n\ + ldr r0, =SpriteCallbackDummy\n\ + cmp r1, r0\n\ + bne _081BF238\n\ + adds r0, r2, r3\n\ + bl DestroySprite\n\ + ldr r0, [r5]\n\ + ldr r0, [r0, 0xC]\n\ + bl Free\n\ + ldr r0, [r5]\n\ + movs r4, 0\n\ + str r4, [r0, 0xC]\n\ + ldr r0, [r0, 0x4]\n\ + bl Free\n\ + ldr r0, [r5]\n\ + str r4, [r0, 0x4]\n\ + ldr r0, [r0]\n\ + bl Free\n\ + ldr r0, [r5]\n\ + str r4, [r0]\n\ + bl Free\n\ + str r4, [r5]\n\ + b _081BF228\n\ + .pool\n\ + _081BF224:\n\ + bl EnableBothScriptContexts\n\ + _081BF228:\n\ + ldr r0, =gTasks\n\ + lsls r1, r7, 2\n\ + adds r1, r7\n\ + lsls r1, 3\n\ + adds r1, r0\n\ + ldrh r0, [r1, 0x8]\n\ + adds r0, 0x1\n\ + strh r0, [r1, 0x8]\n\ + _081BF238:\n\ + add sp, 0x18\n\ + pop {r3}\n\ + mov r8, r3\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif // NONMATCHING + +#ifdef NONMATCHING +void sub_81BF248(struct Sprite *sprite) +{ + u8 count; + u16 x; + u16 y; + u8 *buffer; + + if(gUnknown_0203CF0C->unk10 > 0xFF) + { + sprite->callback = SpriteCallbackDummy; + return; + } + if(sprite->pos2.y > 0x5F) + { + for(count = 0; count <= 1; count++) + { + buffer = gUnknown_0203CF0C->frameImageTiles; + x = gUnknown_0203CF0C->unk10; + gUnknown_0203CF0C->unk10 = x+1; + sub_81BF2B8(buffer,gUnknown_0203CF0C->frameImagePalette[x] , 0, 0x10, 0); + } + StartSpriteAnim(sprite, 0x0); + } + else + sprite->pos2.y++; +} + +#else +ASM_DIRECT +void sub_81BF248(struct Sprite *sprite) +{ + asm("\n\ + .syntax unified\n\ + push {r4,r5,lr}\n\ + sub sp, 0x4\n\ + adds r5, r0, 0\n\ + ldr r0, =gUnknown_0203CF0C\n\ + ldr r0, [r0]\n\ + ldrh r0, [r0, 0x10]\n\ + cmp r0, 0xFF\n\ + bls _081BF268\n\ + ldr r0, =SpriteCallbackDummy\n\ + str r0, [r5, 0x1C]\n\ + b _081BF2B0\n\ + .pool\n\ + _081BF268:\n\ + ldrh r1, [r5, 0x22]\n\ + movs r2, 0x22\n\ + ldrsh r0, [r5, r2]\n\ + cmp r0, 0x5F\n\ + ble _081BF2AC\n\ + movs r4, 0\n\ + _081BF274:\n\ + ldr r0, =gUnknown_0203CF0C\n\ + ldr r3, [r0]\n\ + ldr r0, [r3]\n\ + ldrh r1, [r3, 0x10]\n\ + adds r2, r1, 0x1\n\ + strh r2, [r3, 0x10]\n\ + lsls r1, 16\n\ + ldr r2, [r3, 0xC]\n\ + lsrs r1, 15\n\ + adds r1, r2\n\ + ldrh r1, [r1]\n\ + movs r2, 0\n\ + str r2, [sp]\n\ + movs r3, 0x10\n\ + bl sub_81BF2B8\n\ + adds r0, r4, 0x1\n\ + lsls r0, 24\n\ + lsrs r4, r0, 24\n\ + cmp r4, 0x1\n\ + bls _081BF274\n\ + adds r0, r5, 0\n\ + movs r1, 0\n\ + bl StartSpriteAnim\n\ + b _081BF2B0\n\ + .pool\n\ + _081BF2AC:\n\ + adds r0, r1, 0x1\n\ + strh r0, [r5, 0x22]\n\ + _081BF2B0:\n\ + add sp, 0x4\n\ + pop {r4,r5}\n\ + pop {r0}\n\ + bx r0\n\ + .pool\n\ + .syntax divided"); +} +#endif // NONMATCHING + +extern u16 gUnknown_030012A8[8]; + + + |