mirror of
https://github.com/zeldaret/tmc
synced 2026-07-09 23:01:43 -04:00
Merge pull request #349 from hatal175/gustjar
Decompile the rest of itemGustJar
This commit is contained in:
+153
-5
@@ -3,14 +3,31 @@
|
||||
#include "item.h"
|
||||
#include "functions.h"
|
||||
|
||||
extern void (*const gUnk_0811BDF4[])(ItemBehavior* beh, u32);
|
||||
void (*const ItemGustJar_StateFunctions[])(ItemBehavior* beh, u32);
|
||||
extern u32 sub_0807A894(Entity*);
|
||||
extern void UpdatePlayerMovement(void);
|
||||
|
||||
void ItemGustJar(ItemBehavior* this, u32 arg1) {
|
||||
gPlayerState.framestate = PL_STATE_GUSTJAR;
|
||||
gUnk_0811BDF4[this->stateID](this, arg1);
|
||||
ItemGustJar_StateFunctions[this->stateID](this, arg1);
|
||||
}
|
||||
|
||||
ASM_FUNC("asm/non_matching/itemGustJar/sub_08076DF4.inc", void sub_08076DF4(ItemBehavior* this, u32 arg1))
|
||||
void sub_08076DF4(ItemBehavior* this, u32 arg1) {
|
||||
if (sub_0807A894(&gPlayerEntity) != 0x29 && gPlayerState.floor_type != SURFACE_DOOR &&
|
||||
gPlayerState.floor_type != SURFACE_DOOR_13 && gPlayerState.jump_status == 0) {
|
||||
sub_08077D38(this, arg1);
|
||||
this->field_0x5[2] = 0;
|
||||
this->field_0x5[5] = gPlayerEntity.animationState;
|
||||
this->field_0x5[4] |= 0x80;
|
||||
this->field_0x5[4]++;
|
||||
gPlayerState.field_0x1d = 1;
|
||||
*(u32*)&gPlayerEntity.field_0x74 = 0;
|
||||
gPlayerState.field_0x1c = 1;
|
||||
sub_08077BB8(this);
|
||||
} else {
|
||||
sub_08077E78(this, arg1);
|
||||
}
|
||||
}
|
||||
|
||||
void sub_08076E60(ItemBehavior* this, u32 arg1) {
|
||||
Entity* playerItem;
|
||||
@@ -31,6 +48,137 @@ void sub_08076E60(ItemBehavior* this, u32 arg1) {
|
||||
}
|
||||
}
|
||||
|
||||
ASM_FUNC("asm/non_matching/itemGustJar/sub_08076EC8.inc", void sub_08076EC8(ItemBehavior* this, u32 arg1))
|
||||
void sub_08076EC8(ItemBehavior* this, u32 arg1) {
|
||||
if ((gPlayerState.field_0x1c & 0xf) == 0) {
|
||||
sub_08077E78(this, arg1);
|
||||
return;
|
||||
}
|
||||
|
||||
ASM_FUNC("asm/non_matching/itemGustJar/sub_08076F64.inc", void sub_08076F64(ItemBehavior* this, u32 arg1))
|
||||
if (sub_08077EFC(this)) {
|
||||
u32 val;
|
||||
if (this->field_0x5[2] > 0xef) {
|
||||
gPlayerState.field_0x1d = 3;
|
||||
} else if (++this->field_0x5[2] > 0x77) {
|
||||
gPlayerState.field_0x1d = 2;
|
||||
} else {
|
||||
gPlayerState.field_0x1d = 1;
|
||||
}
|
||||
|
||||
if (gPlayerEntity.subAction == 0x1b) {
|
||||
val = 0x524;
|
||||
} else {
|
||||
if (gPlayerState.field_0xd & 0x80) {
|
||||
val = 0x504;
|
||||
} else {
|
||||
val = 0x518;
|
||||
}
|
||||
}
|
||||
|
||||
if (val != *(u16*)&this->field_0x10) {
|
||||
sub_08077DF4(this, val);
|
||||
} else {
|
||||
UpdateItemAnim(this);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
this->stateID++;
|
||||
gPlayerState.field_0xa |= 8 >> arg1;
|
||||
}
|
||||
|
||||
void sub_08076F64(ItemBehavior* this, u32 arg1) {
|
||||
Entity* item;
|
||||
Entity* player;
|
||||
switch (gPlayerState.field_0x1c & 0xf) {
|
||||
case 5:
|
||||
if (this->field_0x5[9] & 0x80) {
|
||||
if (this->field_0x5[3]) {
|
||||
this->field_0x5[3] = 0;
|
||||
this->field_0x5[2] = 0;
|
||||
gPlayerState.field_0x1d = 1;
|
||||
player = &gPlayerEntity;
|
||||
*(u32*)&player->field_0x74 = 0;
|
||||
gPlayerState.field_0x1c = 1;
|
||||
gPlayerState.field_0xa &= ~(8 >> arg1);
|
||||
this->stateID = 2;
|
||||
sub_08077DF4(this, 0x504);
|
||||
item = CreatePlayerItem(0x10, 0, 0, 0);
|
||||
if (item) {
|
||||
item->parent = player;
|
||||
}
|
||||
return;
|
||||
} else {
|
||||
gPlayerState.field_0x1c = 6;
|
||||
sub_08077DF4(this, 0x510);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (sub_08077EFC(this)) {
|
||||
this->field_0x5[3] = 1;
|
||||
}
|
||||
|
||||
UpdateItemAnim(this);
|
||||
if ((gPlayerState.flags & PL_FLAGS2))
|
||||
return;
|
||||
gPlayerEntity.direction =
|
||||
DirectionTurnAround(Direction8FromAnimationState(gPlayerEntity.animationState));
|
||||
gPlayerEntity.speed = 0x80;
|
||||
UpdatePlayerMovement();
|
||||
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
gPlayerState.field_0x1c = 4;
|
||||
case 4:
|
||||
if (sub_08077EFC(this)) {
|
||||
this->field_0x5[3] = 1;
|
||||
}
|
||||
|
||||
UpdateItemAnim(this);
|
||||
if (this->field_0x5[9] & 1) {
|
||||
gPlayerState.field_0x1c = 5;
|
||||
gPlayerEntity.field_0x70.WORD = 0;
|
||||
if (gPlayerState.field_0x1d) {
|
||||
CreatePlayerItem(0x11, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
if (gPlayerState.flags & PL_FLAGS2)
|
||||
return;
|
||||
gPlayerEntity.direction = DirectionTurnAround(Direction8FromAnimationState(gPlayerEntity.animationState));
|
||||
gPlayerEntity.speed = 0x80;
|
||||
UpdatePlayerMovement();
|
||||
break;
|
||||
case 6:
|
||||
UpdateItemAnim(this);
|
||||
if ((this->field_0x5[9] & 0x80) == 0)
|
||||
return;
|
||||
goto case0;
|
||||
break;
|
||||
case 7:
|
||||
sub_08077DF4(this, 0x514);
|
||||
gPlayerState.field_0x1c = 3;
|
||||
gPlayerState.field_0x1d = 0;
|
||||
break;
|
||||
case 1:
|
||||
case 2:
|
||||
default:
|
||||
gPlayerState.field_0x1c = 3;
|
||||
sub_08077DF4(this, 0x514);
|
||||
break;
|
||||
case 0:
|
||||
case0:
|
||||
gPlayerState.field_0x1c = 0;
|
||||
gPlayerEntity.field_0x70.WORD = 0;
|
||||
sub_08077E78(this, arg1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void (*const ItemGustJar_StateFunctions[])(ItemBehavior* beh, u32) = {
|
||||
sub_08076DF4,
|
||||
sub_08076E60,
|
||||
sub_08076EC8,
|
||||
sub_08076F64,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user