tmc/src/object/fileScreenObjects.c

538 lines
13 KiB
C

#include "object.h"
#include "main.h"
#include "menu.h"
#include "fileselect.h"
#include "functions.h"
extern int sub_0807A094(int);
extern u32 sub_080041EC(int, int);
static bool32 sub_0808E950(void);
static void sub_0808EABC(Entity*);
static Entity* sub_0808EC80(int);
static u32 sub_0808EF6C(Entity*);
static void sub_0808EFF0(Entity*);
typedef struct {
u8 unk0;
u8 unk1;
u8 unk2;
} PACKED struct_08121CD4;
typedef struct {
u16 unk0;
u16 unk2;
u16 unk4;
u8 unk6_0 : 3;
u8 unk6_3 : 3;
u8 unk6_6 : 2;
u8 unk7;
} struct_08121D54;
extern void (*const gUnk_08121C64[])(Entity*);
extern void (*const gUnk_08121CCC[])(Entity*);
extern const int gUnk_08133368[];
extern const struct_08121CD4 gUnk_08121CD4[][4];
extern const u8 gUnk_08121D10[];
extern const u8 gUnk_08121D38[][8];
extern const u16 gUnk_08121D18[][8];
extern const u8 gUnk_08121D48[];
extern const struct_08121D54 gUnk_08121D54[];
void FileScreenObjects(Entity* this) {
if (this->health == 0) {
sub_0808EFF0(this);
}
gUnk_08121C64[this->type](this);
if (this->animIndex < 64) {
UpdateAnimationSingleFrame(this);
}
}
void sub_0808E7D8(Entity* this) {
gUnk_08121CCC[this->action](this);
}
void sub_0808E7F0(Entity* this) {
LoadSwapGFX(this, 1, 2);
this->palette.b.b0 = 0xF;
this->spriteSettings.draw = 0;
this->type2 = 0xFF;
this->action = 1;
}
void sub_0808E818(Entity* this) {
u32 var0;
u32 var1;
if (!sub_0808E950()) {
int var2 = -1;
this->type2 = var2;
this->field_0x68.HWORD = var2;
this->field_0x6a.HWORD = var2;
this->spriteSettings.draw = 0;
return;
}
if (this->type2 != gUnk_02019EE0.unk6) {
this->type2 = gUnk_02019EE0.unk6;
this->field_0x68.HWORD = CheckGlobalFlag(EZERO_1ST) == 0 ? 0x400 : 0x100;
this->field_0x70.BYTES.byte0 = 4;
this->animationState = 2;
var1 = gUnk_08133368[sub_0807A094(1) - 22] & 0xFFFFFF;
LoadPalettes(&gGlobalGfxAndPalettes[var1], 31, 1);
}
if (gUnk_02032EC0.lastState == 0) {
if (gInput.heldKeys & L_BUTTON) {
switch (gInput.newKeys) {
case DPAD_UP:
this->animationState = 0;
break;
case DPAD_RIGHT:
this->animationState = 1;
break;
case DPAD_DOWN:
this->animationState = 2;
break;
case DPAD_LEFT:
this->animationState = 3;
break;
case B_BUTTON:
this->field_0x70.BYTES.byte0 = this->field_0x70.BYTES.byte0 ? 0 : 4;
break;
}
}
}
this->spriteSettings.flipX = this->animationState == 3;
var0 = this->field_0x68.HWORD + this->field_0x70.BYTES.byte0 + this->animationState;
if (this->field_0x6a.HWORD != var0) {
this->field_0x6a.HWORD = var0;
this->spriteIndex = var0 >> 8;
InitAnimationForceUpdate(this, (u8)var0);
}
this->spriteSettings.draw = 2;
}
static bool32 sub_0808E950(void) {
bool32 result = FALSE;
switch (gUnk_02032EC0.lastState) {
case 0:
case 4:
case 5:
case 6:
case 7:
result = gUnk_02019EE0.saveStatus[gUnk_02019EE0.unk6] == 1;
break;
}
return result;
}
void sub_0808E988(Entity* this) {
if (this->action == 0) {
this->action = 1;
#ifdef EU
this->spriteIndex = 0x141;
#else
this->spriteIndex = 0x142;
#endif
this->type2 = 0xFF;
LoadSwapGFX(this, 1, 3);
}
if (sub_0808E950()) {
int i;
for (i = 6; i != 0; i--) {
if (GetInventoryValue(i)) {
break;
}
}
if (i != 0) {
if (this->type2 != i) {
InitAnimationForceUpdate(this, i);
}
this->spriteSettings.draw = 2;
return;
}
}
this->spriteSettings.draw = 0;
}
void sub_0808E9F4(Entity* this) {
if (sub_0808E950() && gSave.unk6) {
this->spriteSettings.draw = 2;
} else {
this->spriteSettings.draw = 0;
}
}
void sub_0808EA28(Entity* this) {
u32 var0;
u32 var1;
if (this->type == 3) {
if (gSaveHeader->language > LANGUAGE_EN) {
this->spriteSettings.draw = 2;
} else {
this->spriteSettings.draw = 0;
}
}
if (this->type == gUnk_02019EE0.unk6) {
var0 = 12;
var1 = 1;
} else {
if (gUnk_02032EC0.lastState == 5 && this->type == gUnk_02019EE0.unk7) {
var0 = 13;
var1 = 2;
} else {
var0 = 14;
var1 = 2;
}
}
this->palette.b.b0 = var0;
this->spriteRendering.b3 = var1;
sub_0808EABC(this);
gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
}
void sub_0808EABC(Entity* this) {
int var0 = -72;
int var1 = this->type * 32 + 40;
int var2 = gUnk_02019EE0.unk6 == this->type;
switch (gUnk_02032EC0.lastState) {
case 0:
var0 = 24;
break;
case 3:
case 4:
case 6:
case 7:
if (var2) {
var0 = 42;
var1 = 56;
}
break;
case 5:
switch (gMenu.focusCoords[this->type]) {
case 0:
var0 = 42;
var1 = 40;
break;
case 1:
case 2:
var0 = 20;
var1 = 144;
var1 -= (gMenu.unk16 - gMenu.focusCoords[this->type]) * 32;
break;
}
break;
case 2:
if (var2) {
var0 = 26;
var1 = 42;
}
break;
default:
if (var2) {
var0 = 8;
var1 = 35;
}
break;
}
this->field_0x68.HWORD = var0;
this->field_0x6a.HWORD = var1;
}
void sub_0808EB74(Entity* this) {
Entity* entity = sub_0808EC80(gUnk_02019EE0.unk6);
if (entity) {
this->x.WORD = entity->x.WORD;
this->y.WORD = entity->y.WORD;
this->spriteRendering.b3 = entity->spriteRendering.b3;
SortEntityBelow(entity, this);
} else {
this->x.HALF.HI = 0xF000;
this->y.HALF.HI = 0xF000;
}
}
void sub_0808EBB8(Entity* this) {
u32 var0;
u32 x, y;
Entity* entity;
switch (gUnk_02032EC0.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 = ((SaveHeader*)0x2000000)->language * 16 + 24;
x = 112;
break;
case 2:
var0 = gUnk_02019EE0.unk7;
if (var0 == 4) {
var0 = 7;
}
// Fall through
default:
entity = sub_0808EC80(var0);
if (entity) {
SortEntityBelow(entity, this);
this->spriteRendering.b3 = entity->spriteRendering.b3;
x = entity->x.HALF.HI;
y = entity->y.HALF.HI;
}
break;
}
this->x.HALF.HI = x;
this->y.HALF.HI = y;
}
static Entity* sub_0808EC80(int form) {
Entity* entityA = (Entity*)&gEntityLists[6];
Entity* entityB = entityA->next;
while (entityB != entityA) {
if ((entityB->kind == 0x6 && entityB->id == 0x48) && form == entityB->type) {
return entityB;
}
entityB = entityB->next;
}
return NULL;
}
void sub_0808ECBC(Entity* this) {
int var0;
int var1;
int var2;
const struct_08121CD4* var3;
var0 = gMenu.column_idx;
switch (gUnk_02032EC0.lastState) {
case 4:
var1 = 1;
break;
case 5:
var0 = gUnk_02019EE0.unk7;
var1 = 2;
break;
case 6:
var1 = 3;
break;
case 7:
var1 = 4;
break;
default:
var1 = 0;
break;
}
var2 = this->type - 4;
var3 = &gUnk_08121CD4[var1][var2];
this->field_0x68.HWORD = var3->unk1;
this->field_0x6a.HWORD = var3->unk2;
if (var3->unk0 == var0) {
this->palette.b.b0 = 13;
} else {
this->palette.b.b0 = 14;
}
gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
}
void sub_0808ED64(Entity* this) {
int y = 255;
if (gUnk_02032EC0.lastState == 1 && gMenu.focusCoords[1] != 5) {
this->x.HALF.HI = gMenu.focusCoords[0] * 16 + 28;
y = gMenu.focusCoords[1] * 16 + 58;
}
this->y.HALF.HI = y;
}
void sub_0808ED98(Entity* this) {
int y;
if (gUnk_02032EC0.lastState != 1) {
this->field_0x68.HWORD = 27;
y = -10;
} else {
u32 var0 = gMenu.unk13;
if (var0 > 5) {
var0 = 5;
}
this->field_0x68.HWORD = var0 * 8 + 27;
y = 24;
}
this->y.HALF.HI = y;
this->field_0x6a.HWORD = y;
this->field_0xf++;
this->spriteOffsetY = gUnk_08121D10[(this->field_0xf / 4) & 0x7];
sub_0808EF6C(this);
}
void sub_0808EE00(Entity* this) {
int var0, var1, var2;
var0 = ((SaveHeader*)0x2000000)->language != 0;
var1 = this->type - 10;
this->frameIndex = gUnk_08121D38[var0][var1];
this->x.HALF.HI = gUnk_08121D18[var0][var1];
this->field_0x68.HWORD = gUnk_08121D18[var0][var1];
var1 -= var0;
if (gUnk_02032EC0.lastState != 1) {
var1 = 128;
var2 = 176;
} else {
var2 = 140;
}
this->field_0x6a.HWORD = var2;
this->palette.b.b0 = gMenu.focusCoords[1] == 5 && var1 == gMenu.field_0x12 ? 11 : 9;
gUnk_02019EE0.isTransitioning |= sub_0808EF6C(this);
}
void nullsub_522(Entity* this) {
}
void sub_0808EE98(Entity* this) {
this->actionDelay = gUnk_02032EC0.lastState;
this->frameIndex = gUnk_08121D48[this->actionDelay];
if (this->actionDelay != 2) {
this->field_0x68.HWORD = 96;
} else {
this->field_0x68.HWORD = -96;
}
sub_0808EF6C(this);
}
void sub_0808EED8(Entity* this) {
int var0;
if (gUnk_02032EC0.lastState != 3) {
this->spriteSettings.draw = 0;
} else {
this->spriteSettings.draw = 2;
var0 = this->type - 19;
this->palette.b.b0 = gMenu.column_idx == var0 ? 4 : 3;
}
}
void sub_0808EF24(Entity* this) {
int var0;
if (gUnk_02032EC0.lastState != 3) {
this->spriteSettings.draw = 0;
} else {
this->spriteSettings.draw = 2;
if (this->type == 21) {
var0 = ((SaveHeader*)0x2000000)->msg_speed;
} else {
var0 = ((SaveHeader*)0x2000000)->brightness;
}
this->frameIndex = this->lastFrameIndex + var0;
}
}
static u32 sub_0808EF6C(Entity* this) {
int var0;
u32 var1;
int var2;
u32 var3;
int var4;
s16 var5;
s16 var6;
int var7;
var6 = this->field_0x68.HWORD;
var0 = var6 - this->x.HALF.HI;
var1 = var0;
if (var0 < 0) {
var1 = -var0;
}
if (var1 < 2) {
this->x.WORD = var6 << 16;
var0 = 0;
}
var5 = this->field_0x6a.HWORD;
var2 = var5 - this->y.HALF.HI;
var3 = var2;
if (var2 < 0) {
var3 = -var2;
}
if (var3 < 2) {
this->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->field_0x6c.HWORD < var7) {
var7 = this->field_0x6c.HWORD;
}
this->speed = var7;
this->direction = sub_080045DA(var0, var2) >> 3;
LinearMoveUpdate(this);
return 1;
}
static void sub_0808EFF0(Entity* this) {
const struct_08121D54* var0;
u8 var1;
this->spriteSettings.draw = 2;
this->speed = 0x400;
this->health = 1;
this->frameIndex = 0xFF;
this->animIndex = 0xFF;
var0 = &gUnk_08121D54[this->type];
this->x.HALF.HI = var0->unk2;
this->field_0x68.HWORD = var0->unk2;
this->y.HALF.HI = var0->unk4;
this->field_0x6a.HWORD = var0->unk4;
this->spriteRendering.b3 = var0->unk6_0;
this->spritePriority.b0 = var0->unk6_3;
this->spriteOrientation.flipY = var0->unk6_6;
this->field_0x6c.HWORD = var0->unk0;
var1 = var0->unk7;
if (var1 & 0x80) {
var1 &= ~(0x80);
this->frameIndex = var1;
this->lastFrameIndex = var1;
} else {
InitAnimationForceUpdate(this, var1);
}
}