mirror of https://github.com/zeldaret/tmc.git
182 lines
6.1 KiB
C
182 lines
6.1 KiB
C
/**
|
|
* @file blockPushed.c
|
|
* @ingroup Objects
|
|
*
|
|
* @brief Block Pushed object
|
|
*/
|
|
|
|
#define NENT_DEPRECATED
|
|
#include "global.h"
|
|
#include "object.h"
|
|
#include "functions.h"
|
|
|
|
typedef struct {
|
|
/*0x00*/ Entity base;
|
|
/*0x68*/ u32 unk_68;
|
|
} BlockPushedEntity;
|
|
|
|
extern void (*const gUnk_0811F624[])(BlockPushedEntity*);
|
|
extern const Hitbox* const gUnk_0811F64C[];
|
|
|
|
void sub_080832D8(u32, BlockPushedEntity*);
|
|
void sub_080830B8(BlockPushedEntity*);
|
|
|
|
void BlockPushed(BlockPushedEntity* this) {
|
|
gUnk_0811F624[super->action](this);
|
|
}
|
|
|
|
void sub_08082EB4(BlockPushedEntity* this) {
|
|
u16 tmp;
|
|
u32 pos;
|
|
|
|
if (gRoomControls.area == 0x11) {
|
|
UnloadGFXSlots(super);
|
|
if (LoadFixedGFX(super, 0x1c1) == 0) {
|
|
super->spriteSettings.draw = 0;
|
|
return;
|
|
}
|
|
super->spriteSettings.draw = 1;
|
|
}
|
|
super->action = 1;
|
|
super->timer = 0x20;
|
|
super->speed = 0x80;
|
|
super->spritePriority.b0 = 6;
|
|
pos = COORD_TO_TILE(super);
|
|
tmp = super->type * 8;
|
|
super->x.HALF.HI += tmp;
|
|
super->y.HALF.HI += tmp;
|
|
super->hitbox = (Hitbox*)gUnk_0811F64C[super->type];
|
|
this->unk_68 = GetTileType(pos, (u32)super->collisionLayer);
|
|
switch (super->type) {
|
|
case 0:
|
|
sub_080832D8(pos, this);
|
|
break;
|
|
case 1:
|
|
sub_080832D8(pos, this);
|
|
sub_080832D8(pos + 1, this);
|
|
sub_080832D8(pos + 0x40, this);
|
|
sub_080832D8(pos + 0x41, this);
|
|
break;
|
|
case 2:
|
|
sub_080832D8(pos, this);
|
|
sub_080832D8(pos + 1, this);
|
|
sub_080832D8(pos + 2, this);
|
|
sub_080832D8(pos + 0x40, this);
|
|
sub_080832D8(pos + 0x41, this);
|
|
sub_080832D8(pos + 0x42, this);
|
|
sub_080832D8(pos + 0x80, this);
|
|
sub_080832D8(pos + 0x81, this);
|
|
sub_080832D8(pos + 0x82, this);
|
|
break;
|
|
default:
|
|
sub_080832D8(pos, this);
|
|
sub_080832D8(pos + 1, this);
|
|
sub_080832D8(pos + 2, this);
|
|
sub_080832D8(pos + 3, this);
|
|
sub_080832D8(pos + 0x40, this);
|
|
sub_080832D8(pos + 0x41, this);
|
|
sub_080832D8(pos + 0x42, this);
|
|
sub_080832D8(pos + 0x43, this);
|
|
sub_080832D8(pos + 0x80, this);
|
|
sub_080832D8(pos + 0x81, this);
|
|
sub_080832D8(pos + 0x82, this);
|
|
sub_080832D8(pos + 0x83, this);
|
|
sub_080832D8(pos + 0xc0, this);
|
|
sub_080832D8(pos + 0xc1, this);
|
|
sub_080832D8(pos + 0xc2, this);
|
|
sub_080832D8(pos + 0xc3, this);
|
|
break;
|
|
}
|
|
EnqueueSFX(SFX_10F);
|
|
}
|
|
|
|
void sub_08083094(BlockPushedEntity* this) {
|
|
LinearMoveUpdate(super);
|
|
sub_0800445C(super);
|
|
if (--super->timer == 0) {
|
|
sub_080830B8(this);
|
|
}
|
|
}
|
|
|
|
void sub_080830B8(BlockPushedEntity* this) {
|
|
s32 offset = super->type * 8;
|
|
u32 pos = COORD_TO_TILE_OFFSET(super, offset, offset);
|
|
|
|
switch (super->type) {
|
|
case 0:
|
|
if (sub_0800442E(super)) {
|
|
return;
|
|
}
|
|
sub_0807B7D8(0x365, pos, super->collisionLayer);
|
|
break;
|
|
case 1:
|
|
sub_0807B7D8(this->unk_68, pos, super->collisionLayer);
|
|
sub_0807B7D8(0x36f, pos + 1, super->collisionLayer);
|
|
sub_0807B7D8(0x370, pos + 0x40, super->collisionLayer);
|
|
sub_0807B7D8(0x371, pos + 0x41, super->collisionLayer);
|
|
break;
|
|
case 2:
|
|
sub_0807B7D8(this->unk_68, pos, super->collisionLayer);
|
|
sub_0807B7D8(0x372, pos + 1, super->collisionLayer);
|
|
sub_0807B7D8(0x36f, pos + 2, super->collisionLayer);
|
|
sub_0807B7D8(0x374, pos + 0x40, super->collisionLayer);
|
|
sub_0807B7D8(0x376, pos + 0x41, super->collisionLayer);
|
|
sub_0807B7D8(0x375, pos + 0x42, super->collisionLayer);
|
|
sub_0807B7D8(0x370, pos + 0x80, super->collisionLayer);
|
|
sub_0807B7D8(0x373, pos + 0x81, super->collisionLayer);
|
|
sub_0807B7D8(0x371, pos + 0x82, super->collisionLayer);
|
|
break;
|
|
default:
|
|
sub_0807B7D8(this->unk_68, pos, super->collisionLayer);
|
|
sub_0807B7D8(0x372, pos + 1, super->collisionLayer);
|
|
sub_0807B7D8(0x372, pos + 2, super->collisionLayer);
|
|
sub_0807B7D8(0x36f, pos + 3, super->collisionLayer);
|
|
sub_0807B7D8(0x374, pos + 0x40, super->collisionLayer);
|
|
sub_0807B7D8(0x376, pos + 0x41, super->collisionLayer);
|
|
sub_0807B7D8(0x376, pos + 0x42, super->collisionLayer);
|
|
sub_0807B7D8(0x375, pos + 0x43, super->collisionLayer);
|
|
sub_0807B7D8(0x374, pos + 0x80, super->collisionLayer);
|
|
sub_0807B7D8(0x376, pos + 0x81, super->collisionLayer);
|
|
sub_0807B7D8(0x376, pos + 0x82, super->collisionLayer);
|
|
sub_0807B7D8(0x375, pos + 0x83, super->collisionLayer);
|
|
sub_0807B7D8(0x370, pos + 0xc0, super->collisionLayer);
|
|
sub_0807B7D8(0x373, pos + 0xc1, super->collisionLayer);
|
|
sub_0807B7D8(0x373, pos + 0xc2, super->collisionLayer);
|
|
sub_0807B7D8(0x371, pos + 0xc3, super->collisionLayer);
|
|
break;
|
|
}
|
|
DeleteEntity(super);
|
|
}
|
|
|
|
void sub_080832D8(u32 param_1, BlockPushedEntity* this) {
|
|
if (super->collisionLayer != 2) {
|
|
if ((super->direction & 8) != 0) {
|
|
sub_0807B7D8(0x21, param_1, super->collisionLayer);
|
|
} else {
|
|
sub_0807B7D8(0x20, param_1, super->collisionLayer);
|
|
}
|
|
} else {
|
|
if ((super->direction & 8) != 0) {
|
|
sub_0807B7D8(0x2f, param_1, super->collisionLayer);
|
|
} else {
|
|
sub_0807B7D8(0x2e, param_1, super->collisionLayer);
|
|
}
|
|
}
|
|
}
|
|
|
|
void (*const gUnk_0811F624[])(BlockPushedEntity*) = {
|
|
sub_08082EB4,
|
|
sub_08083094,
|
|
};
|
|
const Hitbox gUnk_0811F62C = { 0, 0, { 0, 0, 0, 0 }, 5, 4 };
|
|
const Hitbox gUnk_0811F634 = { 0, 0, { 0, 0, 0, 0 }, 13, 12 };
|
|
const Hitbox gUnk_0811F63C = { 0, 0, { 0, 0, 0, 0 }, 21, 20 };
|
|
const Hitbox gUnk_0811F644 = { 0, 0, { 0, 0, 0, 0 }, 29, 28 };
|
|
|
|
const Hitbox* const gUnk_0811F64C[] = {
|
|
&gUnk_0811F62C,
|
|
&gUnk_0811F634,
|
|
&gUnk_0811F63C,
|
|
&gUnk_0811F644,
|
|
};
|