From 9a0fee685658ee6f643cf9d4c2c09151ecd03a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Patry?= Date: Fri, 12 Jun 2026 18:22:32 +0200 Subject: [PATCH 1/2] Match sub_8033158 --- .../game/interactables/lift__sub_8033158.inc | 142 ------------------ src/game/interactables/lift.c | 32 ++-- 2 files changed, 14 insertions(+), 160 deletions(-) delete mode 100644 asm/non_matching/game/interactables/lift__sub_8033158.inc diff --git a/asm/non_matching/game/interactables/lift__sub_8033158.inc b/asm/non_matching/game/interactables/lift__sub_8033158.inc deleted file mode 100644 index 0adf8a081..000000000 --- a/asm/non_matching/game/interactables/lift__sub_8033158.inc +++ /dev/null @@ -1,142 +0,0 @@ - -.syntax unified -.text - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - ldr r0, _080331E0 @ =gCurTask - mov sl, r0 - ldr r0, [r0] - ldrh r2, [r0, #6] - movs r0, #0xc0 - lsls r0, r0, #0x12 - adds r0, r0, r2 - mov r8, r0 @ r8 = lift - ldr r1, _080331E4 @ =0x0300000C - adds r6, r2, r1 @ r6 = s - ldr r7, [r0] - mov sb, r7 @ sb = me - ldr r0, _080331E8 @ =0x03000084 - adds r4, r2, r0 @ r4 = &lift->worldX - adds r1, #0x7c - adds r0, r2, r1 @ r0 = &lift->worldY - ldr r3, _080331EC @ =gCamera - ldr r1, [r3, #4] - movs r7, #0 - ldrsh r5, [r0, r7] - subs r1, r5, r1 - ldr r7, _080331F0 @ =0x0300008C - adds r0, r2, r7 - ldrh r0, [r0] - lsls r0, r0, #0x10 - asrs r0, r0, #0x18 - adds r1, r1, r0 - lsls r1, r1, #0x10 - lsrs r7, r1, #0x10 @ r7 = handleY - ldr r0, [r3] - movs r1, #0 - ldrsh r4, [r4, r1] - subs r0, r4, r0 - strh r0, [r6, #0x10] - ldr r0, [r3, #4] - subs r0, r5, r0 - strh r0, [r6, #0x12] - ldr r0, _080331F4 @ =0x0300008E - adds r2, r2, r0 - ldrh r0, [r2] - cmp r0, #0 - bne _080331F8 - adds r1, r5, #0 - adds r1, #0x20 - movs r0, #0x10 - ldrsh r2, [r6, r0] - movs r0, #0x12 - ldrsh r3, [r6, r0] - adds r0, r4, #0 - bl sub_802C140 - cmp r0, #0 - bne _080331F8 - mov r1, r8 - ldrb r0, [r1, #0xa] - mov r2, sb - strb r0, [r2] - mov r7, sl - ldr r0, [r7] - bl TaskDestroy - b _0803326A - .align 2, 0 -_080331E0: .4byte gCurTask -_080331E4: .4byte 0x0300000C -_080331E8: .4byte 0x03000084 -_080331EC: .4byte gCamera -_080331F0: .4byte 0x0300008C -_080331F4: .4byte 0x0300008E -_080331F8: - ldrh r0, [r6, #0x10] - mov sb, r0 @ sb = screenX = s->x; - ldrh r1, [r6, #0x12] - mov sl, r1 @ sl = screenY = s->y; - ldr r0, [r6, #8] - movs r5, #0x80 - lsls r5, r5, #3 - orrs r0, r5 - str r0, [r6, #8] - adds r0, r6, #0 - bl DisplaySprite - ldr r0, [r6, #8] - ldr r4, _08033278 @ =0xFFFFFBFF - ands r0, r4 - str r0, [r6, #8] - adds r0, r6, #0 - bl DisplaySprite - mov r6, r8 - adds r6, #0x5c - mov r2, sb - strh r2, [r6, #0x10] - strh r7, [r6, #0x12] - ldr r0, [r6, #8] - orrs r0, r5 - str r0, [r6, #8] - adds r0, r6, #0 - bl DisplaySprite - ldr r0, [r6, #8] - ands r0, r4 - str r0, [r6, #8] - adds r0, r6, #0 - bl DisplaySprite - subs r6, #0x28 - lsls r1, r7, #0x10 - mov r2, sl - lsls r0, r2, #0x10 - asrs r2, r0, #0x10 - cmp r1, r0 - ble _0803326A - adds r4, r2, #0 -_08033250: - mov r0, sb - strh r0, [r6, #0x10] - strh r7, [r6, #0x12] - adds r0, r6, #0 - bl DisplaySprite - lsls r0, r7, #0x10 - ldr r1, _0803327C @ =0xFFF00000 - adds r0, r0, r1 - lsrs r7, r0, #0x10 - asrs r0, r0, #0x10 - cmp r0, r4 - bgt _08033250 -_0803326A: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7} - pop {r0} - bx r0 - .align 2, 0 -_08033278: .4byte 0xFFFFFBFF -_0803327C: .4byte 0xFFF00000 - -.syntax divided diff --git a/src/game/interactables/lift.c b/src/game/interactables/lift.c index 3c9f1ac48..b08c70568 100644 --- a/src/game/interactables/lift.c +++ b/src/game/interactables/lift.c @@ -262,39 +262,36 @@ void sub_8033098(Sprite *s, Sprite *s2, Sprite *s3) UpdateSpriteAnimation(s3); } -// (95.41%) https://decomp.me/scratch/yPSfH -NONMATCH("asm/non_matching/game/interactables/lift__sub_8033158.inc", void sub_8033158(void)) +void sub_8033158(void) { Lift *lift = TASK_DATA(gCurTask); Sprite *s = &lift->s[0]; MapEntity *me = lift->base.me; - s16 worldX, worldY; - s16 screenX, screenY, handleY; + s16 x, y, handleY; - worldX = lift->worldX; - worldY = lift->worldY; - handleY = (worldY - gCamera.y) + I(lift->unk8C); + x = lift->worldX; + y = lift->worldY; + handleY = (y - gCamera.y) + I(lift->unk8C); - s->x = worldX - gCamera.x; - s->y = worldY - gCamera.y; + s->x = x - gCamera.x; + s->y = y - gCamera.y; - if (((lift->unk8E[0] == 0) && (lift->unk8E[1] == 0)) && !sub_802C140(worldX, worldY + 0x20, s->x, s->y)) { + if (((lift->unk8E[0] == 0) && (lift->unk8E[1] == 0)) && !sub_802C140(x, y + 0x20, s->x, s->y)) { SET_MAP_ENTITY_NOT_INITIALIZED(me, lift->base.meX); TaskDestroy(gCurTask); return; } - // _080331F8 - screenX = s->x; - screenY = s->y; + x = s->x; + y = s->y; SPRITE_FLAG_SET(s, X_FLIP); DisplaySprite(s); SPRITE_FLAG_CLEAR(s, X_FLIP); DisplaySprite(s); s = &lift->s[2]; - s->x = screenX; + s->x = x; s->y = handleY; SPRITE_FLAG_SET(s, X_FLIP); DisplaySprite(s); @@ -303,16 +300,15 @@ NONMATCH("asm/non_matching/game/interactables/lift__sub_8033158.inc", void sub_8 s = &lift->s[1]; - for (; handleY > screenY; handleY -= 16) { - s->x = screenX; + for (; handleY > y; handleY -= 16) { + s->x = x; s->y = handleY; DisplaySprite(s); } } -END_NONMATCH void TaskDestructor_Lift(struct Task *t) { Lift *lift = TASK_DATA(t); VramFree(lift->s->tiles); -} \ No newline at end of file +} From 7dd937c1fb0a1f0174c2c1bb0067a0d21851ed2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Patry?= Date: Fri, 12 Jun 2026 21:46:19 +0200 Subject: [PATCH 2/2] Improve documentation in lift.c --- src/game/interactables/lift.c | 220 ++++++++++++++++++---------------- 1 file changed, 115 insertions(+), 105 deletions(-) diff --git a/src/game/interactables/lift.c b/src/game/interactables/lift.c index b08c70568..4c3715045 100644 --- a/src/game/interactables/lift.c +++ b/src/game/interactables/lift.c @@ -14,27 +14,34 @@ #include "constants/move_states.h" #include "constants/songs.h" +#define LIFT_SPRITE_PLATFORM 0 +#define LIFT_SPRITE_CHAIN_LINK 1 +#define LIFT_SPRITE_HANDLE 2 + +#define LIFT_VERTICAL_SPEED Q(2) +#define LIFT_MINIMUM_CHAIN_LENGTH Q(8) +#define LIFT_MAXIMUM_CHAIN_LENGTH Q(120) // Also the resting length when idle + typedef struct { /* 0x00 */ SpriteBase base; /* 0x0C */ Sprite s[3]; /* 0x84 */ s32 worldX; /* 0x88 */ s32 worldY; - /* 0x8C */ s16 unk8C; - /* 0x8E */ u8 unk8E[NUM_SINGLE_PLAYER_CHARS]; + /* 0x8C */ s16 qChainLength; + /* 0x8E */ bool8 playerHoldsHandle[NUM_SINGLE_PLAYER_CHARS]; } Lift; /* 0x90 */ void Task_LiftIdle(void); void TaskDestructor_Lift(struct Task *t); -void Task_8032D64(void); -void sub_8032FDC(void); -void sub_8033158(void); -void sub_8033098(Sprite *s, Sprite *s2, Sprite *s3); +void Task_LiftLiftPlayerUp(void); +void Task_LiftBringHandleBackDown(void); +void Task_LiftDrawSpritesOrDestroy(void); +void Task_LiftInitSprites(Sprite *spritePlatform, Sprite *spriteChainLink, Sprite *spriteHandle); void CreateEntity_Lift(MapEntity *me, u16 regionX, u16 regionY, u8 id) { struct Task *t = TaskCreate(Task_LiftIdle, sizeof(Lift), 0x2100, 0, TaskDestructor_Lift); Lift *lift = TASK_DATA(t); - Sprite *s, *s2, *s3; lift->base.regionX = regionX; lift->base.regionY = regionY; @@ -42,89 +49,88 @@ void CreateEntity_Lift(MapEntity *me, u16 regionX, u16 regionY, u8 id) lift->base.meX = me->x; lift->base.id = id; - lift->unk8C = Q(120); - lift->unk8E[0] = 0; - lift->unk8E[1] = 0; + lift->qChainLength = LIFT_MAXIMUM_CHAIN_LENGTH; + lift->playerHoldsHandle[0] = FALSE; + lift->playerHoldsHandle[1] = FALSE; lift->worldX = TO_WORLD_POS(lift->base.meX, lift->base.regionX); lift->worldY = TO_WORLD_POS(me->y, lift->base.regionY) - 32; SET_MAP_ENTITY_INITIALIZED(me); - sub_8033098(&lift->s[0], &lift->s[1], &lift->s[2]); + Task_LiftInitSprites(&lift->s[LIFT_SPRITE_PLATFORM], &lift->s[LIFT_SPRITE_CHAIN_LINK], &lift->s[LIFT_SPRITE_HANDLE]); } void Task_LiftIdle(void) { - Sprite *s; - Sprite *s2; + Sprite *spritePlatform; + Sprite *spriteHandle; Player *p; u8 i; - bool32 sp10 = 0; + bool32 handleHeld = 0; Lift *lift = TASK_DATA(gCurTask); - s = &lift->s[0]; - s2 = &lift->s[2]; + spritePlatform = &lift->s[LIFT_SPRITE_PLATFORM]; + spriteHandle = &lift->s[LIFT_SPRITE_HANDLE]; for (i = 0; i < NUM_SINGLE_PLAYER_CHARS; i++) { - lift->unk8E[i] = 0; + lift->playerHoldsHandle[i] = FALSE; p = GET_SP_PLAYER_V1(i); if (!sub_802C0D4(p)) { - u32 res = sub_8020950(s, lift->worldX, lift->worldY, p, 0); + u32 res = sub_8020950(spritePlatform, lift->worldX, lift->worldY, p, 0); if (res & 0x10000) { p->qWorldY += Q_8_8(res); } - if (sub_8020700(s2, lift->worldX, lift->worldY + 120, 0, p, 0) == TRUE) { + if (sub_8020700(spriteHandle, lift->worldX, lift->worldY + I(LIFT_MAXIMUM_CHAIN_LENGTH), 0, p, 0) == TRUE) { sub_8016F28(p); p->charFlags.unk2C_04 = 0; SetPlayerCallback(p, Player_800A168); - lift->unk8E[i] = 1; - sp10 = 1; + lift->playerHoldsHandle[i] = TRUE; + handleHeld = TRUE; } } } - if (sp10) { + if (handleHeld) { sub_8003DF0(SE_LIFT); - gCurTask->main = Task_8032D64; + gCurTask->main = Task_LiftLiftPlayerUp; } - sub_8033158(); + Task_LiftDrawSpritesOrDestroy(); } -void Task_8032D64(void) +void Task_LiftLiftPlayerUp(void) { Lift *lift = TASK_DATA(gCurTask); - Sprite *s = &lift->s[0]; - Sprite *s2 = &lift->s[2]; + Sprite *spritePlatform = &lift->s[LIFT_SPRITE_PLATFORM]; + Sprite *spriteHandle = &lift->s[LIFT_SPRITE_HANDLE]; s32 worldX, worldY; - s32 qRight, qLeft; u8 i; - lift->unk8C -= Q(2); + lift->qChainLength -= LIFT_VERTICAL_SPEED; - if (lift->unk8C < Q(8)) { - lift->unk8C = Q(8); + if (lift->qChainLength < LIFT_MINIMUM_CHAIN_LENGTH) { + lift->qChainLength = LIFT_MINIMUM_CHAIN_LENGTH; sub_8003E28(SE_LIFT); } worldX = lift->worldX; - worldY = lift->worldY + I(lift->unk8C); + worldY = lift->worldY + I(lift->qChainLength); for (i = 0; i < NUM_SINGLE_PLAYER_CHARS; i++) { Player *p = GET_SP_PLAYER_V1(i); if ((p->charFlags.someIndex != 1) && (p->charFlags.someIndex != 2) && (p->charFlags.someIndex != 4)) { - lift->unk8E[i] = 0; + lift->playerHoldsHandle[i] = FALSE; } else { if (!sub_802C0D4(p)) { - u32 res = sub_8020950(s, lift->worldX, lift->worldY, p, 0); + u32 res = sub_8020950(spritePlatform, lift->worldX, lift->worldY, p, 0); if (res & 0x10000) { p->qWorldY += Q_8_8(res); @@ -133,15 +139,15 @@ void Task_8032D64(void) if (p->moveState & (MOVESTATE_1000000 | MOVESTATE_DEAD)) { p->moveState &= ~MOVESTATE_10000000; - lift->unk8E[i] = 0; + lift->playerHoldsHandle[i] = FALSE; } if (p->callback == Player_800D944) { p->moveState &= ~MOVESTATE_10000000; - lift->unk8E[i] = 0; + lift->playerHoldsHandle[i] = FALSE; } - if (lift->unk8E[i] != 0) { + if (lift->playerHoldsHandle[i] != FALSE) { p->charFlags.anim0 = 122; p->qSpeedAirX = Q(0); @@ -162,41 +168,41 @@ void Task_8032D64(void) p->qSpeedAirY = -Q(5); p->qSpeedAirX = +Q(0); - lift->unk8E[i] = 0; + lift->playerHoldsHandle[i] = FALSE; } } else if ((!sub_802C0D4(p)) && (p->qSpeedAirY > 0)) { - if (sub_8020700(s2, lift->worldX, lift->worldY + I(lift->unk8C), 0, p, 0) == TRUE) { + if (sub_8020700(spriteHandle, lift->worldX, lift->worldY + I(lift->qChainLength), 0, p, 0) == TRUE) { sub_8016F28(p); p->charFlags.unk2C_04 = 0; SetPlayerCallback(p, Player_800A168); - lift->unk8E[i] = 1; + lift->playerHoldsHandle[i] = TRUE; } } } } - if ((lift->unk8E[0] == 0) && (lift->unk8E[1] == 0)) { + if ((lift->playerHoldsHandle[0] == FALSE) && (lift->playerHoldsHandle[1] == FALSE)) { sub_8003E28(SE_LIFT); - gCurTask->main = sub_8032FDC; + gCurTask->main = Task_LiftBringHandleBackDown; } - sub_8033158(); + Task_LiftDrawSpritesOrDestroy(); } -void sub_8032FDC(void) +void Task_LiftBringHandleBackDown(void) { Lift *lift = TASK_DATA(gCurTask); - Sprite *s = &lift->s[0]; + Sprite *spritePlatform = &lift->s[LIFT_SPRITE_PLATFORM]; Player *p; u8 i; - lift->unk8C += Q(2); + lift->qChainLength += LIFT_VERTICAL_SPEED; - if (lift->unk8C >= Q(120)) { - lift->unk8C = Q(120); + if (lift->qChainLength >= LIFT_MAXIMUM_CHAIN_LENGTH) { + lift->qChainLength = LIFT_MAXIMUM_CHAIN_LENGTH; gCurTask->main = Task_LiftIdle; } @@ -204,7 +210,7 @@ void sub_8032FDC(void) p = GET_SP_PLAYER_V1(i); if (!sub_802C0D4(p)) { - u32 res = sub_8020950(s, lift->worldX, lift->worldY, p, 0); + u32 res = sub_8020950(spritePlatform, lift->worldX, lift->worldY, p, 0); if (res & 0x10000) { p->qWorldY += Q_8_8(res); @@ -212,97 +218,101 @@ void sub_8032FDC(void) } } - sub_8033158(); + Task_LiftDrawSpritesOrDestroy(); } -void sub_8033098(Sprite *s, Sprite *s2, Sprite *s3) +void Task_LiftInitSprites(Sprite *spritePlatform, Sprite *spriteChainLink, Sprite *spriteHandle) { void *tiles = VramMalloc(MAX_TILES_VARIANT(ANIM_LIFT, 0) + MAX_TILES_VARIANT(ANIM_LIFT, 1) + MAX_TILES_VARIANT(ANIM_LIFT, 2)); - s->tiles = tiles; - s->oamFlags = SPRITE_OAM_ORDER(24); - s->anim = ANIM_LIFT; - s->variant = 2; - s->qAnimDelay = Q(0); - s->prevVariant = -1; - s->animSpeed = SPRITE_ANIM_SPEED(1.0); - s->palId = 0; - s->x = 0; - s->y = 0; - s->frameFlags = SPRITE_FLAG(PRIORITY, 1); + spritePlatform->tiles = tiles; + spritePlatform->oamFlags = SPRITE_OAM_ORDER(24); + spritePlatform->anim = ANIM_LIFT; + spritePlatform->variant = 2; + spritePlatform->qAnimDelay = Q(0); + spritePlatform->prevVariant = -1; + spritePlatform->animSpeed = SPRITE_ANIM_SPEED(1.0); + spritePlatform->palId = 0; + spritePlatform->x = 0; + spritePlatform->y = 0; + spritePlatform->frameFlags = SPRITE_FLAG(PRIORITY, 1); tiles += MAX_TILES_VARIANT(ANIM_LIFT, 2) * TILE_SIZE_4BPP; - s2->tiles = tiles; - s2->oamFlags = SPRITE_OAM_ORDER(25); - s2->anim = ANIM_LIFT; - s2->variant = 1; - s2->qAnimDelay = Q(0); - s2->prevVariant = -1; - s2->animSpeed = SPRITE_ANIM_SPEED(1.0); - s2->palId = 0; - s2->x = 0; - s2->y = 0; - s2->frameFlags = SPRITE_FLAG(PRIORITY, 1); + spriteChainLink->tiles = tiles; + spriteChainLink->oamFlags = SPRITE_OAM_ORDER(25); + spriteChainLink->anim = ANIM_LIFT; + spriteChainLink->variant = 1; + spriteChainLink->qAnimDelay = Q(0); + spriteChainLink->prevVariant = -1; + spriteChainLink->animSpeed = SPRITE_ANIM_SPEED(1.0); + spriteChainLink->palId = 0; + spriteChainLink->x = 0; + spriteChainLink->y = 0; + spriteChainLink->frameFlags = SPRITE_FLAG(PRIORITY, 1); tiles += MAX_TILES_VARIANT(ANIM_LIFT, 1) * TILE_SIZE_4BPP; - s3->tiles = tiles; - s3->oamFlags = SPRITE_OAM_ORDER(24); - s3->anim = ANIM_LIFT; - s3->variant = 0; - s3->qAnimDelay = Q(0); - s3->prevVariant = -1; - s3->animSpeed = SPRITE_ANIM_SPEED(1.0); - s3->palId = 0; - s3->x = 0; - s3->y = 0; - s3->frameFlags = SPRITE_FLAG(PRIORITY, 1); - - UpdateSpriteAnimation(s); - UpdateSpriteAnimation(s2); - UpdateSpriteAnimation(s3); + spriteHandle->tiles = tiles; + spriteHandle->oamFlags = SPRITE_OAM_ORDER(24); + spriteHandle->anim = ANIM_LIFT; + spriteHandle->variant = 0; + spriteHandle->qAnimDelay = Q(0); + spriteHandle->prevVariant = -1; + spriteHandle->animSpeed = SPRITE_ANIM_SPEED(1.0); + spriteHandle->palId = 0; + spriteHandle->x = 0; + spriteHandle->y = 0; + spriteHandle->frameFlags = SPRITE_FLAG(PRIORITY, 1); + + UpdateSpriteAnimation(spritePlatform); + UpdateSpriteAnimation(spriteChainLink); + UpdateSpriteAnimation(spriteHandle); } -void sub_8033158(void) +void Task_LiftDrawSpritesOrDestroy(void) { Lift *lift = TASK_DATA(gCurTask); - Sprite *s = &lift->s[0]; + Sprite *s = &lift->s[LIFT_SPRITE_PLATFORM]; MapEntity *me = lift->base.me; - s16 x, y, handleY; + s16 screenX, screenYPlatform; + s16 worldX, worldY; + s16 handleY, linkY; - x = lift->worldX; - y = lift->worldY; - handleY = (y - gCamera.y) + I(lift->unk8C); + worldX = screenX = lift->worldX; + worldY = screenYPlatform = lift->worldY; + handleY = (worldY - gCamera.y) + I(lift->qChainLength); - s->x = x - gCamera.x; - s->y = y - gCamera.y; + s->x = worldX - gCamera.x; + s->y = worldY - gCamera.y; - if (((lift->unk8E[0] == 0) && (lift->unk8E[1] == 0)) && !sub_802C140(x, y + 0x20, s->x, s->y)) { + if (((lift->playerHoldsHandle[0] == FALSE) && (lift->playerHoldsHandle[1] == FALSE)) + && !sub_802C140(worldX, worldY + 0x20, s->x, s->y)) { SET_MAP_ENTITY_NOT_INITIALIZED(me, lift->base.meX); TaskDestroy(gCurTask); return; } - x = s->x; - y = s->y; + screenX = s->x; + screenYPlatform = s->y; SPRITE_FLAG_SET(s, X_FLIP); DisplaySprite(s); SPRITE_FLAG_CLEAR(s, X_FLIP); DisplaySprite(s); - s = &lift->s[2]; - s->x = x; + s = &lift->s[LIFT_SPRITE_HANDLE]; + s->x = screenX; s->y = handleY; + linkY = handleY; SPRITE_FLAG_SET(s, X_FLIP); DisplaySprite(s); SPRITE_FLAG_CLEAR(s, X_FLIP); DisplaySprite(s); - s = &lift->s[1]; + s = &lift->s[LIFT_SPRITE_CHAIN_LINK]; - for (; handleY > y; handleY -= 16) { - s->x = x; - s->y = handleY; + for (; linkY > screenYPlatform; linkY -= 16) { + s->x = screenX; + s->y = linkY; DisplaySprite(s); } }