diff --git a/asm/bladeBrothers.s b/asm/bladeBrothers.s deleted file mode 100644 index 449120eb..00000000 --- a/asm/bladeBrothers.s +++ /dev/null @@ -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 diff --git a/asmdiff.sh b/asmdiff.sh old mode 100644 new mode 100755 diff --git a/include/entityData.h b/include/entityData.h index 6bf62edd..8ba88a5a 100644 --- a/include/entityData.h +++ b/include/entityData.h @@ -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 \ No newline at end of file diff --git a/include/link.h b/include/link.h index 4f85e340..5ca18299 100644 --- a/include/link.h +++ b/include/link.h @@ -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 { diff --git a/include/room.h b/include/room.h index 669b1f5a..27ed82a7 100644 --- a/include/room.h +++ b/include/room.h @@ -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 \ No newline at end of file diff --git a/linker.ld b/linker.ld index e6d6d60c..3cdd89ef 100644 --- a/linker.ld +++ b/linker.ld @@ -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); diff --git a/src/bladeBrothers.c b/src/bladeBrothers.c index dcc807b5..4358c488 100644 --- a/src/bladeBrothers.c +++ b/src/bladeBrothers.c @@ -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*)¶m_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*)¶m_2->animationState = bVar1; + uVar2 = GetInventoryValue(0x48); // spin attack + if (uVar2 == 0) { + *(u32*)¶m_2->animationState = 0; + } + uVar2 = GetInventoryValue(0x4b); // rock breaker + if (uVar2 == 0) { + *(u32*)¶m_2->animationState = 0; + } + uVar2 = GetInventoryValue(0x4a); // dash attack + if (uVar2 == 0) { + *(u32*)¶m_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*)¶m_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 *)¶m_2->animationState = bVar1; - uVar2 = GetInventoryValue(0x48); //spin attack + u8 bVar1; + u8 itemID; + u32 uVar2; + + *(u32*)¶m_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 *)¶m_2->animationState = 0; + return; } - uVar2 = GetInventoryValue(0x4b); //rock breaker - if (uVar2 == 0) { - *(u32 *)¶m_2->animationState = 0; +switchD_08068d12_caseD_0: + *(u32*)¶m_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*)¶m_2->flags = gUnk_0811172A[param_1->parameter3]; + *(u32*)¶m_2->animationState = 1; + } else { + *(u32*)¶m_2->animationState = 0; } - uVar2 = GetInventoryValue(0x4a); //dash attack - if (uVar2 == 0) { - *(u32 *)¶m_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*)¶m_2->animationState = uVar2; } \ No newline at end of file diff --git a/src/bladeTrap.c b/src/bladeTrap.c index 38ffd0f5..e04081a5 100644 --- a/src/bladeTrap.c +++ b/src/bladeTrap.c @@ -1,6 +1,6 @@ #include "global.h" #include "entity.h" -#include "entityData.h" +#include "room.h" extern void sub_080A2CC0(); extern void sub_0806F69C(); diff --git a/src/loadRoomEntityList.c b/src/loadRoomEntityList.c index 0937e9c8..92373c4d 100644 --- a/src/loadRoomEntityList.c +++ b/src/loadRoomEntityList.c @@ -1,5 +1,5 @@ #include "global.h" -#include "entityData.h" +#include "room.h" void extern CreateEntity(EntityData*);