/** * @file fileScreenObjects.c * @ingroup Objects * * @brief File Screen Objects object */ #define NENT_DEPRECATED #include "fileselect.h" #include "functions.h" #include "main.h" #include "menu.h" #include "object.h" #include "player.h" typedef struct { /*0x00*/ Entity base; /*0x68*/ u16 unk_68; /*0x6a*/ u16 unk_6a; /*0x6c*/ u16 unk_6c; /*0x6e*/ u8 unused1[2]; /*0x70*/ u8 unk_70; } FileScreenObjectsEntity; extern u32 sub_080041EC(s32, s32); static bool32 sub_0808E950(void); static void sub_0808EABC(FileScreenObjectsEntity*); static Entity* sub_0808EC80(s32); static u32 sub_0808EF6C(FileScreenObjectsEntity*); static void sub_0808EFF0(FileScreenObjectsEntity*); static void FileScreenObjects_Type0(FileScreenObjectsEntity*); static void FileScreenObjects_Type23(FileScreenObjectsEntity*); static void FileScreenObjects_Type24(FileScreenObjectsEntity*); static void FileScreenObjects_Type25(FileScreenObjectsEntity*); static void FileScreenObjects_Type16(FileScreenObjectsEntity*); static void FileScreenObjects_Type4(FileScreenObjectsEntity*); static void FileScreenObjects_Type8(FileScreenObjectsEntity*); static void FileScreenObjects_Type25(FileScreenObjectsEntity*); static void FileScreenObjects_Type9(FileScreenObjectsEntity*); static void FileScreenObjects_Type10(FileScreenObjectsEntity*); static void FileScreenObjects_Type17(FileScreenObjectsEntity*); static void FileScreenObjects_Type15(FileScreenObjectsEntity*); static void FileScreenObjects_Type18(FileScreenObjectsEntity*); static void FileScreenObjects_Type19(FileScreenObjectsEntity*); static void FileScreenObjects_Type21(FileScreenObjectsEntity*); static void FileScreenObjects_Type23_LinkPreview(FileScreenObjectsEntity*); static void FileScreenObjects_Type23_Init(FileScreenObjectsEntity*); typedef struct { u8 unk0; u8 unk1; u8 unk2; } PACKED struct_08121CD4; typedef struct { u16 unk0; s16 unk2; u16 unk4; u8 unk6_0 : 3; u8 unk6_3 : 3; u8 unk6_6 : 2; u8 unk7; } struct_08121D54; extern const s32 gUnk_08133368[]; void FileScreenObjects(FileScreenObjectsEntity* this) { static void (*const FileScreenObjects_Types[])(FileScreenObjectsEntity*) = { FileScreenObjects_Type0, FileScreenObjects_Type0, FileScreenObjects_Type0, FileScreenObjects_Type0, FileScreenObjects_Type4, FileScreenObjects_Type4, FileScreenObjects_Type4, FileScreenObjects_Type4, FileScreenObjects_Type8, FileScreenObjects_Type9, FileScreenObjects_Type10, FileScreenObjects_Type10, FileScreenObjects_Type10, FileScreenObjects_Type10, FileScreenObjects_Type10, FileScreenObjects_Type15, FileScreenObjects_Type16, FileScreenObjects_Type17, FileScreenObjects_Type18, FileScreenObjects_Type19, FileScreenObjects_Type19, FileScreenObjects_Type21, FileScreenObjects_Type21, FileScreenObjects_Type23, FileScreenObjects_Type24, FileScreenObjects_Type25, }; if (super->health == 0) { sub_0808EFF0(this); } FileScreenObjects_Types[super->type](this); if (super->animIndex < 64) { UpdateAnimationSingleFrame(super); } } void FileScreenObjects_Type23(FileScreenObjectsEntity* this) { static void (*const FileScreenObjects_Type23_Actions[])(FileScreenObjectsEntity*) = { FileScreenObjects_Type23_Init, FileScreenObjects_Type23_LinkPreview, }; FileScreenObjects_Type23_Actions[super->action](this); } void FileScreenObjects_Type23_Init(FileScreenObjectsEntity* this) { LoadSwapGFX(super, 1, 2); super->palette.b.b0 = 0xF; super->spriteSettings.draw = 0; super->type2 = 0xFF; super->action = 1; } void FileScreenObjects_Type23_LinkPreview(FileScreenObjectsEntity* this) { u32 var0; u32 offset; if (!sub_0808E950()) { s32 var2 = -1; super->type2 = var2; this->unk_68 = var2; this->unk_6a = var2; super->spriteSettings.draw = 0; return; } if (super->type2 != gMapDataBottomSpecial.unk6) { super->type2 = gMapDataBottomSpecial.unk6; this->unk_68 = CheckGlobalFlag(EZERO_1ST) == 0 ? ANIM_DEFAULT_NOCAP : ANIM_DEFAULT; this->unk_70 = 4; super->animationState = PAS_SOUTH; offset = gUnk_08133368[GetPlayerPalette(TRUE) - 22] & 0xFFFFFF; LoadPalettes(&gGlobalGfxAndPalettes[offset], 31, 1); } if (gUI.lastState == 0) { if (gInput.heldKeys & L_BUTTON) { switch (gInput.newKeys) { case DPAD_UP: super->animationState = PAS_NORTH; break; case DPAD_RIGHT: super->animationState = PAS_EAST; break; case DPAD_DOWN: super->animationState = PAS_SOUTH; break; case DPAD_LEFT: super->animationState = PAS_WEST; break; case B_BUTTON: this->unk_70 = this->unk_70 ? 0 : 4; break; } } } super->spriteSettings.flipX = super->animationState == 3; var0 = this->unk_68 + this->unk_70 + super->animationState; if (this->unk_6a != var0) { this->unk_6a = var0; super->spriteIndex = var0 >> 8; InitAnimationForceUpdate(super, (u8)var0); } super->spriteSettings.draw = 2; } static bool32 sub_0808E950(void) { bool32 result = FALSE; switch (gUI.lastState) { case 0: case 4: case 5: case 6: case 7: result = gMapDataBottomSpecial.saveStatus[gMapDataBottomSpecial.unk6] == 1; break; } return result; } void FileScreenObjects_Type24(FileScreenObjectsEntity* this) { if (super->action == 0) { super->action = 1; #ifdef EU super->spriteIndex = 0x141; #else super->spriteIndex = 0x142; #endif super->type2 = 0xFF; LoadSwapGFX(super, 1, 3); } if (sub_0808E950()) { s32 i; for (i = 6; i != 0; i--) { if (GetInventoryValue(i)) { break; } } if (i != 0) { if (super->type2 != i) { InitAnimationForceUpdate(super, i); } super->spriteSettings.draw = 2; return; } } super->spriteSettings.draw = 0; } void FileScreenObjects_Type25(FileScreenObjectsEntity* this) { if (sub_0808E950() && gSave.saw_staffroll) { super->spriteSettings.draw = 2; } else { super->spriteSettings.draw = 0; } } void FileScreenObjects_Type0(FileScreenObjectsEntity* this) { u32 var0; u32 var1; if (super->type == 3) { if (gSaveHeader->language > LANGUAGE_EN) { super->spriteSettings.draw = 2; } else { super->spriteSettings.draw = 0; } } if (super->type == gMapDataBottomSpecial.unk6) { var0 = 12; var1 = 1; } else { if (gUI.lastState == 5 && super->type == gMapDataBottomSpecial.unk7) { var0 = 13; var1 = 2; } else { var0 = 14; var1 = 2; } } super->palette.b.b0 = var0; super->spriteRendering.b3 = var1; sub_0808EABC(this); gMapDataBottomSpecial.isTransitioning |= sub_0808EF6C(this); } void sub_0808EABC(FileScreenObjectsEntity* this) { s32 var0 = -72; s32 var1 = super->type * 32 + 40; s32 var2 = gMapDataBottomSpecial.unk6 == super->type; switch (gUI.lastState) { case 0: var0 = 24; break; case 3: case 4: case 6: case 7: if (var2) { var0 = 42; var1 = 56; } break; case 5: switch (gGenericMenu.unk10.a[super->type]) { case 0: var0 = 42; var1 = 40; break; case 1: case 2: var0 = 20; var1 = 144; var1 -= (gGenericMenu.unk16 - gGenericMenu.unk10.a[super->type]) * 32; break; } break; case 2: if (var2) { var0 = 26; var1 = 42; } break; default: if (var2) { var0 = 8; var1 = 35; } break; } this->unk_68 = var0; this->unk_6a = var1; } void FileScreenObjects_Type15(FileScreenObjectsEntity* this) { Entity* entity = sub_0808EC80(gMapDataBottomSpecial.unk6); if (entity != NULL) { super->x.WORD = entity->x.WORD; super->y.WORD = entity->y.WORD; super->spriteRendering.b3 = entity->spriteRendering.b3; SortEntityBelow(entity, super); } else { super->x.HALF.HI = 0xF000; super->y.HALF.HI = 0xF000; } } void FileScreenObjects_Type16(FileScreenObjectsEntity* this) { u32 var0; u32 x, y; Entity* entity; switch (gUI.lastState) { case 4: var0 = gMenu.column_idx + 4; break; case 5: var0 = 2; break; case 6: var0 = gMenu.column_idx == 0 ? 7 : 6; break; case 7: var0 = 4; break; case 2: var0 = 1; break; default: var0 = 0; break; } x = y = 0xF000; switch (var0) { case 0: break; case 1: y = gSaveHeader->language * 16 + 24; x = 112; break; case 2: var0 = gMapDataBottomSpecial.unk7; if (var0 == 4) { var0 = 7; } // Fall through default: entity = sub_0808EC80(var0); if (entity != NULL) { SortEntityBelow(entity, super); super->spriteRendering.b3 = entity->spriteRendering.b3; x = entity->x.HALF.HI; y = entity->y.HALF.HI; } break; } super->x.HALF.HI = x; super->y.HALF.HI = y; } static Entity* sub_0808EC80(s32 form) { Entity* entityA = (Entity*)&gEntityLists[6]; Entity* entityB = entityA->next; while (entityB != entityA) { if ((entityB->kind == OBJECT && entityB->id == 0x48) && form == entityB->type) { return entityB; } entityB = entityB->next; } return NULL; } void FileScreenObjects_Type4(FileScreenObjectsEntity* this) { static const struct_08121CD4 gUnk_08121CD4[][4] = { { { 0x9, 0x18, 0xb0 }, { 0x9, 0x60, 0xb0 }, { 0x9, 0xa8, 0xb0 }, { 0x9, 0x40, 0xb0 } }, { { 0x0, 0x18, 0x90 }, { 0x1, 0x60, 0x90 }, { 0x2, 0xa8, 0x90 }, { 0x9, 0x40, 0xb0 } }, { { 0x9, 0x18, 0xb0 }, { 0x9, 0x60, 0xb0 }, { 0x9, 0xa8, 0xb0 }, { 0x4, 0x14, 0x90 } }, { { 0x9, 0x18, 0xb0 }, { 0x9, 0x60, 0xb0 }, { 0x1, 0x88, 0x90 }, { 0x0, 0x40, 0x90 } }, { { 0x0, 0x18, 0x90 }, { 0x9, 0x60, 0xb0 }, { 0x9, 0xa8, 0xb0 }, { 0x9, 0x40, 0xb0 } } }; s32 var0; s32 var1; s32 var2; const struct_08121CD4* var3; var0 = gMenu.column_idx; switch (gUI.lastState) { case 4: var1 = 1; break; case 5: var0 = gMapDataBottomSpecial.unk7; var1 = 2; break; case 6: var1 = 3; break; case 7: var1 = 4; break; default: var1 = 0; break; } var2 = super->type - 4; var3 = &gUnk_08121CD4[var1][var2]; this->unk_68 = var3->unk1; this->unk_6a = var3->unk2; if (var3->unk0 == var0) { super->palette.b.b0 = 13; } else { super->palette.b.b0 = 14; } gMapDataBottomSpecial.isTransitioning |= sub_0808EF6C(this); } void FileScreenObjects_Type8(FileScreenObjectsEntity* this) { s32 y = 255; if (gUI.lastState == 1 && gGenericMenu.unk10.a[1] != 5) { super->x.HALF.HI = gGenericMenu.unk10.a[0] * 16 + 28; y = gGenericMenu.unk10.a[1] * 16 + 58; } super->y.HALF.HI = y; } void FileScreenObjects_Type9(FileScreenObjectsEntity* this) { static const s8 gUnk_08121D10[] = { 0, -1, -3, -2, -2, -1, 0, 0, }; s32 y; if (gUI.lastState != 1) { this->unk_68 = 27; y = -10; } else { u32 var0 = gGenericMenu.unk10.a[3]; if (var0 > 5) { var0 = 5; } this->unk_68 = var0 * 8 + 27; y = 24; } super->y.HALF.HI = y; this->unk_6a = y; super->subtimer++; super->spriteOffsetY = gUnk_08121D10[(super->subtimer / 4) & 0x7]; sub_0808EF6C(this); } void FileScreenObjects_Type10(FileScreenObjectsEntity* this) { static const u16 gUnk_08121D18[][8] = { { 0x2c, 0x54, 0x7c, 0xa4, 0xcc, 0x0, 0x0, 0x0 }, { 0xfff, 0x2e, 0x62, 0x96, 0xca, 0x0, 0x0, 0x0 } }; static const u8 gUnk_08121D38[][8] = { { 12, 13, 14, 16, 17, 0, 0, 0 }, { -1, 14, 15, 16, 17, 0, 0, 0 }, }; s32 var0, var1, var2; var0 = ((SaveHeader*)0x2000000)->language != 0; var1 = super->type - 10; super->frameIndex = gUnk_08121D38[var0][var1]; super->x.HALF.HI = gUnk_08121D18[var0][var1]; this->unk_68 = gUnk_08121D18[var0][var1]; var1 -= var0; if (gUI.lastState != 1) { var1 = 128; var2 = 176; } else { var2 = 140; } this->unk_6a = var2; super->palette.b.b0 = gGenericMenu.unk10.a[1] == 5 && var1 == gGenericMenu.unk10.a[2] ? 11 : 9; gMapDataBottomSpecial.isTransitioning |= sub_0808EF6C(this); } void FileScreenObjects_Type17(FileScreenObjectsEntity* this) { } void FileScreenObjects_Type18(FileScreenObjectsEntity* this) { static const u8 gUnk_08121D48[] = { 0x28, 0x27, 0x28, 0x28, 0x28, 0x2a, 0x29, 0x28, 0xff, 0x0, 0x0, 0x0 }; super->timer = gUI.lastState; super->frameIndex = gUnk_08121D48[super->timer]; if (super->timer != 2) { this->unk_68 = 96; } else { this->unk_68 = -96; } sub_0808EF6C(this); } void FileScreenObjects_Type19(FileScreenObjectsEntity* this) { s32 var0; if (gUI.lastState != 3) { super->spriteSettings.draw = 0; } else { super->spriteSettings.draw = 2; var0 = super->type - 19; super->palette.b.b0 = gMenu.column_idx == var0 ? 4 : 3; } } void FileScreenObjects_Type21(FileScreenObjectsEntity* this) { s32 var0; if (gUI.lastState != 3) { super->spriteSettings.draw = 0; } else { super->spriteSettings.draw = 2; if (super->type == 21) { var0 = ((SaveHeader*)0x2000000)->msg_speed; } else { var0 = ((SaveHeader*)0x2000000)->brightness; } super->frameIndex = super->lastFrameIndex + var0; } } static u32 sub_0808EF6C(FileScreenObjectsEntity* this) { s32 var0; u32 var1; s32 var2; u32 var3; s32 var4; s16 var5; s16 var6; s32 var7; var6 = this->unk_68; var0 = var6 - super->x.HALF.HI; var1 = var0; if (var0 < 0) { var1 = -var0; } if (var1 < 2) { super->x.WORD = var6 << 16; var0 = 0; } var5 = this->unk_6a; var2 = var5 - super->y.HALF.HI; var3 = var2; if (var2 < 0) { var3 = -var2; } if (var3 < 2) { super->y.WORD = var5 << 16; var2 = 0; } if ((var0 | var2) == 0) { return 0; } var4 = var7 = sub_080041EC(var0, var2); var4 += 128; var7 = var4 + var7 * 16; if (this->unk_6c < var7) { var7 = this->unk_6c; } super->speed = var7; super->direction = sub_080045DA(var0, var2) >> 3; LinearMoveUpdate(super); return 1; } static void sub_0808EFF0(FileScreenObjectsEntity* this) { static const struct_08121D54 gUnk_08121D54[] = { { 0x800, -0x40, 0x28, 2, 4, 1, 0x80 }, { 0x800, -0x40, 0x48, 2, 4, 1, 0x81 }, { 0x800, -0x40, 0x68, 2, 4, 1, 0x82 }, { 0x800, -0x40, 0x88, 2, 4, 1, 0x83 }, { 0x300, 0x40, 0xb0, 1, 1, 1, 0x84 }, { 0x300, 0x70, 0xb0, 1, 1, 1, 0x85 }, { 0x300, 0x90, 0xb0, 1, 1, 1, 0x86 }, { 0x300, 0x40, 0xb0, 1, 1, 1, 0x87 }, { 0x1000, 0x1c, 0xff, 2, 7, 2, 0x88 }, { 0x200, 0x1b, 0xff, 1, 1, 1, 0x0 }, { 0x200, 0x0, 0xb0, 1, 1, 1, 0xff }, { 0x200, 0x0, 0xb0, 1, 2, 1, 0xff }, { 0x200, 0x0, 0xb0, 1, 3, 1, 0xff }, { 0x200, 0x0, 0xb0, 1, 4, 1, 0xff }, { 0x200, 0x0, 0xb0, 1, 5, 1, 0xff }, { 0x800, 0x0, 0x0, 2, 6, 1, 0x1 }, { 0x1000, 0x0, 0x0, 2, 6, 1, 0x1 }, { 0x1000, 0x0, 0xb0, 2, 6, 1, 0x1 }, { 0x1000, 0x60, 0x0, 0, 0, 0, 0xff }, { 0x400, 0xa8, 0x50, 1, 1, 1, 0x99 }, { 0x400, 0xa8, 0x50, 1, 1, 1, 0x9a }, { 0x400, 0xa8, 0x50, 1, 1, 1, 0x9b }, { 0x400, 0xa8, 0x50, 1, 1, 1, 0x9e }, { 0x400, 0x80, 0x48, 1, 1, 1, 0xff }, { 0x400, 0xc0, 0x42, 1, 1, 1, 0xff }, { 0x400, 0xc8, 0x32, 1, 1, 1, 0xa5 } }; const struct_08121D54* var0; u8 var1; super->spriteSettings.draw = 2; super->speed = 0x400; super->health = 1; super->frameIndex = 0xFF; super->animIndex = 0xFF; var0 = &gUnk_08121D54[super->type]; super->x.HALF.HI = var0->unk2; this->unk_68 = var0->unk2; super->y.HALF.HI = var0->unk4; this->unk_6a = var0->unk4; super->spriteRendering.b3 = var0->unk6_0; super->spritePriority.b0 = var0->unk6_3; super->spriteOrientation.flipY = var0->unk6_6; this->unk_6c = var0->unk0; var1 = var0->unk7; if (var1 & 0x80) { var1 &= ~(0x80); super->frameIndex = var1; super->lastFrameIndex = var1; } else { InitAnimationForceUpdate(super, var1); } }