more transition function cleanup

This commit is contained in:
Henny022p 2025-03-03 16:15:20 +00:00
parent b5eab6fc2b
commit b19f86852b
10 changed files with 81 additions and 80 deletions

View File

@ -91,8 +91,8 @@ extern void InitPlayerMacro(PlayerMacroEntry*);
extern u32* sub_0805F25C(u32);
extern void sub_0805F8E4(u32 r0, WStruct* r1);
extern void sub_0806D0B0(Entity*);
extern bool32 sub_080806BC(u32, u32, u32, u32);
extern void sub_0808091C(const Transition* screenTransition, u32 transitionType);
extern bool32 DoApplicableTransition(u32, u32, u32, u32);
extern void DoExitTransitionWithType(const Transition* screenTransition, u32 transitionType);
extern void sub_080809D4(void);
extern void sub_08080CB4(Entity*);
extern u32 sub_0808288C(Entity*, u32, u32, u32);

View File

@ -7,8 +7,8 @@
typedef enum {
WARP_TYPE_BORDER,
WARP_TYPE_AREA,
WARP_TYPE_UNK2,
WARP_TYPE_UNK3,
WARP_TYPE_BORDER2,
WARP_TYPE_AREA2,
WARP_TYPE_END_OF_LIST = 0xffff,
} WarpType;

View File

