diff options
| author | notyourav <65437533+notyourav@users.noreply.github.com> | 2023-11-30 10:12:36 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-30 10:12:36 -0800 |
| commit | 5d90474ae818740f2aecb568ff489ec324174487 (patch) | |
| tree | 287f2b55275a99bd9f944a3601d2fab422809572 /src | |
| parent | f0bbb7fde0cdfdad5f79b23b0f9498e5e2691a7d (diff) | |
| parent | 0918be7801655f4a1942b296722f0124070c7cf6 (diff) | |
Merge pull request #635 from nonmatch/patch-87
Match Functions
Diffstat (limited to 'src')
| -rw-r--r-- | src/playerUtils.c | 161 |
1 files changed, 155 insertions, 6 deletions
diff --git a/src/playerUtils.c b/src/playerUtils.c index 7eacb048..dc7f0482 100644 --- a/src/playerUtils.c +++ b/src/playerUtils.c @@ -18,6 +18,7 @@ #include "save.h" #include "screen.h" #include "screenTransitions.h" +#include "main.h" static void sub_08077E54(ItemBehavior* beh); @@ -25,7 +26,7 @@ extern void sub_0800857C(Entity*); extern void SetDefaultPriorityForKind(Entity*); extern void sub_0809D738(Entity*); extern s32 Mod(s32, s32); -extern void sub_08003FDE(Entity*, u32, u32, u32); +extern u32 sub_08003FDE(Entity*, Entity*, u32, u32); extern u32 sub_080B1B84(u32, u32); extern void sub_08080BC4(void); void sub_080790E4(Entity* this); @@ -148,6 +149,23 @@ extern u32 sub_08004202(Entity*, u8*, u32); extern u32 gUnk_02022830[]; extern u16* gUnk_0800823C[]; +extern bool32 sub_0806FC24(u32, u32); + +extern const u8 gUnk_0800845C[]; +extern const u8 gUnk_0811BFE0[]; +extern const u8 gUnk_08007DF4[]; +extern const u8 gUnk_080084BC[]; + +u32 sub_0807A180(Entity*, Entity*, u32, u32); + +extern u32 gUsedPalettes; + +extern void ClearBgAnimations(void); +extern void sub_080197D4(const void*); +extern void LoadBgAnimations(u16*); + +void sub_0807BFA8(void); + void UpdateActiveItems(PlayerEntity* this) { u32 index; @@ -1277,7 +1295,53 @@ void FreeCarryEntity(Entity* this) { } } -ASM_FUNC("asm/non_matching/playerUtils/sub_080789A8.inc", u32 sub_080789A8()) +u32 sub_080789A8(void) { + u32 uVar2; + Entity* entity; + u32 uVar4; + const u8* ptr; + const u8* ptr2; + Entity** tmp1; + + if (gCarriedEntity.unk_0) + return (u32)gCarriedEntity.unk_1; + + if (!(gPlayerState.flags & PL_MINISH)) { + uVar4 = sub_080B1B0C(&gPlayerEntity); + if (uVar4 >= 0x10 && (gUnk_080084BC[uVar4 - 0x10] == 0xf)) + return 0; + if (gPlayerState.floor_type == 0x12) + return 0; + + gCarriedEntity.unk_0 = 1; + uVar4 = (u32)gCarriedEntity.count; + + if (uVar4 > 0) { + ptr2 = &gUnk_0811BFE0[gPlayerEntity.animationState & 6]; + while (uVar4 > 0) { + tmp1 = &gCarriedEntity.unk_8 + uVar4; + entity = *tmp1; + if ((entity != NULL) && (sub_0807A180(&gPlayerEntity, entity, ptr2[0], ptr2[1]) != 0)) { + gCarriedEntity.unk_8 = *tmp1; + gCarriedEntity.unk_1 = 2; + return 2; + } + uVar4--; + } + } + + ptr = &gUnk_08007DF4[gPlayerEntity.animationState & 6]; + gCarriedEntity.unk_4 = uVar2 = sub_080B1A0C(&gPlayerEntity, (s8)ptr[0], (s8)ptr[1]); + + if (!sub_0806FC24(uVar2, 6)) + return 0; + + } else + return 0; + + gCarriedEntity.unk_1 = 1; + return 1; +} void SetPlayerControl(PlayerControlMode mode) { if (gPlayerState.controlMode != CONTROL_DISABLED) { @@ -2380,11 +2444,11 @@ bool32 HasSwordEquipped(void) { } } -void sub_0807A180(Entity* param_1, u32 param_2, u32 param_3, u32 param_4) { +u32 sub_0807A180(Entity* param_1, Entity* param_2, u32 param_3, u32 param_4) { GenericEntity stackEntity; PositionRelative(param_1, &stackEntity.base, 0, -0x40000); stackEntity.base.animationState = param_1->animationState; - sub_08003FDE(&stackEntity.base, param_2, param_3, param_4); + return sub_08003FDE(&stackEntity.base, param_2, param_3, param_4); } void UpdateFloorType(void) { @@ -3520,7 +3584,54 @@ void sub_0807BFA8(void) { gRoomControls.height = (gArea.pCurrentRoomInfo)->pixel_height; } -ASM_FUNC("asm/non_matching/playerUtils/sub_0807BFD0.inc", void sub_0807BFD0()) +void sub_0807BFD0(void) { + s32 index; + u16* puVar2; + u16* puVar3; + u16* ptr; + typeof(gMapTop)* newptr; + + ClearBgAnimations(); + sub_0807BFA8(); + MemFill16(0xffff, gMapBottom.metatileTypes, 0x1000); + gMapBottom.metatileTypes[0] = 0; + MemFill16(0xffff, gMapTop.metatileTypes, 0x1000); + gMapTop.metatileTypes[0] = 0; + + if ((void*)gRoomControls.unk_34 != (gArea.pCurrentRoomInfo)->tileset) { + gRoomControls.unk_34 = (u32)(gArea.pCurrentRoomInfo)->tileset; + sub_080197D4((gArea.pCurrentRoomInfo)->tileset); + } + + sub_080197D4((gArea.pCurrentRoomInfo)->metatiles); + ptr = gPaletteBuffer; + MemCopy(&ptr[0x30], &ptr[0x150], 0x20); + gUsedPalettes |= 0x200000; + + if ((gArea.pCurrentRoomInfo)->bg_anim != NULL) { + LoadBgAnimations((gArea.pCurrentRoomInfo)->bg_anim); + } + + puVar2 = gMapBottom.metatileTypes; + puVar3 = gMapBottom.unkData2; + MemFill16(0xffff, puVar3, 0x1000); + + for (index = 0; index < 0x800; index++, puVar2++) { + if ((*puVar2 < 0x800) && (puVar3[*puVar2] == 0xffff)) { + puVar3[*puVar2] = index; + } + } + + puVar2 = gMapTop.metatileTypes; + puVar3 = gMapTop.unkData2; + MemFill16(0xffff, puVar3, 0x1000); + + for (index = 0; index < 0x800; index++, puVar2++) { + if ((*puVar2 < 0x800) && (puVar3[*puVar2] == 0xffff)) { + puVar3[*puVar2] = index; + } + } +} void LoadRoomGfx(void) { RoomControls* roomControls; @@ -3888,7 +3999,45 @@ void sub_0807C898(void) { gRoomTransition.field2d = 0; } -ASM_FUNC("asm/non_matching/playerUtils/sub_0807C8B0.inc", void sub_0807C8B0(u16* a, u32 b, u32 c)) +void sub_0807C8B0(u16* data, u32 width, u32 height) { + u16* dst_ptr; + u16* src_ptr; + u16* dst_ptr_cpy; + u16* src_ptr_cpy; + u32 innerIndex; + u32 index; + u16* prev_line; + u32 diff; + + src_ptr = data + width * height - 1; + dst_ptr = data + (height - 1) * 0x40 + (width - 1); + + for (index = 0; index < height; index++) { + src_ptr_cpy = src_ptr; //[index * -width]; + dst_ptr_cpy = dst_ptr; //[index * -0x40]; + for (innerIndex = 0; innerIndex < width; innerIndex++) { + dst_ptr_cpy[-innerIndex] = src_ptr_cpy[-innerIndex]; + } + dst_ptr -= 0x40; + src_ptr -= width; + } + + diff = 0x40 - width; + for (index = 0; index < 0x40; index++) { + dst_ptr = data + width - index * -0x40; + + for (innerIndex = 0; innerIndex < diff; innerIndex++) { + dst_ptr[innerIndex] = 0; + } + } + + diff = 0x40 - height; + dst_ptr = data + height * 0x40; + for (index = 0; index < diff; index++) { + MemClear(&dst_ptr[index * 0x40], 0x80); + // dst_ptr += 0x40; + } +} void LoadCompressedMapData(void* dest, u32 offset) { void* src; |
