blade brothers decomped

This commit is contained in:
theo3 2020-06-15 15:47:32 -07:00
parent 1888f4d07a
commit 7bb61194f4
9 changed files with 231 additions and 417 deletions

View File

@ -1,372 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_08068CFC
sub_08068CFC: @ 0x08068CFC
push {r4, lr}
adds r4, r1, #0
movs r1, #0
str r1, [r4, #0x14]
ldrb r0, [r0, #0xe]
cmp r0, #0xa
bhi _08068DB6
lsls r0, r0, #2
ldr r1, _08068D14 @ =_08068D18
adds r0, r0, r1
ldr r0, [r0]
mov pc, r0
.align 2, 0
_08068D14: .4byte _08068D18
_08068D18: @ jump table
.4byte _08068DB2 @ case 0
.4byte _08068D44 @ case 1
.4byte _08068D48 @ case 2
.4byte _08068D4C @ case 3
.4byte _08068DB2 @ case 4
.4byte _08068D50 @ case 5
.4byte _08068D58 @ case 6
.4byte _08068D68 @ case 7
.4byte _08068DB2 @ case 8
.4byte _08068DB2 @ case 9
.4byte _08068DA8 @ case 10
_08068D44:
movs r0, #2
b _08068DAA
_08068D48:
movs r0, #0x15
b _08068DAA
_08068D4C:
movs r0, #0x14
b _08068DAA
_08068D50:
movs r0, #3
bl CheckLocalFlag
b _08068DAE
_08068D58:
ldr r0, _08068D64 @ =gUnk_02002A40
adds r0, #0xab
ldrb r0, [r0]
cmp r0, #0x4f
bls _08068DB6
b _08068DB2
.align 2, 0
_08068D64: .4byte gUnk_02002A40
_08068D68:
movs r0, #0x48
bl GetInventoryValue
cmp r0, #0
beq _08068DB6
movs r0, #0x49
bl GetInventoryValue
cmp r0, #0
beq _08068DB6
movs r0, #0x4a
bl GetInventoryValue
cmp r0, #0
beq _08068DB6
movs r0, #0x4b
bl GetInventoryValue
cmp r0, #0
beq _08068DB6
movs r0, #0x4c
bl GetInventoryValue
cmp r0, #0
beq _08068DB6
movs r0, #0x4e
bl GetInventoryValue
cmp r0, #0
beq _08068DB6
movs r0, #0x4f
b _08068DAA
_08068DA8:
movs r0, #0x4d
_08068DAA:
bl GetInventoryValue
_08068DAE:
cmp r0, #0
beq _08068DB6
_08068DB2:
movs r0, #1
str r0, [r4, #0x14]
_08068DB6:
pop {r4, pc}
thumb_func_start sub_08068DB8
sub_08068DB8: @ 0x08068DB8
push {lr}
adds r1, r0, #0
ldr r2, _08068DCC @ =gUnk_08111664
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068DCC: .4byte gUnk_08111664
thumb_func_start sub_08068DD0
sub_08068DD0: @ 0x08068DD0
push {lr}
adds r1, r0, #0
ldr r2, _08068DE4 @ =gUnk_0811167A
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068DE4: .4byte gUnk_0811167A
thumb_func_start sub_08068DE8
sub_08068DE8: @ 0x08068DE8
push {lr}
adds r1, r0, #0
ldr r2, _08068DFC @ =gUnk_08111690
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068DFC: .4byte gUnk_08111690
thumb_func_start sub_08068E00
sub_08068E00: @ 0x08068E00
push {lr}
adds r1, r0, #0
ldr r2, _08068E14 @ =gUnk_081116A6
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068E14: .4byte gUnk_081116A6
thumb_func_start sub_08068E18
sub_08068E18: @ 0x08068E18
push {lr}
adds r1, r0, #0
ldr r2, _08068E2C @ =gUnk_081116BC
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068E2C: .4byte gUnk_081116BC
thumb_func_start sub_08068E30
sub_08068E30: @ 0x08068E30
push {lr}
adds r1, r0, #0
ldr r2, _08068E44 @ =gUnk_081116D2
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068E44: .4byte gUnk_081116D2
thumb_func_start sub_08068E48
sub_08068E48: @ 0x08068E48
push {lr}
adds r1, r0, #0
ldr r2, _08068E5C @ =gUnk_081116E8
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068E5C: .4byte gUnk_081116E8
thumb_func_start sub_08068E60
sub_08068E60: @ 0x08068E60
push {lr}
adds r1, r0, #0
ldr r2, _08068E74 @ =gUnk_081116FE
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068E74: .4byte gUnk_081116FE
thumb_func_start sub_08068E78
sub_08068E78: @ 0x08068E78
push {lr}
adds r1, r0, #0
ldr r2, _08068E8C @ =gUnk_08111714
ldrb r0, [r1, #0xe]
lsls r0, r0, #1
adds r0, r0, r2
ldrh r0, [r0]
bl TextboxNoOverlap
pop {pc}
.align 2, 0
_08068E8C: .4byte gUnk_08111714
thumb_func_start sub_08068E90
sub_08068E90: @ 0x08068E90
ldr r2, _08068EAC @ =gLinkState
adds r2, #0xac
ldr r1, _08068EB0 @ =gUnk_08111740
ldrb r0, [r0, #0xe]
lsls r0, r0, #2
adds r0, r0, r1
ldr r1, [r0]
subs r1, #1
movs r0, #1
lsls r0, r1
ldrh r1, [r2]
orrs r0, r1
strh r0, [r2]
bx lr
.align 2, 0
_08068EAC: .4byte gLinkState
_08068EB0: .4byte gUnk_08111740
thumb_func_start sub_08068EB4
sub_08068EB4: @ 0x08068EB4
ldr r0, _08068EC0 @ =gLinkState
adds r0, #0xab
movs r1, #0
strb r1, [r0]
bx lr
.align 2, 0
_08068EC0: .4byte gLinkState
thumb_func_start sub_08068EC4
sub_08068EC4: @ 0x08068EC4
push {r4, lr}
adds r3, r1, #0
ldr r2, _08068EEC @ =gUnk_08111740
ldrb r4, [r0, #0xe]
lsls r1, r4, #2
adds r1, r1, r2
ldr r0, _08068EF0 @ =gLinkState
adds r0, #0xab
ldr r1, [r1]
ldrb r0, [r0]
cmp r1, r0
bne _08068EF8
ldr r1, _08068EF4 @ =gUnk_0811172A
lsls r0, r4, #1
adds r0, r0, r1
ldrh r0, [r0]
strh r0, [r3, #0x10]
movs r0, #1
b _08068EFA
.align 2, 0
_08068EEC: .4byte gUnk_08111740
_08068EF0: .4byte gLinkState
_08068EF4: .4byte gUnk_0811172A
_08068EF8:
movs r0, #0
_08068EFA:
str r0, [r3, #0x14]
pop {r4, pc}
.align 2, 0
thumb_func_start sub_08068F00
sub_08068F00: @ 0x08068F00
push {lr}
ldrb r0, [r0, #0xe]
cmp r0, #1
bne _08068F0E
ldr r0, _08068F10 @ =gUnk_080F3494
bl LoadRoomEntityList
_08068F0E:
pop {pc}
.align 2, 0
_08068F10: .4byte gUnk_080F3494
thumb_func_start sub_08068F14
sub_08068F14: @ 0x08068F14
push {r4, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xe]
cmp r0, #5
bne _08068F24
movs r0, #0xa0
bl ModHealth
_08068F24:
ldrb r0, [r4, #0xe]
cmp r0, #6
bne _08068F38
movs r0, #0xa0
rsbs r0, r0, #0
bl ModHealth
movs r0, #2
bl ModHealth
_08068F38:
pop {r4, pc}
.align 2, 0
thumb_func_start sub_08068F3C
sub_08068F3C: @ 0x08068F3C
push {lr}
ldrb r0, [r0, #0xe]
cmp r0, #6
bne _08068F4A
movs r0, #0xa0
bl ModHealth
_08068F4A:
pop {pc}
thumb_func_start sub_08068F4C
sub_08068F4C: @ 0x08068F4C
push {r4, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xc]
cmp r0, #0
bne _08068F72
adds r0, #1
strb r0, [r4, #0xc]
ldrb r1, [r4, #0x18]
movs r0, #4
rsbs r0, r0, #0
ands r0, r1
movs r1, #1
orrs r0, r1
strb r0, [r4, #0x18]
adds r0, r4, #0
movs r1, #4
bl InitAnimationForceUpdate
b _08068F78
_08068F72:
adds r0, r4, #0
bl UpdateAnimationSingleFrame
_08068F78:
adds r2, r4, #0
adds r2, #0x5a
ldrb r1, [r2]
movs r0, #1
ands r0, r1
cmp r0, #0
beq _08068F94
movs r0, #0xfe
ands r0, r1
strb r0, [r2]
adds r0, r4, #0
movs r1, #0
bl sub_08068BEC
_08068F94:
pop {r4, pc}
.align 2, 0

0
asmdiff.sh Normal file → Executable file
View File

View File

@ -1,14 +1,5 @@
#ifndef ENTITYDATA_H
#define ENTITYDATA_H
#include "global.h"
typedef struct {
u8 entityType;
u8 field_0x1;
u8 entitySubtype;
u8 entityParameter1;
u32 entityParameter2;
u16 xPos;
u16 yPos;
u32 spritePtr;
} EntityData;
#endif

View File

@ -46,6 +46,10 @@ typedef struct {
u8 unk6;
u8 filler15[75];
u8 unk7;
u32 filler16[7];
u8 filler17[3];
u8 unk71;
u32 unk8;
} LinkState;
typedef struct {

View File

@ -46,6 +46,18 @@ typedef struct {
u32 greatFairyState;
} RoomVars;
//Packets used to store which entities to load in a room
typedef struct {
u8 entityType;
u8 field_0x1;
u8 entitySubtype;
u8 entityParameter1;
u32 entityParameter2;
u16 xPos;
u16 yPos;
u32 spritePtr;
} EntityData;
extern RoomControls gRoomControls;
extern RoomVars gRoomVars;
#endif

View File

@ -511,7 +511,6 @@ SECTIONS {
asm/zeldaFollower.o(.text);
asm/melari.o(.text);
src/bladeBrothers.o(.text);
asm/bladeBrothers.o(.text);
src/cow.o(.text);
asm/goron.o(.text);
asm/goronMerchant.o(.text);

View File

@ -1,7 +1,7 @@
#include "global.h"
#include "entity.h"
#include "link.h"
#include "room.h"
typedef struct {
/*0x00*/ u8 filler[0x2C];
/*0x2C*/ u8 unk;
@ -38,6 +38,13 @@ extern void PositionRelative(Entity*, Entity*, u32, u32);
extern void PlaySFX(u32);
extern u32 GetInventoryValue(u32);
extern void sub_080A7C18(u32, u32, u32);
extern u32 CheckLocalFlag(u32);
extern void TextboxNoOverlap(u32, Entity*);
extern void LoadRoomEntityList();
extern void ModHealth(s32);
extern void InitAnimationForceUpdate(Entity*, u32);
extern void UpdateAnimationSingleFrame(Entity*);
extern void sub_08068BEC(Entity*, u32);
extern void (*gUnk_081115C0[])(Entity*);
extern void (*gUnk_081115D0[])(Entity*);
@ -50,6 +57,19 @@ extern u32* gUnk_081115EC[];
extern struct_02002A40 gUnk_02002A40;
extern u8 gUnk_08111623[];
extern u8 gUnk_0811162B[];
extern u16 gUnk_08111664[];
extern u16 gUnk_0811167A[];
extern u16 gUnk_08111690[];
extern u16 gUnk_081116A6[];
extern u16 gUnk_081116BC[];
extern u16 gUnk_081116D2[];
extern u16 gUnk_081116E8[];
extern u16 gUnk_081116FE[];
extern u16 gUnk_08111714[];
extern u32 gUnk_08111740[];
extern u16 gUnk_0811172A[];
extern u32 gUnk_0300402B;
extern EntityData gUnk_080F3494;
void sub_080689C0(Entity* this) {
@ -213,48 +233,208 @@ void sub_08068C28(Entity* this) {
}
}
void sub_08068C6C(Entity *this)
{
sub_080A7C18(gUnk_0811162B[this->parameter3] & 0xffffff7f,0,0);
void sub_08068C6C(Entity* this) {
sub_080A7C18(gUnk_0811162B[this->parameter3] & 0xffffff7f, 0, 0);
}
void sub_08068C8C(Entity *param_1,Entity *param_2)
{
void sub_08068C8C(Entity* param_1, Entity* param_2) {
u8* arr = gUnk_0811162B + 0xd;
*(u32*)&param_2->animationState = *(u32*)(arr + param_1->parameter3 * 4);
}
void sub_08068CA0(Entity *param_1,Entity *param_2)
void sub_08068CA0(Entity* param_1, Entity* param_2) {
u8 bVar1;
u32 uVar2;
bVar1 = (param_1->entityType).parameter1;
if (bVar1 == 1) {
*(u32*)&param_2->animationState = bVar1;
uVar2 = GetInventoryValue(0x48); // spin attack
if (uVar2 == 0) {
*(u32*)&param_2->animationState = 0;
}
uVar2 = GetInventoryValue(0x4b); // rock breaker
if (uVar2 == 0) {
*(u32*)&param_2->animationState = 0;
}
uVar2 = GetInventoryValue(0x4a); // dash attack
if (uVar2 == 0) {
*(u32*)&param_2->animationState = 0;
}
uVar2 = GetInventoryValue(0x4e); // down thrust
if (uVar2 != 0) {
return;
}
} else {
uVar2 = GetInventoryValue(gUnk_0811162B[param_1->parameter3] & -0x81);
if (uVar2 != 0) {
uVar2 = 1;
}
}
*(u32*)&param_2->animationState = uVar2;
}
void sub_08068CFC(Entity* param_1, Entity* param_2, u32 param_3, u32 param_4)
{
u8 bVar1;
u32 uVar2;
bVar1 = (param_1->entityType).parameter1;
if (bVar1 == 1) {
*(u32 *)&param_2->animationState = bVar1;
uVar2 = GetInventoryValue(0x48); //spin attack
u8 bVar1;
u8 itemID;
u32 uVar2;
*(u32*)&param_2->animationState = 0;
bVar1 = param_1->parameter3;
if (bVar1 > 10)
return;
switch (bVar1) {
case 0:
default:
goto switchD_08068d12_caseD_0;
case 1:
itemID = 0x2;
break;
case 2:
itemID = 0x15;
break;
case 3:
itemID = 0x14;
break;
case 5:
uVar2 = CheckLocalFlag(3);
goto LABEL1;
break;
case 6:
if (gUnk_02002A40.stats.maxHealth < 0x50)
return;
goto switchD_08068d12_caseD_0;
case 7:
uVar2 = GetInventoryValue(0x48); // spin attack
if (uVar2 == 0) {
return;
}
uVar2 = GetInventoryValue(0x49); // roll attack
if (uVar2 == 0) {
return;
}
uVar2 = GetInventoryValue(0x4a); // dash attack
if (uVar2 == 0) {
return;
}
uVar2 = GetInventoryValue(0x4b); // rock breaker
if (uVar2 == 0) {
return;
}
uVar2 = GetInventoryValue(0x4c); // sword beam
if (uVar2 == 0) {
return;
}
uVar2 = GetInventoryValue(0x4e); // down thrust
if (uVar2 == 0) {
return;
}
itemID = 0x4f; // peril beam
break;
case 10:
itemID = 0x4d; // great spin
}
uVar2 = GetInventoryValue(itemID);
LABEL1:
if (uVar2 == 0) {
*(u32 *)&param_2->animationState = 0;
return;
}
uVar2 = GetInventoryValue(0x4b); //rock breaker
if (uVar2 == 0) {
*(u32 *)&param_2->animationState = 0;
switchD_08068d12_caseD_0:
*(u32*)&param_2->animationState = 1;
}
void sub_08068DB8(Entity* this) {
TextboxNoOverlap(gUnk_08111664[this->parameter3], this);
}
void sub_08068DD0(Entity* this) {
TextboxNoOverlap(gUnk_0811167A[this->parameter3], this);
}
void sub_08068DE8(Entity* this) {
TextboxNoOverlap(gUnk_08111690[this->parameter3], this);
}
void sub_08068E00(Entity* this) {
TextboxNoOverlap(gUnk_081116A6[this->parameter3], this);
}
void sub_08068E18(Entity* this) {
TextboxNoOverlap(gUnk_081116BC[this->parameter3], this);
}
void sub_08068E30(Entity* this) {
TextboxNoOverlap(gUnk_081116D2[this->parameter3], this);
}
void sub_08068E48(Entity* this) {
TextboxNoOverlap(gUnk_081116E8[this->parameter3], this);
}
void sub_08068E60(Entity* this) {
TextboxNoOverlap(gUnk_081116FE[this->parameter3], this);
}
void sub_08068E78(Entity* this) {
TextboxNoOverlap(gUnk_08111714[this->parameter3], this);
}
void sub_08068E90(Entity* this) {
LinkState* s = &gLinkState;
*(u16*)&s->unk8 = (1 << (gUnk_08111740[this->parameter3] - 1)) | *(u16*)&s->unk8;
}
void sub_08068EB4(void) {
gLinkState.unk71 = 0;
}
void sub_08068EC4(Entity* param_1, Entity* param_2) {
if (gUnk_08111740[param_1->parameter3] == gLinkState.unk71) {
*(u16*)&param_2->flags = gUnk_0811172A[param_1->parameter3];
*(u32*)&param_2->animationState = 1;
} else {
*(u32*)&param_2->animationState = 0;
}
uVar2 = GetInventoryValue(0x4a); //dash attack
if (uVar2 == 0) {
*(u32 *)&param_2->animationState = 0;
}
void sub_08068F00(Entity* this) {
if (this->parameter3 == 1) {
LoadRoomEntityList(&gUnk_080F3494);
}
uVar2 = GetInventoryValue(0x4e); //down thrust
if (uVar2 != 0) {
return;
}
void sub_08068F14(Entity* this) {
if (this->parameter3 == 5) {
ModHealth(160);
}
}
else {
uVar2 = GetInventoryValue(gUnk_0811162B[param_1->parameter3] & -0x81);
if (uVar2 != 0) {
uVar2 = 1;
if (this->parameter3 == 6) {
ModHealth(-160);
ModHealth(2);
}
}
void sub_08068F3C(Entity* this) {
if (this->parameter3 == 6) {
ModHealth(160);
}
}
void sub_08068F4C(Entity* this) {
if (this->action == 0) {
this->action += 1;
this->spriteSettings.b.ss0 = 0;
this->spriteSettings.b.ss0 = 1;
InitAnimationForceUpdate(this, 4);
} else {
UpdateAnimationSingleFrame(this);
}
if ((this->frames.all & 1) != 0) {
this->frames.all &= 0xfe;
sub_08068BEC(this, 0);
}
}
*(u32*)&param_2->animationState = uVar2;
}

View File

@ -1,6 +1,6 @@
#include "global.h"
#include "entity.h"
#include "entityData.h"
#include "room.h"
extern void sub_080A2CC0();
extern void sub_0806F69C();

View File

@ -1,5 +1,5 @@
#include "global.h"
#include "entityData.h"
#include "room.h"
void extern CreateEntity(EntityData*);