@ -63,7 +63,7 @@ extern void sub_0804B388(u32 a1, u32 a2);
extern u32 sub_080A7CFC(u32 a1, u32 tmp); // TODO does this really have a second param?
extern void OpenSmallChest(u32 pos, u32 layer);
extern bool32 sub_08079778();
extern Transition* sub_08080734(u32, u32);
extern Transition* FindApplicableAreaTransition(u32, u32);
extern const s16 gUnk_080B4490[];
extern const s16 gUnk_080B4468[];
@ -206,7 +206,7 @@ u32 UpdatePlayerCollision(void) {
gPlayerEntity.base.collisionLayer) == COLLISION_DATA_255) {
if ((((gPlayerState.flags & (PL_FLAGS10000 | PL_FLAGS2)) != 0) ||
((gPlayerState.sword_state & 0x10) != 0)) ||
((sub_080806BC(gPlayerEntity.base.x.HALF.HI - gRoomControls.origin_x,
((DoApplicableTransition(gPlayerEntity.base.x.HALF.HI - gRoomControls.origin_x,
gPlayerEntity.base.y.HALF.HI - gRoomControls.origin_y, index, 5) == 0 &&
(((gPlayerState.heldObject != 0 || ((gPlayerState.gustJarState & 0xf) != 0)) ||
(sub_0807BD14(&gPlayerEntity.base, index) == 0)))))) {
@ -269,7 +269,7 @@ u32 UpdatePlayerCollision(void) {
}
ptr1 = &gUnk_080B4478[gPlayerEntity.base.animationState & 6];
transition = sub_08080734((gPlayerEntity.base.x.HALF.HI - gRoomControls.origin_x) + ptr1[0],
transition = FindApplicableAreaTransition((gPlayerEntity.base.x.HALF.HI - gRoomControls.origin_x) + ptr1[0],
(gPlayerEntity.base.y.HALF.HI - gRoomControls.origin_y) + ptr1[1]);
if (transition == NULL) {
return 0;

View File

@ -355,7 +355,7 @@ void MiscManager_TypeA(MiscManager* this) {
void MiscManager_TypeB(MiscManager* this) {
if (sub_080593CC(this)) {
if (++super->timer >= 8) {
sub_080806BC(this->x - gRoomControls.origin_x, this->y - gRoomControls.origin_y, 0xFF, 0xA);
DoApplicableTransition(this->x - gRoomControls.origin_x, this->y - gRoomControls.origin_y, 0xFF, 0xA);
}
} else {
super->timer = 0;

View File

@ -154,5 +154,5 @@ void Vaati3StartManager_Type1_Action1(Vaati3StartManager* this) {
void sub_0805E094(void) {
SetInitializationPriority();
sub_0808091C(&gUnk_0813AC34, TRANSITION_7);
DoExitTransitionWithType(&gUnk_0813AC34, TRANSITION_7);
}

View File

@ -62,7 +62,7 @@ void NPC4E_ChangeInteractableHitbox(Entity* this, ScriptExecutionContext* contex
}
void NPC4E_DoScreenTransition(Entity* this, ScriptExecutionContext* context) {
sub_0808091C(gNpc4ETransitions[context->intVariable], gNpc4ETransitionTypes[context->intVariable]);
DoExitTransitionWithType(gNpc4ETransitions[context->intVariable], gNpc4ETransitionTypes[context->intVariable]);
}
u8 NPC4E_GetKinstoneId(Entity* this) {

View File

@ -251,7 +251,7 @@ void GyorgBossObject_FightEnd(GyorgBossObjectEntity* this) {
sub_080A1E54(this);
if (--super->subtimer == 0) {
SetFlag(0x7B);
sub_0808091C(&gUnk_0813ABD0, 8);
DoExitTransitionWithType(&gUnk_0813ABD0, 8);
return;
}
if (super->subtimer == 0x3C) {

View File

@ -498,7 +498,7 @@ void sub_08085D60(LilypadLargeEntity* this) {
tmpY = gUnk_08120638[tmp + 1];
if (GetCollisionDataRelativeTo(super, tmpX, tmpY) == COLLISION_DATA_255) {
if (sub_080806BC((super->x.HALF.HI - gRoomControls.origin_x) + tmpX,
if (DoApplicableTransition((super->x.HALF.HI - gRoomControls.origin_x) + tmpX,
(super->y.HALF.HI - gRoomControls.origin_y) + tmpY, r4, 5) == 0) {
if (sub_0807BD14(&gPlayerEntity.base, r4 >> 3) != 0) {
super->direction = r4;

View File

@ -713,7 +713,7 @@ void sub_StateChange_HyruleCastle_4(void) {
}
void sub_0804BCDC(void) {
sub_0808091C(&gUnk_0813AB80, TRANSITION_FADE_BLACK_SLOW);
DoExitTransitionWithType(&gUnk_0813AB80, TRANSITION_FADE_BLACK_SLOW);
}
u32 sub_unk3_HyruleCastle_5(void) {

View File

@ -57,10 +57,10 @@ void sub_08080368();
void FillActTileForLayer(MapLayer* mapLayer);
bool32 IsPosInBorderTransitionRegion(const Transition* transition, u32 param_2, u32 param_3, u32 facing_direction);
bool32 IsPosInTransitionRect(const Transition* transition, u32 param_2, u32 param_3, u32 facing_direction);
void sub_080808D8(s32);
void sub_080808E4(s32);
void sub_08080904(s32);
void sub_08080910(s32);
void SetRoomTransitionTypeForAreaWarp(s32);
void SetRoomTransitionTypeForBorderWarp(s32);
void SetRoomTransitionTypeForArea2Warp(s32);
void SetRoomTransitionTypeForBorder2Warp(s32);
extern const s8 gShakeOffsets[];
@ -482,89 +482,90 @@ void sub_08080368(void) {
}
u32 sub_080803D0(void) {
s32 sp00, sp04, sp08, sp0c, sp10, sp14, sp18, sp1c;
s32 r2, r4, r7, r8, r9, r10;
s32 delta_x, delta_y, dd_x, dd_y, pos_x, pos_y, scroll_x, scroll_y;
s32 xy49, r4, r7, r8, delta_yy, delta_xx;
scroll_x = gRoomControls.scroll_x - gRoomControls.origin_x;
pos_x = gRoomControls.camera_target->x.HALF.HI - gRoomControls.origin_x;
scroll_y = gRoomControls.scroll_y - gRoomControls.origin_y;
pos_y = gRoomControls.camera_target->y.HALF.HI - gRoomControls.origin_y;
dd_x = 0x3c;
sp18 = gRoomControls.scroll_x - gRoomControls.origin_x;
sp10 = gRoomControls.camera_target->x.HALF.HI - gRoomControls.origin_x;
sp1c = gRoomControls.scroll_y - gRoomControls.origin_y;
sp14 = gRoomControls.camera_target->y.HALF.HI - gRoomControls.origin_y;
sp08 = 0x3c;
do {
r7 = 0;
sp08 += 6;
r10 = sp08 * sp08;
sp0c = sp08 * 2 / 3;
r9 = sp0c * sp0c;
dd_x += 6;
delta_xx = dd_x * dd_x;
dd_y = dd_x * 2 / 3;
delta_yy = dd_y * dd_y;
sp00 = sp08;
sp04 = 0;
r4 = (-(sp08 * 2) + 1) * r9 + r10 * 2;
r2 = sp00 * r9 / r10;
while (sp04 <= r2) {
delta_x = dd_x;
delta_y = 0;
r4 = (-(dd_x * 2) + 1) * delta_yy + delta_xx * 2;
xy49 = delta_x * delta_yy / delta_xx; // = x * 4/9
while (delta_y <= xy49) {
if ((sp1c + 0xa8) > sp14 + sp04) {
if (sp18 + 0xf8 > sp00 + sp10) {
if (scroll_y + 0xa8 > pos_y + delta_y) {
if (scroll_x + 0xf8 > delta_x + pos_x) {
r7 |= 1;
}
if (sp18 < sp10 - sp00 + 8) {
if (scroll_x < pos_x - delta_x + 8) {
r7 |= 2;
}
}
if (sp1c < (sp14 - sp04) + 8) {
if (sp18 + 0xf8 > sp00 + sp10) {
if (scroll_y < pos_y - delta_y + 8) {
if (scroll_x + 0xf8 > delta_x + pos_x) {
r7 |= 4;
}
if (sp18 < sp10 - sp00 + 8) {
if (scroll_x < pos_x - delta_x + 8) {
r7 |= 8;
}
}
if (r4 > 0) {
r4 += ((-(sp00 << 0x2) + 4) * r9) + (r10 * (6 + 4 * sp04));
sp00--;
r2 = sp00 * r9 / r10;
r4 += ((-(delta_x << 0x2) + 4) * delta_yy) + (delta_xx * (6 + 4 * delta_y));
delta_x--;
xy49 = delta_x * delta_yy / delta_xx;
} else {
r4 += (r10 * (6 + 4 * sp04));
r4 += (delta_xx * (6 + 4 * delta_y));
}
sp04++;
delta_y++;
}
sp00 = 0;
sp04 = sp0c;
r4 = r9 * 2 + (sp04 * -2 + 1) * r10;
r2 = sp04 * r10 / r9;
while (sp00 <= r2) {
if (sp1c + 0xa8 > sp14 + sp04) {
if (sp18 + 0xf8 > sp10 + sp00) {
delta_x = 0;
delta_y = dd_y;
r4 = delta_yy * 2 + (delta_y * -2 + 1) * delta_xx;
xy49 = delta_y * delta_xx / delta_yy; // y * 9 / 4
while (delta_x <= xy49) {
if (scroll_y + 0xa8 > pos_y + delta_y) {
if (scroll_x + 0xf8 > pos_x + delta_x) {
r7 |= 0x10;
}
if (sp18 < sp10 + 8 - sp00) {
if (scroll_x < pos_x + 8 - delta_x) {
r7 |= 0x20;
}
}
if (sp1c < (sp14 - sp04) + 8) {
if (sp18 + 0xf8 > sp10 + sp00) {
if (scroll_y < pos_y - delta_y + 8) {
if (scroll_x + 0xf8 > pos_x + delta_x) {
r7 |= 0x40;
}
if (sp18 < sp10 + 8 - sp00) {
if (scroll_x < pos_x + 8 - delta_x) {
r7 |= 0x80;
}
}
if (r4 > 0) {
r4 += r9 * (6 + (4 * sp00)) + (sp04 * -4 + 4) * r10;
sp04--;
r2 = sp04 * r10 / r9;
r4 += delta_yy * (6 + (4 * delta_x)) + (delta_y * -4 + 4) * delta_xx;
delta_y--;
xy49 = delta_y * delta_xx / delta_yy;
} else {
r4 += r9 * (6 + (4 * sp00));
r4 += delta_yy * (6 + (4 * delta_x));
}
sp00++;
delta_x++;
}
} while (r7 != 0);
return sp08;
return dd_x;
}
void UpdateIsDiggingCave(void) {
@ -592,7 +593,7 @@ void ClearTileMaps(void) {
MemClear(&gMapDataTopSpecial, 0x8000);
}
bool32 sub_080806BC(u32 x, u32 y, u32 direction, u32 warp_types) {
bool32 DoApplicableTransition(u32 x, u32 y, u32 direction, u32 warp_types) {
static bool32 (*const gUnk_0811E7AC[])(const Transition*, u32, u32, u32) = {
IsPosInBorderTransitionRegion,
IsPosInTransitionRect,
@ -612,12 +613,12 @@ bool32 sub_080806BC(u32 x, u32 y, u32 direction, u32 warp_types) {
return 0;
}
const Transition* sub_08080734(u32 param_1, u32 param_2) {
const Transition* FindApplicableAreaTransition(u32 pos_x, u32 pos_y) {
const Transition* transition = gArea.pCurrentRoomInfo->exits;
u32 warp_types = 0xa;
while (transition->warp_type != WARP_TYPE_END_OF_LIST) {
if (((1 << transition->warp_type) & warp_types) != 0 &&
IsPosInTransitionRect(transition, param_1, param_2, 0)) {
IsPosInTransitionRect(transition, pos_x, pos_y, 0)) {
return transition;
}
transition++;
@ -688,24 +689,24 @@ bool32 IsPosInTransitionRect(const Transition* transition, u32 pos_x, u32 pos_y,
}
void DoExitTransition(const Transition* data) {
static void (*const gUnk_0811E7C4[])(s32) = {
sub_080808D8,
sub_080808E4,
sub_08080904,
sub_08080910,
static void (*const sSetRoomTransitionTypes[])(s32) = {
SetRoomTransitionTypeForAreaWarp,
SetRoomTransitionTypeForBorderWarp,
SetRoomTransitionTypeForArea2Warp,
SetRoomTransitionTypeForBorder2Warp,
};
PlayerRoomStatus* status;
gRoomTransition.transitioningOut = 1;
status = &gRoomTransition.player_status;
if ((u16)data->endX <= 0x3ff) {
if (data->endX <= 0x3ff) {
status->start_pos_x = data->endX;
} else {
status->start_pos_x = (gRoomControls.camera_target)->x.HALF.HI | 0x8000;
status->start_pos_x = gRoomControls.camera_target->x.HALF.HI | 0x8000;
}
if ((u16)data->endY <= 0x3ff) {
if (data->endY <= 0x3ff) {
status->start_pos_y = data->endY;
} else {
status->start_pos_y = (gRoomControls.camera_target)->y.HALF.HI | 0x8000;
status->start_pos_y = gRoomControls.camera_target->y.HALF.HI | 0x8000;
}
status->area_next = data->area;
status->room_next = data->room;
@ -715,14 +716,14 @@ void DoExitTransition(const Transition* data) {
if (data->transitionSFX != SFX_NONE) {
SoundReq(data->transitionSFX);
}
gUnk_0811E7C4[data->warp_type](data->shape);
sSetRoomTransitionTypes[data->warp_type](data->shape);
}
void sub_080808D8(s32 param_1) {
void SetRoomTransitionTypeForAreaWarp(s32 param_1) {
gRoomTransition.type = TRANSITION_DEFAULT;
}
void sub_080808E4(s32 param_1) {
void SetRoomTransitionTypeForBorderWarp(s32 param_1) {
if (CheckAreaOverworld(gRoomTransition.player_status.area_next)) {
gRoomTransition.type = TRANSITION_DEFAULT;
} else {
@ -730,15 +731,15 @@ void sub_080808E4(s32 param_1) {
}
}
void sub_08080904(s32 param_1) {
void SetRoomTransitionTypeForArea2Warp(s32 param_1) {
gRoomTransition.type = TRANSITION_CUT;
}
void sub_08080910(s32 param_1) {
void SetRoomTransitionTypeForBorder2Warp(s32 param_1) {
gRoomTransition.type = TRANSITION_CUT;
}
void sub_0808091C(const Transition* screenTransition, u32 transitionType) {
void DoExitTransitionWithType(const Transition* screenTransition, u32 transitionType) {
DoExitTransition(screenTransition);
gRoomTransition.type = transitionType;
}
@ -864,7 +865,7 @@ void UpdateDoorTransition() {
case ACT_TILE_241:
case ACT_TILE_40:
case ACT_TILE_41:
sub_080806BC(x, y, 0xff, 10);
DoApplicableTransition(x, y, 0xff, 10);
break;
}
}