mirror of https://github.com/zeldaret/tmc.git
183 lines
4.8 KiB
C
183 lines
4.8 KiB
C
/**
|
|
* @file itemForSale.c
|
|
* @ingroup Objects
|
|
*
|
|
* @brief Item for Sale object
|
|
*/
|
|
|
|
#define NENT_DEPRECATED
|
|
#include "global.h"
|
|
#include "object.h"
|
|
#include "functions.h"
|
|
#include "hitbox.h"
|
|
#include "new_player.h"
|
|
#include "message.h"
|
|
#include "kinstone.h"
|
|
|
|
typedef struct {
|
|
/*0x00*/ Entity base;
|
|
/*0x68*/ u8 unk_68[0x18];
|
|
/*0x80*/ u16 unk_80;
|
|
/*0x82*/ u16 unk_82;
|
|
} ItemForSaleEntity;
|
|
|
|
typedef struct {
|
|
u8 before[0x20];
|
|
u8 unk_20[0x4]; // TODO for Entity this is zVelocity which is not an array. spriteAnimation[super->subtimer-6] does
|
|
// not match.
|
|
} ModifiedParentEntity;
|
|
|
|
extern u32 sub_080787D8(Entity*);
|
|
extern void* sub_080784E4(void);
|
|
|
|
void ItemForSale_Init(ItemForSaleEntity*);
|
|
void ItemForSale_Action1(ItemForSaleEntity*);
|
|
void ItemForSale_Action2(ItemForSaleEntity*);
|
|
void ItemForSale_Action3(ItemForSaleEntity*);
|
|
void sub_08081A5C(ItemForSaleEntity*);
|
|
void sub_080819B4(ItemForSaleEntity*);
|
|
void sub_08081AB0(void);
|
|
|
|
void ItemForSale(ItemForSaleEntity* this) {
|
|
static void (*const ItemForSale_Actions[])(ItemForSaleEntity*) = {
|
|
ItemForSale_Init,
|
|
ItemForSale_Action1,
|
|
ItemForSale_Action2,
|
|
ItemForSale_Action3,
|
|
};
|
|
ItemForSale_Actions[super->action](this);
|
|
if (CheckOnScreen(super)) {
|
|
sub_08080CB4(super);
|
|
}
|
|
switch (super->timer) {
|
|
case 1:
|
|
case 2:
|
|
if (super->action == 1) {
|
|
sub_0800445C(super);
|
|
}
|
|
break;
|
|
case 0:
|
|
case 3:
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ItemForSale_Init(ItemForSaleEntity* this) {
|
|
super->action = 1;
|
|
super->spriteSettings.draw = 1;
|
|
super->spritePriority.b1 = 0;
|
|
super->carryFlags = 0;
|
|
#ifdef EU
|
|
SetDefaultPriority(super, 6);
|
|
#endif
|
|
super->child = super;
|
|
sub_08081A5C(this);
|
|
switch (super->timer) {
|
|
case 0:
|
|
super->hitbox = (Hitbox*)&gUnk_080FD328;
|
|
break;
|
|
case 1:
|
|
super->hitbox = (Hitbox*)&gHitbox_5;
|
|
break;
|
|
}
|
|
}
|
|
|
|
void ItemForSale_Action1(ItemForSaleEntity* this) {
|
|
if (super->subAction != 0) {
|
|
super->action = 2;
|
|
gUnk_0200AF00.unk_2f = 2;
|
|
} else {
|
|
if (super->type == 0x36) {
|
|
if (super->interactType != 0) {
|
|
super->interactType = 0;
|
|
super->action = 3;
|
|
gRoomVars.animFlags = 1;
|
|
gPlayerState.queued_action = 7;
|
|
}
|
|
} else {
|
|
if (super->interactType != 0) {
|
|
super->interactType = 0;
|
|
super->subAction = 1;
|
|
sub_08078B48();
|
|
ResetPlayerItem();
|
|
gPlayerState.heldObject = 4;
|
|
gNewPlayerEntity.unk_74 = super;
|
|
gUnk_0200AF00.unk_2f = 2;
|
|
MessageClose();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ItemForSale_Action2(ItemForSaleEntity* this) {
|
|
void* ptr;
|
|
|
|
gUnk_0200AF00.unk_2f = 2;
|
|
super->spriteSettings.draw = gPlayerEntity.spriteSettings.draw;
|
|
if ((gPlayerState.heldObject == 0) || (super != gNewPlayerEntity.unk_74)) {
|
|
sub_080819B4(this);
|
|
} else {
|
|
ptr = sub_080784E4();
|
|
if (((*(int*)(ptr + 8) == 0) ||
|
|
((*(u8*)(ptr + 1) != 1 || (gUnk_0200AF00.unk_2f = 7, (gPlayerState.field_0x92 & 0x88) == 0)))) &&
|
|
((gPlayerState.field_0x92 & 0x98) != 0)) {
|
|
sub_080819B4(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_080819B4(ItemForSaleEntity* this) {
|
|
Entity* parent;
|
|
u8* puVar2;
|
|
struct_0200AF00* ptr;
|
|
|
|
if (gRoomVars.shopItemType == 0) {
|
|
if (super->parent != NULL) {
|
|
((ModifiedParentEntity*)super->parent)->unk_20[super->subtimer] = 0xff;
|
|
}
|
|
DeleteThisEntity();
|
|
}
|
|
gPlayerState.heldObject = 0;
|
|
gNewPlayerEntity.unk_74 = 0;
|
|
ptr = &gUnk_0200AF00;
|
|
gRoomVars.shopItemType = 0;
|
|
ptr->unk_2c = 0;
|
|
ptr->unk_2f = 0;
|
|
gRoomVars.shopItemType2 = 0;
|
|
super->x.HALF.HI = this->unk_80 + gRoomControls.origin_x;
|
|
super->y.HALF.HI = this->unk_82 + gRoomControls.origin_y;
|
|
super->z.WORD = 0;
|
|
super->action = 1;
|
|
super->subAction = 0;
|
|
super->spriteOrientation.flipY = gPlayerEntity.spriteOrientation.flipY;
|
|
super->collisionLayer = 1;
|
|
super->spritePriority.b0 = 4;
|
|
UpdateSpriteForCollisionLayer(super);
|
|
sub_08081A5C(this);
|
|
}
|
|
|
|
void sub_08081A5C(ItemForSaleEntity* this) {
|
|
u32 tmp = sub_080787D8(super);
|
|
if (super->timer == 1) {
|
|
gUnk_03003DF0.array[tmp].unk_2 = 0;
|
|
}
|
|
}
|
|
|
|
void ItemForSale_Action3(ItemForSaleEntity* this) {
|
|
if (gRoomVars.animFlags == 0) {
|
|
sub_08081AB0();
|
|
DeleteThisEntity();
|
|
} else if (gRoomVars.animFlags == 2) {
|
|
super->action = 1;
|
|
super->subAction = 0;
|
|
sub_08081AB0();
|
|
}
|
|
}
|
|
|
|
void sub_08081AB0(void) {
|
|
gRoomVars.animFlags = 0;
|
|
gRoomVars.shopItemType = 0;
|
|
gRoomVars.shopItemType2 = 0;
|
|
SetPlayerControl(CONTROL_ENABLED);
|
|
}
|