This commit is contained in:
theo3 2020-07-16 21:03:49 -07:00
parent 2527f9c188
commit 29fd48cc22
8 changed files with 136 additions and 252 deletions

View File

@ -6,145 +6,6 @@
.text
thumb_func_start PacciCane
PacciCane: @ 0x08076C80
push {lr}
ldr r3, _08076C94 @ =gUnk_0811BDE0
ldrb r2, [r0, #4]
lsls r2, r2, #2
adds r2, r2, r3
ldr r2, [r2]
bl _call_via_r2
pop {pc}
.align 2, 0
_08076C94: .4byte gUnk_0811BDE0
thumb_func_start sub_08076C98
sub_08076C98: @ 0x08076C98
push {r4, lr}
adds r4, r0, #0
ldrb r2, [r4, #9]
movs r0, #0xf
orrs r0, r2
strb r0, [r4, #9]
adds r0, r4, #0
bl sub_08077D38
ldr r0, _08076CB8 @ =gLinkEntity
bl sub_0806F948
adds r0, r4, #0
bl sub_08077BB8
pop {r4, pc}
.align 2, 0
_08076CB8: .4byte gLinkEntity
thumb_func_start sub_08076CBC
sub_08076CBC: @ 0x08076CBC
push {r4, lr}
adds r4, r0, #0
ldrb r2, [r4, #0xe]
movs r0, #0x80
ands r0, r2
cmp r0, #0
beq _08076CD2
adds r0, r4, #0
bl sub_08077E78
b _08076CE8
_08076CD2:
movs r0, #0x40
ands r0, r2
cmp r0, #0
beq _08076CE2
adds r0, r4, #0
movs r1, #0x12
bl CreatePlayerBomb
_08076CE2:
adds r0, r4, #0
bl UpdateItemAnim
_08076CE8:
pop {r4, pc}
.align 2, 0
thumb_func_start Shield
Shield: @ 0x08076CEC
push {lr}
ldr r3, _08076D00 @ =gUnk_0811BDE8
ldrb r2, [r0, #4]
lsls r2, r2, #2
adds r2, r2, r3
ldr r2, [r2]
bl _call_via_r2
pop {pc}
.align 2, 0
_08076D00: .4byte gUnk_0811BDE8
thumb_func_start sub_08076D04
sub_08076D04: @ 0x08076D04
push {r4, r5, lr}
adds r4, r0, #0
adds r5, r1, #0
ldr r1, _08076D2C @ =gLinkState
movs r0, #0x81
strb r0, [r1, #3]
movs r0, #2
strb r0, [r4, #9]
ldr r0, _08076D30 @ =gLinkEntity
bl sub_0806F948
adds r0, r4, #0
adds r1, r5, #0
bl sub_08077D38
adds r0, r4, #0
bl sub_08077BB8
pop {r4, r5, pc}
.align 2, 0
_08076D2C: .4byte gLinkState
_08076D30: .4byte gLinkEntity
thumb_func_start sub_08076D34
sub_08076D34: @ 0x08076D34
push {r4, r5, r6, lr}
adds r4, r0, #0
adds r6, r1, #0
bl sub_08077EFC
adds r1, r0, #0
cmp r1, #0
beq _08076D80
ldr r5, _08076D78 @ =gLinkState
ldrb r0, [r5, #3]
movs r1, #1
orrs r1, r0
strb r1, [r5, #3]
adds r0, r4, #0
bl UpdateItemAnim
ldrb r0, [r4, #0xe]
cmp r0, #0
beq _08076D8C
ldrb r0, [r4, #4]
adds r0, #1
strb r0, [r4, #4]
movs r0, #0
strb r0, [r4, #0xf]
movs r1, #8
asrs r1, r6
ldrb r0, [r5, #0xa]
bics r0, r1
strb r0, [r5, #0xa]
ldr r0, _08076D7C @ =0x0000015D
bl PlaySFX
b _08076D8C
.align 2, 0
_08076D78: .4byte gLinkState
_08076D7C: .4byte 0x0000015D
_08076D80:
ldr r0, _08076D90 @ =gLinkState
strb r1, [r0, #3]
adds r0, r4, #0
adds r1, r6, #0
bl sub_08077E78
_08076D8C:
pop {r4, r5, r6, pc}
.align 2, 0
_08076D90: .4byte gLinkState
thumb_func_start sub_08076D94
sub_08076D94: @ 0x08076D94
push {r4, r5, lr}

View File

@ -19,20 +19,6 @@ extern void sub_080045D4();
extern void sub_0806F69C();
extern u32 Random();
enum {
BEHAVIORS,
WINGS,
WAKE,
MINI,
MINIAFFINE,
DROPLET,
RIPPLE,
BIGRIPPLE,
FORM8,
FORM9,
};
extern void (*const GreatFairy_Main[])(Entity*);
extern void (*const GreatFairy_Behaviors[])(Entity*);
extern void (*const GreatFairy_WingsBehaviors[])(Entity*);

View File

@ -82,6 +82,7 @@ typedef struct {
/*0x2*/ u8 field_0x2[2];
/*0x4*/ u8 stateID;
/*0x5*/ u8 field_0x5[10];
/*0xf*/ u8 field_0xf;
} ItemBehavior;
extern u8 gBombBagSizes[];

View File

@ -641,6 +641,7 @@ SECTIONS {
asm/stairsInteract.o(.text);
asm/code_080732D0.o(.text);
asm/ocarina.o(.text);
src/item.o(.text);
asm/code_08076C80.o(.text);
asm/respawnLink.o(.text);
src/code_08077B98.o(.text);

View File

@ -38,3 +38,104 @@ void (*const gItemFunctions[])(ItemBehavior*, u32) = {
JarEmpty,
JarEmpty,
};
extern void sub_08077E78(ItemBehavior*, u32);
extern void PlaySFX(u32);
extern void sub_08078F60(void);
extern void sub_08077D38(ItemBehavior*, u32);
extern void sub_0805E544(void);
extern void UpdateItemAnim(ItemBehavior*);
extern void CreateBird(void);
extern void UnfreezeTime(void);
extern void sub_0806F948(Entity*);
extern void sub_08077BB8(ItemBehavior*);
extern void CreatePlayerBomb(ItemBehavior*, u32);
extern u32 sub_08077EFC();
extern void (*const gUnk_0811BDE0[])(ItemBehavior* beh, u32);
extern void (*const gUnk_0811BDE8[])(ItemBehavior* beh, u32);
extern void (*const gOcarinaStates[4])(ItemBehavior*, u32);
extern u8 gUnk_02034490;
#if 0
void Ocarina(ItemBehavior* beh, u32 inputFlags) {
gOcarinaStates[beh->stateID](beh, inputFlags);
gLinkEntity.field_0x7a++;
}
void OcarinaUse(ItemBehavior *beh, u32 arg1)
{
u32 bVar1;
if (gLinkState.linkAction == 0x18) {
LinkChangeState(beh, arg1);
}
else {
beh->field_0x5[4] = beh->field_0x5[4] | 0xf;
gLinkEntity.animationState = 4;
gLinkEntity.spriteSettings.b.flipX = 0;
gLinkEntity.flags &= 0x7f;
gLinkEntity.field_0x7a = 2;
gLinkState.flags.all |= 0x10000000;
gLinkState.field_0x27[0] = 0xff;
gUnk_02034490 = 1;
bVar1 = (8 >> arg1);
gLinkState.field_0xa |= bVar1;
gLinkState.keepFacing |= bVar1;
sub_08078F60();
sub_08077D38(beh, arg1);
PlaySFX(0x216);
sub_0805E544();
}
}
#endif
void PacciCane(ItemBehavior* beh, u32 arg1) {
gUnk_0811BDE0[beh->stateID](beh, arg1);
}
void sub_08076C98(ItemBehavior* beh, u32 arg1) {
beh->field_0x5[4] |= 0xf;
sub_08077D38(beh, arg1);
sub_0806F948(&gLinkEntity);
sub_08077BB8(beh);
}
void sub_08076CBC(ItemBehavior* beh, u32 arg1) {
if ((beh->field_0x5[9] & 0x80) != 0) {
sub_08077E78(beh, arg1);
} else {
if ((beh->field_0x5[9] & 0x40) != 0) {
CreatePlayerBomb(beh, 0x12);
}
UpdateItemAnim(beh);
}
}
void Shield(ItemBehavior* beh, u32 arg1) {
gUnk_0811BDE8[beh->stateID](beh, arg1);
}
void sub_08076D04(ItemBehavior* beh, u32 arg1) {
gLinkState.field_0x3[0] = 0x81;
beh->field_0x5[4] = 2;
sub_0806F948(&gLinkEntity);
sub_08077D38(beh, arg1);
sub_08077BB8(beh);
}
void sub_08076D34(ItemBehavior* beh, u32 arg1) {
if (sub_08077EFC() != 0) {
gLinkState.field_0x3[0] |= 1;
UpdateItemAnim(beh);
if (beh->field_0x5[9] != 0) {
beh->stateID++;
beh->field_0xf = 0;
gLinkState.field_0xa &= ~(u8)(8 >> arg1);
PlaySFX(0x15d);
}
} else {
gLinkState.field_0x3[0] = 0;
sub_08077E78(beh, arg1);
}
}

View File

@ -183,7 +183,7 @@ void sub_080691E0(Entity* ent) {
}
// Show dialogue
void sub_080691F8(Entity* ent) {
void Cow_ShowDialogue(Entity* ent) {
u32 var0 = ent->entityType.form;
u32* var1 = gUnk_08111938 + (var0 * 2);
ShowNPCDialogue(ent, var1);
@ -215,10 +215,10 @@ void sub_0806924C(Entity* ent) {
ent->action = 4;
sub_0806F118(ent);
} else {
sub_080691F8(ent);
Cow_ShowDialogue(ent);
}
} else {
sub_080691F8(ent);
Cow_ShowDialogue(ent);
sub_080791D0();
}
PlaySFX(212);

View File

@ -4,6 +4,19 @@
#include "screen.h"
#include "greatFairy.h"
enum {
BEHAVIORS,
WINGS,
WAKE,
MINI,
MINIAFFINE,
DROPLET,
RIPPLE,
BIGRIPPLE,
FORM8,
FORM9,
};
// Main
void GreatFairy(Entity* this) {
u8 bVar1;
@ -36,7 +49,6 @@ void GreatFairy_Init(Entity* this) {
this->cutsceneBeh.HWORD = 290;
}
// TODO: turn this into a switch statement
void GreatFairy_DormantUpdate(Entity* this) {
u16* pFrame; // r1@2
s32 frame; // r1@4
@ -48,47 +60,24 @@ void GreatFairy_DormantUpdate(Entity* this) {
if (*pFrame != 0) {
--*pFrame;
}
frame = *pFrame;
if (frame == 0x96) {
goto LABEL_16;
}
if (frame < 0x97) {
if (frame != 0) {
if (frame == 0x82) {
goto LABEL_16;
} else {
return;
}
}
goto LABEL_17;
} else {
if (frame == 0xd2) {
goto LABEL_16;
}
if (frame < 0xd3) {
if (frame == 0xaa) {
goto LABEL_16;
} else
return;
}
if (frame == 289) {
goto LABEL_16;
} else {
return;
}
}
LABEL_17:
this->action = 2;
return;
LABEL_16:
ripple = GreatFairy_CreateForm(this, RIPPLE, 0);
if (ripple) {
PositionRelative(this, ripple, (s32)GreatFairy_RippleOffsets[this->actionDelay] << 16,
switch (*pFrame) {
case 0x96:
case 0x82:
goto e;
case 0x0:
this->action = 2;
break;
e:
case 0xd2:
case 0xaa:
case 0x121:
ripple = GreatFairy_CreateForm(this, RIPPLE, 0);
if (ripple) {
PositionRelative(this, ripple, (s32)GreatFairy_RippleOffsets[this->actionDelay] << 16,
(s32)GreatFairy_RippleOffsets[this->actionDelay + 1] << 16);
this->actionDelay += 2;
this->actionDelay += 2;
break;
}
}
}

View File

@ -1,55 +0,0 @@
#include "global.h"
#include "item.h"
#include "entity.h"
#include "link.h"
extern void _call_via_r2();
extern void sub_08077E78(ItemBehavior*, u32);
extern void PlaySFX(u32);
extern void sub_08078F60(void);
extern void sub_08077D38(ItemBehavior*, u32);
extern void sub_0805E544(void);
extern void UpdateItemAnim(ItemBehavior*);
extern void CreateBird(void);
extern void UnfreezeTime(void);
extern Entity gLinkEntity;
extern LinkState gLinkState;
extern void (*gOcarinaStates[4])(ItemBehavior*, u32);
extern u8 gUnk_02034490;
void Ocarina(ItemBehavior* pItemBeh, u32 inputFlags)
{
// u32 *ocarinaStates = &gOcarinaStates;
//_call_via_r2(pItemBeh, inputFlags,(ocarinaStates)[pItemBeh->stateID]);
gOcarinaStates[pItemBeh->stateID](pItemBeh, inputFlags);
gLinkEntity.field_0x7a = gLinkEntity.field_0x7a + 1;
}
void OcarinaUse(ItemBehavior* itemBeh, s32 inputFlags) {
u32 bVar1;
u32 var;
if (gLinkState.linkAction == 24) {
sub_08077E78(itemBeh, inputFlags);
} else {
itemBeh->field_0x5[4] |= 15;
gLinkEntity.animationState = 4;
var = gLinkEntity.spriteSettings.raw & ~0x40;
gLinkEntity.spriteSettings.raw &= var;
gLinkEntity.flags &= 127;
gLinkEntity.field_0x7a = 2;
gLinkState.flags.all |= 0x10000000;
gLinkState.field_0x27[0] = 255;
gUnk_02034490 = 1;
bVar1 = (8 >> inputFlags);
gLinkState.field_0xa |= bVar1;
gLinkState.keepFacing |= bVar1;
sub_08078F60();
sub_08077D38(itemBeh, inputFlags);
PlaySFX(534);
sub_0805E544();
}
}