mirror of https://github.com/zeldaret/tmc.git
334 lines
8.1 KiB
C
334 lines
8.1 KiB
C
/**
|
|
* @file rupeeLike.c
|
|
* @ingroup Enemies
|
|
*
|
|
* @brief Rupee Like enemy
|
|
*/
|
|
|
|
#include "global.h"
|
|
#include "asm.h"
|
|
#include "sound.h"
|
|
#include "entity.h"
|
|
#include "enemy.h"
|
|
#include "object.h"
|
|
#include "functions.h"
|
|
#include "save.h"
|
|
|
|
extern void sub_080293DC(Entity*);
|
|
extern void sub_080296D8(Entity*);
|
|
extern void sub_08029770(Entity*);
|
|
extern void sub_080297F0(Entity*);
|
|
extern void sub_080296C8(Entity*);
|
|
extern void sub_0802969C(Entity*);
|
|
|
|
extern void (*const gUnk_080CCC00[])(Entity*);
|
|
extern void (*const gUnk_080CCC18[])(Entity*);
|
|
extern void (*const gUnk_080CCC3C[])(Entity*);
|
|
|
|
extern const u8 gUnk_080CCC34[];
|
|
extern const s8 gUnk_080CCC44[];
|
|
extern const u8 gUnk_080CCC47[];
|
|
extern Hitbox gUnk_080FD260;
|
|
|
|
void RupeeLike(Entity* this) {
|
|
u32 uVar1;
|
|
|
|
if (this->type2 == 0) {
|
|
uVar1 = (u8)sub_080043E8(this);
|
|
if (uVar1 != 0) {
|
|
if (this->action == 4) {
|
|
sub_080296D8(this);
|
|
}
|
|
sub_08001290(this, uVar1);
|
|
} else {
|
|
gUnk_080CCC00[GetNextFunction(this)](this);
|
|
SetChildOffset(this, 0, 1, -0x10);
|
|
}
|
|
} else {
|
|
sub_080293DC(this);
|
|
}
|
|
}
|
|
|
|
void sub_08029300(Entity* this) {
|
|
gUnk_080CCC18[this->action](this);
|
|
}
|
|
|
|
void sub_08029318(Entity* this) {
|
|
if (this->hitType == 0x8e) {
|
|
sub_08029770(this);
|
|
} else {
|
|
if (this->action == 4) {
|
|
sub_080296D8(this);
|
|
}
|
|
if (*(u8*)(*(u32*)&this->field_0x4c + 8) == 1) {
|
|
if (this->action == 2) {
|
|
InitializeAnimation(this, 0);
|
|
InitializeAnimation(this->child, 4);
|
|
}
|
|
this->action = 4;
|
|
this->actionDelay = 0x3c;
|
|
this->field_0xf = 0;
|
|
this->field_0x82.HALF.HI = 0x41;
|
|
this->flags2 &= 0xfc;
|
|
this->field_0x80.HALF.LO = gPlayerEntity.spritePriority.b1;
|
|
EnqueueSFX(SFX_104);
|
|
} else {
|
|
if (this->field_0x43 != 0) {
|
|
sub_0804A9FC(this, 0x1c);
|
|
}
|
|
}
|
|
}
|
|
sub_0804AA30(this, gUnk_080CCC00);
|
|
}
|
|
|
|
void sub_080293B4(Entity* this) {
|
|
CreateDeathFx(this, 0xff, gUnk_080CCC34[this->cutsceneBeh.HALF.LO * 3 + this->type]);
|
|
}
|
|
|
|
void nullsub_141(Entity* this) {
|
|
}
|
|
|
|
void sub_080293DC(Entity* this) {
|
|
CopyPositionAndSpriteOffset(this->parent, this);
|
|
this->y.HALF.HI++;
|
|
this->z.HALF.HI--;
|
|
gUnk_080CCC3C[this->action](this);
|
|
}
|
|
|
|
void sub_0802940C(Entity* this) {
|
|
Entity* ent;
|
|
|
|
ent = CreateEnemy(RUPEE_LIKE, this->type);
|
|
if (ent != NULL) {
|
|
sub_0804A720(this);
|
|
ent->parent = this;
|
|
ent->type2 = 1;
|
|
this->child = ent;
|
|
this->field_0x80.HALF.HI = 0;
|
|
this->cutsceneBeh.HALF.LO = 0;
|
|
this->field_0x82.HALF.LO = this->palette.b.b0;
|
|
sub_080297F0(this);
|
|
}
|
|
}
|
|
|
|
void sub_0802944C(Entity* this) {
|
|
sub_080296C8(this);
|
|
if ((this->field_0x80.HALF.HI != 0) && sub_08049FDC(this, 1)) {
|
|
sub_08029770(this);
|
|
}
|
|
}
|
|
|
|
void sub_08029474(Entity* this) {
|
|
u32 bVar1;
|
|
|
|
sub_080296C8(this);
|
|
if (this->frame & 0x80) {
|
|
this->action = 3;
|
|
this->actionDelay = 8;
|
|
bVar1 = GetFacingDirection(this, &gPlayerEntity);
|
|
this->direction = bVar1;
|
|
this->animationState = (bVar1 << 0x18) >> 0x1c;
|
|
InitializeAnimation(this, this->animationState);
|
|
InitializeAnimation(this->child, this->animationState + 4);
|
|
} else {
|
|
if (this->frame == 1) {
|
|
this->frame = 0;
|
|
COLLISION_ON(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_080294D4(Entity* this) {
|
|
if (sub_08049FDC(this, 1) != 0) {
|
|
if (--this->actionDelay == 0) {
|
|
this->actionDelay = 8;
|
|
sub_08004596(this, GetFacingDirection(this, &gPlayerEntity));
|
|
sub_0802969C(this);
|
|
}
|
|
ProcessMovement(this);
|
|
sub_080296C8(this);
|
|
} else {
|
|
this->action = 6;
|
|
COLLISION_OFF(this);
|
|
InitializeAnimation(this, 3);
|
|
InitializeAnimation(this->child, 7);
|
|
}
|
|
}
|
|
|
|
void sub_0802953C(Entity* this) {
|
|
u8* pbVar3;
|
|
|
|
sub_080296C8(this);
|
|
sub_080296C8(this);
|
|
if (sub_0807953C() != 0) {
|
|
this->field_0xf++;
|
|
}
|
|
if (this->actionDelay != 0) {
|
|
this->actionDelay--;
|
|
}
|
|
if (((this->field_0xf > 0x2d) || (gSave.stats.rupees == 0)) && (this->actionDelay == 0)) {
|
|
sub_080296D8(this);
|
|
} else {
|
|
ResetPlayer();
|
|
gPlayerState.mobility |= 0x80;
|
|
PositionRelative(this, &gPlayerEntity, 0, Q_16_16(1.0));
|
|
pbVar3 = GetSpriteSubEntryOffsetDataPointer((u16)this->spriteIndex, this->frameIndex);
|
|
gPlayerEntity.spriteOffsetX = pbVar3[0];
|
|
gPlayerEntity.spriteOffsetY = pbVar3[1] - 1;
|
|
gPlayerEntity.spritePriority.b1 = 0;
|
|
if (--this->field_0x82.HALF.HI == 0) {
|
|
this->field_0x82.HALF.HI = 0x41;
|
|
if (gSave.stats.rupees != 0) {
|
|
ModRupees(gUnk_080CCC44[this->type]);
|
|
this->cutsceneBeh.HALF.LO = 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_08029610(Entity* this) {
|
|
if (--this->field_0xf == 0) {
|
|
this->action = 3;
|
|
this->actionDelay = 1;
|
|
}
|
|
sub_080296C8(this);
|
|
}
|
|
|
|
void sub_08029630(Entity* this) {
|
|
sub_080296C8(this);
|
|
if (this->frame & 0x80) {
|
|
this->field_0x80.HALF.HI = 1;
|
|
this->child->spriteSettings.draw = FALSE;
|
|
sub_080297F0(this);
|
|
}
|
|
}
|
|
|
|
void sub_08029660(Entity* this) {
|
|
u32 temp;
|
|
this->action = 1;
|
|
this->spriteIndex = 0xd1;
|
|
temp = gUnk_080CCC47[this->type];
|
|
this->palette.b.b0 = temp;
|
|
}
|
|
|
|
void sub_08029688(Entity* this) {
|
|
if (this->parent->next == NULL) {
|
|
DeleteEntity(this);
|
|
}
|
|
}
|
|
|
|
void sub_0802969C(Entity* this) {
|
|
u32 bVar1;
|
|
|
|
if ((this->direction & 0xf) != 0) {
|
|
|
|
bVar1 = this->direction >> 4;
|
|
if (bVar1 != this->animationState) {
|
|
this->animationState = bVar1;
|
|
InitializeAnimation(this, bVar1);
|
|
InitializeAnimation(this->child, bVar1 + 4);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_080296C8(Entity* this) {
|
|
GetNextFrame(this);
|
|
GetNextFrame(this->child);
|
|
}
|
|
|
|
void sub_080296D8(Entity* this) {
|
|
gPlayerState.jump_status = 0x41;
|
|
gPlayerState.flags &= ~PL_CAPTURED;
|
|
gPlayerEntity.flags |= ENT_COLLIDE;
|
|
gPlayerEntity.zVelocity = Q_16_16(1.5);
|
|
gPlayerEntity.iframes = 0xa6;
|
|
gPlayerEntity.z.HALF.HI = -2;
|
|
gPlayerEntity.direction = gPlayerEntity.animationState << 2;
|
|
gPlayerEntity.spritePriority.b1 = this->field_0x80.HALF.LO;
|
|
gPlayerEntity.spriteOffsetY = 0;
|
|
gPlayerEntity.speed = 0x140;
|
|
this->action = 5;
|
|
this->field_0xf = 0x3c;
|
|
this->flags2 |= 3;
|
|
if ((s8)this->iframes == 0) {
|
|
this->iframes = 0xf4;
|
|
}
|
|
}
|
|
|
|
void sub_08029770(Entity* this) {
|
|
u32 temp;
|
|
if (LoadFixedGFX(this, 0x73) != 0) {
|
|
this->action = 2;
|
|
COLLISION_OFF(this);
|
|
this->spriteIndex = 0xd1;
|
|
this->spritePriority.b1 = 3;
|
|
temp = this->field_0x82.HALF.LO;
|
|
this->palette.b.b0 = temp;
|
|
this->hitType = 0x8d;
|
|
this->hitbox = &gUnk_080FD260;
|
|
InitializeAnimation(this, 2);
|
|
this->child->spriteSettings.draw = TRUE;
|
|
InitializeAnimation(this->child, 6);
|
|
CreateDust(this);
|
|
}
|
|
}
|
|
|
|
void sub_080297F0(Entity* this) {
|
|
u32 temp;
|
|
this->action = 1;
|
|
this->actionDelay = 0x78;
|
|
COLLISION_ON(this);
|
|
this->spriteSettings.draw = TRUE;
|
|
this->hitType = 0x8e;
|
|
sub_080AE068(this);
|
|
#ifdef EU
|
|
this->spriteIndex = 0x142;
|
|
#else
|
|
this->spriteIndex = 0x143;
|
|
#endif
|
|
temp = gUnk_080CCC47[this->type];
|
|
this->palette.b.b0 = temp;
|
|
this->spriteVramOffset = 9;
|
|
InitializeAnimation(this, 0x54);
|
|
}
|
|
|
|
// clang-format off
|
|
void (*const gUnk_080CCC00[])(Entity*) = {
|
|
sub_08029300,
|
|
sub_08029318,
|
|
sub_08001324,
|
|
sub_080293B4,
|
|
sub_08001242,
|
|
nullsub_141,
|
|
};
|
|
|
|
void (*const gUnk_080CCC18[])(Entity*) = {
|
|
sub_0802940C,
|
|
sub_0802944C,
|
|
sub_08029474,
|
|
sub_080294D4,
|
|
sub_0802953C,
|
|
sub_08029610,
|
|
sub_08029630,
|
|
};
|
|
|
|
const u8 gUnk_080CCC34[] = {
|
|
0x54, 0x55,
|
|
0x56, 0x55,
|
|
0x56, 0x57,
|
|
};
|
|
|
|
void (*const gUnk_080CCC3C[])(Entity*) = {
|
|
sub_08029660,
|
|
sub_08029688,
|
|
};
|
|
|
|
const s8 gUnk_080CCC44[] = {
|
|
-1, -5, -20,
|
|
};
|
|
|
|
const u8 gUnk_080CCC47[] = {
|
|
2, 1, 0,
|
|
};
|
|
// clang-format on
|