mirror of https://github.com/zeldaret/tmc.git
538 lines
13 KiB
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);
|
|
}
|
|
}
|