diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/region_map.c | 149 |
1 files changed, 145 insertions, 4 deletions
diff --git a/src/region_map.c b/src/region_map.c index 8a9d91205..ff4262db5 100644 --- a/src/region_map.c +++ b/src/region_map.c @@ -112,10 +112,28 @@ struct UnkStruct_20399DC u16 field_3E24; }; // size = 0x3E28 +struct UnkStruct_20399E0_000 +{ + u16 field_000[0x200]; + struct Sprite * field_400; + s16 field_404; + s16 field_406; + u16 field_408; + u16 field_40A; +}; + +struct UnkStruct_20399E0 +{ + struct UnkStruct_20399E0_000 * field_000[6]; + u8 filler_018[0xCB0]; + TaskFunc field_CC8; + u8 filler_CCC[0x8]; +}; // size = 0xCD4 + EWRAM_DATA struct UnkStruct_20399D4 * gUnknown_20399D4 = NULL; EWRAM_DATA struct UnkStruct_20399D8 * gUnknown_20399D8 = NULL; EWRAM_DATA struct UnkStruct_20399DC * gUnknown_20399DC = NULL; -EWRAM_DATA void * gUnknown_20399E0 = NULL; +EWRAM_DATA struct UnkStruct_20399E0 * gUnknown_20399E0 = NULL; EWRAM_DATA void * gUnknown_20399E4 = NULL; EWRAM_DATA void * gUnknown_20399E8 = NULL; EWRAM_DATA void * gUnknown_20399EC = NULL; @@ -161,7 +179,7 @@ void sub_80C1BE0(u8 taskId); void sub_80C1E14(u8 taskId); void sub_80C1E94(void); void sub_80C1E78(u8 bgId, const u16 * tilemap); -bool8 sub_80C1F80(u8 a0); +bool8 sub_80C1F80(bool8 a0); void sub_80C4AAC(u8 a0); void sub_80C4BE4(void); void sub_80C4C2C(u8 a0, u16 a1, u16 a2); @@ -172,6 +190,8 @@ void sub_80C4C88(u16 a0); void sub_80C4C9C(u8 a0, u8 a1); void sub_80C4CF0(u8 a0, const struct UnkStruct_80C4CF0 *a1); void sub_80C2208(u8 taskId, TaskFunc taskFunc); +void sub_80C24BC(void); +void sub_80C267C(u8 taskId); void sub_80C25BC(void); void sub_80C2C1C(u8 taskId); void sub_80C3008(u16 a0, u16 a1); @@ -203,6 +223,7 @@ u16 sub_80C3580(void); extern const u16 gUnknown_83EF23C[]; extern const u16 gUnknown_83EF2DC[]; extern const u16 gUnknown_83EF384[]; +extern const u16 gUnknown_83EF3A4[]; extern const u32 gUnknown_83EF3C4[]; extern const u32 gUnknown_83EF450[]; extern const u32 gUnknown_83EF61C[]; @@ -227,6 +248,8 @@ extern const struct UnkStruct_80C4CF0 gUnknown_83F1B0C[3]; extern const struct OamData gUnknown_83F1B24; extern const union AnimCmd *const gUnknown_83F1B38[]; extern const struct UnkStruct_83F1B3C gUnknown_83F1B3C[]; +extern const struct OamData gUnknown_83F1C20; +extern const union AnimCmd *const gUnknown_83F1C30[]; extern const u8 *const gUnknown_83F1CAC[]; static void RegionMap_DarkenPalette(u16 *pal, u16 size, u16 tint) @@ -1309,14 +1332,14 @@ void sub_80C1A94(u8 taskId) gUnknown_20399DC->field_3D48++; break; case 6: - if (sub_80C1F80(0) == TRUE) + if (sub_80C1F80(FALSE) == TRUE) gUnknown_20399DC->field_3D48++; break; case 7: gTasks[taskId].func = sub_80C1BE0; break; case 8: - if (sub_80C1F80(1) == TRUE) + if (sub_80C1F80(TRUE) == TRUE) { gUnknown_20399DC->field_3D48++; } @@ -1427,3 +1450,121 @@ void sub_80C1E94(void) gUnknown_20399DC->field_3E22 = (0xE0 - gUnknown_20399DC->field_3E1A) / 8; gUnknown_20399DC->field_3E24 = (0x88 - gUnknown_20399DC->field_3E1C) / 8; } + +bool8 sub_80C1F80(bool8 a0) +{ + struct UnkStruct_80C4CF0 data; + + if (!a0) + { + if (gUnknown_20399DC->field_3D4B < 8) + { + gUnknown_20399DC->field_3E16 += gUnknown_20399DC->field_3E1E; + gUnknown_20399DC->field_3E18 += gUnknown_20399DC->field_3E20; + gUnknown_20399DC->field_3E1A += gUnknown_20399DC->field_3E22; + gUnknown_20399DC->field_3E1C += gUnknown_20399DC->field_3E24; + gUnknown_20399DC->field_3D4B++; + if (gUnknown_20399DC->field_3E14 < 6) + gUnknown_20399DC->field_3E14++; + } + else + { + return TRUE; + } + } + else + { + if (gUnknown_20399DC->field_3D4B == 0) + { + return TRUE; + } + else + { + gUnknown_20399DC->field_3E16 -= gUnknown_20399DC->field_3E1E; + gUnknown_20399DC->field_3E18 -= gUnknown_20399DC->field_3E20; + gUnknown_20399DC->field_3E1A -= gUnknown_20399DC->field_3E22; + gUnknown_20399DC->field_3E1C -= gUnknown_20399DC->field_3E24; + gUnknown_20399DC->field_3D4B--; + if (gUnknown_20399DC->field_3E14 > 0) + gUnknown_20399DC->field_3E14--; + } + } + data.v0 = gUnknown_20399DC->field_3E16; + data.v2 = gUnknown_20399DC->field_3E18; + data.v4 = gUnknown_20399DC->field_3E1A; + data.v6 = gUnknown_20399DC->field_3E1C; + sub_80C4CF0(1, &data); + sub_80C4C48(gUnknown_20399DC->field_3E14); + return FALSE; +} + +void nullsub_63(struct Sprite * sprite) +{ + +} + +void sub_80C210C(u8 a0, u8 a1, u8 a2) +{ + u8 spriteId; + struct SpriteSheet spriteSheet = { + .data = gUnknown_20399E0->field_000[a0], + .size = 0x400, + .tag = a1 + }; + struct SpritePalette spritePalette = { + .data = gUnknown_83EF3A4, + .tag = a2 + }; + struct SpriteTemplate template = { + .tileTag = a1, + .paletteTag = a2, + .oam = &gUnknown_83F1C20, + .anims = gUnknown_83F1C30, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = nullsub_63 + }; + + gUnknown_20399E0->field_000[a0]->field_408 = a1; + gUnknown_20399E0->field_000[a0]->field_40A = a2; + LoadSpriteSheet(&spriteSheet); + LoadSpritePalette(&spritePalette); + spriteId = CreateSprite(&template, gUnknown_20399E0->field_000[a0]->field_404, gUnknown_20399E0->field_000[a0]->field_406, 0); + gUnknown_20399E0->field_000[a0]->field_400 = &gSprites[spriteId]; + gSprites[spriteId].invisible = TRUE; +} + +void sub_80C2208(u8 taskId, TaskFunc taskFunc) +{ + u8 i; + + gUnknown_20399E0 = AllocZeroed(sizeof(struct UnkStruct_20399E0)); + for (i = 0; i < 6; i++) + { + gUnknown_20399E0->field_000[i] = AllocZeroed(sizeof(struct UnkStruct_20399E0_000)); + gUnknown_20399E0->field_000[i]->field_404 = 32 * (i / 3) + 0x68; + gUnknown_20399E0->field_000[i]->field_406 = 64 * (i % 3) + 0x28; + } + sub_80C4AAC(0); + sub_80C4BE4(); + sub_80C24BC(); + sub_80C0A88(1); + gUnknown_20399E0->field_CC8 = taskFunc; + gTasks[taskId].func = sub_80C267C; +} + +void sub_80C22C4(u8 a0, bool8 a1) +{ + u8 i; + if (a0 == 6) + { + for (i = 0; i < 6; i++) + { + gUnknown_20399E0->field_000[i]->field_400->invisible = a1; + } + } + else + { + gUnknown_20399E0->field_000[a0]->field_400->invisible = a1; + } +} |