Match several scroll functions

This commit is contained in:
Tal Hayon
2022-04-16 23:02:11 +03:00
parent 7a3ca3499c
commit 33b0d7de97
8 changed files with 104 additions and 238 deletions
+103 -4
View File
@@ -51,6 +51,8 @@ u32 sub_08080278();
void sub_08080C80(u32*);
void sub_08080368();
void sub_08080B60(u8*);
bool32 sub_08080794(const Transition* transition, u32 param_2, u32 param_3, u32 param_4);
bool32 sub_08080808(const Transition* transition, u32 param_2, u32 param_3, u32 param_4);
extern u8 gMapDataTopSpecial[];
@@ -357,13 +359,110 @@ void ClearTilemaps(void) {
MemClear(&gMapDataTopSpecial, 0x8000);
}
ASM_FUNC("asm/non_matching/scroll/sub_080806BC.inc", bool32 sub_080806BC(u32 a, u32 b, u32 c, u32 d))
bool32 sub_080806BC(u32 param_1, u32 param_2, u32 param_3, u32 param_4) {
static bool32 (*const gUnk_0811E7AC[])(const Transition*, u32, u32, u32) = {
sub_08080794,
sub_08080808,
sub_08080794,
sub_08080808,
};
u32 uVar1;
int iVar2;
const Transition* puVar3;
ASM_FUNC("asm/non_matching/scroll/sub_08080734.inc", void sub_08080734())
puVar3 = (gArea.pCurrentRoomInfo->exits);
while (*(u16*)puVar3 != 0xffff) {
u32 uVar3 = *(u16*)puVar3;
if ((((1 << uVar3) & param_4) != 0) && (gUnk_0811E7AC[uVar3](puVar3, param_1, param_2, param_3))) {
DoExitTransition((const ScreenTransitionData*)puVar3);
return 1;
}
puVar3++;
}
return 0;
}
ASM_FUNC("asm/non_matching/scroll/sub_08080794.inc", void sub_08080794())
const Transition* sub_08080734(u32 param_1, u32 param_2) {
u32 warpType;
int iVar2;
u32 uVar4;
const Transition* puVar3;
ASM_FUNC("asm/non_matching/scroll/sub_08080808.inc", void sub_08080808())
puVar3 = (gArea.pCurrentRoomInfo->exits);
uVar4 = 10;
while (*(u16*)puVar3 != 0xffff) {
if ((((1 << *(u16*)puVar3) & uVar4) != 0) && (sub_08080808(puVar3, param_1, param_2, 0))) {
return puVar3;
}
puVar3++;
}
return NULL;
}
bool32 sub_08080794(const Transition* transition, u32 param_2, u32 param_3, u32 param_4) {
u32 bVar1;
switch (param_4) {
default:
return 0;
case 0:
if (gRoomControls.width >> 1 < param_2) {
bVar1 = 2;
} else {
bVar1 = 1;
}
break;
case 1:
if (gRoomControls.height >> 1 < param_3) {
bVar1 = 8;
} else {
bVar1 = 4;
}
break;
case 2:
if (gRoomControls.width >> 1 < param_2) {
bVar1 = 0x20;
} else {
bVar1 = 0x10;
}
break;
case 3:
if (gRoomControls.height >> 1 < param_3) {
bVar1 = 0x80;
} else {
bVar1 = 0x40;
}
break;
}
if ((transition->shape & bVar1) != 0) {
return 1;
}
return 0;
}
bool32 sub_08080808(const Transition* param_1, u32 param_2, u32 param_3, u32 param_4) {
static const u8 gUnk_0811E7BC[] = { 6, 6, 6, 14, 14, 6, 22, 6 };
const u8* ptr;
u32 temp;
u32 temp2;
u32 temp3;
u32 temp4;
ptr = &gUnk_0811E7BC[param_1->shape * 2];
temp = ptr[0];
temp2 = param_2 - param_1->startX;
if ((temp2 + temp <= ptr[0] * 2)) {
temp3 = ptr[1];
temp4 = param_3 - param_1->startY;
if (temp4 + temp3 <= ptr[1] * 2) {
return TRUE;
} else {
return FALSE;
}
} else {
return FALSE;
}
}
void DoExitTransition(const ScreenTransitionData* data) {
PlayerRoomStatus* status;