Skip to content

Commit

Permalink
Decompile no1 func_us_801BE880, func_us_801BEB54 and func_us_801BEE…
Browse files Browse the repository at this point in the history
…00 (#2126)

PSX: https://decomp.me/scratch/ZPWgF
PSP: https://decomp.me/scratch/ibAxf

Will have to update castleFlag `CASTLE_FLAG_18` to
`NO1_SECRET_WALL_BROKEN` once
#2124 gets merged

EDIT: the next function `func_us_801BEB54` uses the same ext struct: 
PSX: https://decomp.me/scratch/Ynyos
PSP: https://decomp.me/scratch/2jrNE

EDIT EDIT: `func_us_801BEE00`:
PSX: https://decomp.me/scratch/6HkYt
PSP: https://decomp.me/scratch/WBTqV
  • Loading branch information
gamezter authored Jan 26, 2025
1 parent a21c7a7 commit 3aba035
Show file tree
Hide file tree
Showing 7 changed files with 274 additions and 21 deletions.
1 change: 1 addition & 0 deletions config/symbols.us.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1025,6 +1025,7 @@ g_PrimBuf_0_drawMode = 0x8008701E;
g_PlayerX = 0x800973F0;
g_PlayerY = 0x800973F4;
g_unkGraphicsStruct = 0x800973F8;
g_unkGraphicsStruct_g_zEntityCenter = 0x80097408;
g_entityDestroyed = 0x80097428;
D_8009748A_x_i_hi = 0x8009748A;
D_8009748C_y_val = 0x8009748C;
Expand Down
8 changes: 8 additions & 0 deletions include/entity.h
Original file line number Diff line number Diff line change
Expand Up @@ -2580,6 +2580,13 @@ typedef struct {
/* 0xB0 */ s16 unkB0;
} ET_801D4558;

typedef struct {
/* 0x7C */ struct Primitive* unk7C;
/* 0x80 */ s16 unk80;
/* 0x82 */ s16 unk82;
/* 0x84 */ u8 unk84;
} ET_801BE880;

typedef struct {
/* 0x7C */ s16 timer;
/* 0x7E */ s16 unk7E;
Expand Down Expand Up @@ -2802,6 +2809,7 @@ typedef union { // offset=0x7C
ET_801BDAE4 et_801BDAE4;
ET_801D4400 et_801D4400;
ET_801D4558 et_801D4558;
ET_801BE880 et_801BE880;
ET_801B7D34 et_801B7D34;
} Ext;

Expand Down
2 changes: 0 additions & 2 deletions src/st/no0/4C750.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,6 @@ void func_us_801CC750(Entity* self) {
}
}

extern s32 D_80097408[];

void func_us_801CC8F8(Entity* self) {
if (self->step == 0) {
InitializeEntity(g_EInitCommon);
Expand Down
272 changes: 258 additions & 14 deletions src/st/no1/e_wall_chicken_secret.c
Original file line number Diff line number Diff line change
@@ -1,14 +1,261 @@
// SPDX-License-Identifier: AGPL-3.0-or-later
#include "no1.h"

extern u16 D_us_801815F4[];
extern u16 D_us_80181604[][8];
extern s32 D_psp_0929A738;
extern s32 D_psp_0929A740;
extern s32 D_psp_0929A748;

// Breakable wall with chicken
INCLUDE_ASM("st/no1/nonmatchings/e_wall_chicken_secret", func_us_801BE880);
void func_us_801BE880(Entity* self) {
Entity* tempEntity;
s32 tilePos;
s32 i;
u8 animFrame;
Entity* tempEntity2;

switch (self->step) {
case 0:
InitializeEntity(D_us_801809C8);
self->zPriority = 0x70;
self->hitPoints = 0x7FFF;
self->hitboxState = 0;
self->ext.et_801BE880.unk82 = 0;
if (g_CastleFlags[NO1_SECRET_WALL_BROKEN]) {
self->step = 5;
} else {
tempEntity = self + 2;
#ifdef VERSION_PSP
CreateEntityFromEntity(D_psp_0929A748, self, tempEntity);
#else
CreateEntityFromEntity(E_ID_25, self, tempEntity);
#endif
tempEntity->posY.i.hi -= 0x18;
tempEntity->params = 2;
tempEntity = self + 1;
#ifdef VERSION_PSP
CreateEntityFromEntity(D_psp_0929A748, self, tempEntity);
#else
CreateEntityFromEntity(E_ID_25, self, tempEntity);
#endif
tempEntity->posY.i.hi -= 0x30;
tempEntity->params = 1;
}
break;

case 1:
if (self->ext.et_801BE880.unk82 > 8) {
self->ext.et_801BE880.unk82 = 0;
for (i = 0; i < 5; i++) {
tempEntity = AllocEntity(&g_Entities[224], &g_Entities[256]);
if (tempEntity != NULL) {
#ifdef VERSION_PSP
CreateEntityFromEntity(D_psp_0929A740, self, tempEntity);
#else
CreateEntityFromEntity(E_ID_26, self, tempEntity);
#endif
tempEntity->posX.i.hi += 0x10;
tempEntity->posY.i.hi -= 0x30;
tempEntity->params = i;
}
}
if (self->animCurFrame < 0x4D) {
self->animCurFrame++;
}
}
if (self->ext.et_801BE880.unk84) {
PlaySfxPositional(SFX_WALL_DEBRIS_B);
self->step_s = 0;
self->step = self->ext.et_801BE880.unk84 + 1;
if (self->ext.et_801BE880.unk84 == 3) {
self->step = 2;
}
}
break;

case 2:
self->animCurFrame = 0x4F;
if (self->ext.et_801BE880.unk84 & 2) {
PlaySfxPositional(SFX_WALL_DEBRIS_B);
self->step = 4;
}
break;

case 3:
self->animCurFrame = 0x4E;
#ifdef VERSION_PSP
tempEntity2 = self + 1;
if (tempEntity2->step == 1 && (tempEntity2->flags & FLAG_DEAD) == 0) {
tempEntity2->flags |= FLAG_DEAD;
}
PlaySfxPositional(SFX_WALL_DEBRIS_B);
self->step = 4;
#else
if (self->ext.et_801BE880.unk84 & 1) {
PlaySfxPositional(SFX_WALL_DEBRIS_B);
self->step = 4;
}
#endif
break;

case 4:
self->animCurFrame = 0x50;
g_CastleFlags[NO1_SECRET_WALL_BROKEN] = 1;
tempEntity = AllocEntity(&g_Entities[160], &g_Entities[192]);
if (tempEntity != NULL) {
CreateEntityFromEntity(E_EQUIP_ITEM_DROP, self, tempEntity);
tempEntity->params = 0x43;
tempEntity->posY.i.hi -= 0x30;
}
self->step++;
break;
default:
self->animCurFrame = 0x50;
break;
}
animFrame = self->animCurFrame - 0x4B;
for (i = 0; i < 6; i++) {
tilePos = D_us_801815F4[i];
g_Tilemap.fg[tilePos] = D_us_80181604[animFrame][i];
}
}

// Hit spawner?
INCLUDE_ASM("st/no1/nonmatchings/e_wall_chicken_secret", func_us_801BEB54);
void func_us_801BEB54(Entity* self) {
Entity* tempEntity;
s32 i;

if (self->hitParams) {
PlaySfxPositional(SFX_EXPLODE_FAST_B);
}
switch (self->step) {
case 0:
InitializeEntity(D_us_801809D4);
self->hitPoints = 0x18;
self->hitboxWidth = 0x10;
self->hitboxHeight = 0xC;
self->hitboxState = 2;
self->ext.et_801BE880.unk80 = self->hitPoints;
self->hitboxOffY = -0xC;
break;

case 1:
if (self->hitPoints ^ self->ext.et_801BE880.unk80) {
(self - self->params)->ext.et_801BE880.unk82 +=
self->ext.et_801BE880.unk80 - self->hitPoints;
self->ext.et_801BE880.unk80 = self->hitPoints;
}
if (self->flags & FLAG_DEAD) {
(self - self->params)->ext.et_801BE880.unk84 |= self->params;
self->step++;
}
break;

case 2:
if (self->step_s == 0) {
tempEntity = AllocEntity(&g_Entities[224], &g_Entities[256]);
if (tempEntity != NULL) {
CreateEntityFromEntity(E_EXPLOSION, self, tempEntity);
tempEntity->posY.i.hi -= 8;
tempEntity->params = 0x13;
}
for (i = 0; i < 3; i++) {
tempEntity = AllocEntity(&g_Entities[224], &g_Entities[256]);
if (tempEntity != NULL) {
CreateEntityFromEntity(
E_INTENSE_EXPLOSION, self, tempEntity);
tempEntity->posX.i.hi += (i * 0x10) - 0x10;
tempEntity->params = 0x10;
}
}
for (i = 0; i < 5; i++) {
tempEntity = AllocEntity(&g_Entities[224], &g_Entities[256]);
if (tempEntity != NULL) {
#ifdef VERSION_PSP
CreateEntityFromEntity(D_psp_0929A738, self, tempEntity);
#else
CreateEntityFromEntity(E_ID_27, self, tempEntity);
#endif
tempEntity->posX.i.hi += (i * 8) - 0x10 + (Random() & 3);
tempEntity->posY.i.hi -= (Random() & 7) + 0x14;
tempEntity->params = i;
}
}
self->step_s++;
}
break;
}
}

extern s16 D_us_80181668[];
extern s32 D_us_80181678[][2];
extern u8 D_us_801816E8[];

// Wall particles on hit
INCLUDE_ASM("st/no1/nonmatchings/e_wall_chicken_secret", func_us_801BEE00);
void func_us_801BEE00(Entity* self) {
Primitive* prim;
s32 primIndex;

switch (self->step) {
case 0:
InitializeEntity(g_EInitParticle);
self->animSet = 8;
self->animCurFrame = 1;
self->palette = 0x8004;
break;

case 1:
primIndex = g_api.AllocPrimitives(PRIM_GT4, 2);
if (primIndex != -1) {
self->flags |= FLAG_HAS_PRIMS;
self->primIndex = primIndex;
prim = &g_PrimBuf[primIndex];
self->ext.et_801BE880.unk7C = prim;
UnkPolyFunc2(prim);
prim->tpage = 0xE;
prim->clut = 2;
prim->u0 = 0x70;
prim->u1 = 0x78;
prim->u2 = prim->u0;
prim->u3 = prim->u1;
prim->v0 = 0xF6;
prim->v1 = prim->v0;
prim->v2 = 0xFD;
prim->v3 = prim->v2;
prim->priority = self->zPriority;
prim->drawMode = DRAW_UNK02;
prim->next->x1 = self->posX.i.hi;
prim->next->y0 = self->posY.i.hi;
LOH(prim->next->r2) = 4;
LOH(prim->next->b2) = 4;
prim->next->b3 = 0x80;
} else {
DestroyEntity(self);
return;
}
self->velocityX = D_us_80181678[self->params][0];
self->velocityY = D_us_80181678[self->params][1];
self->step++;
break;

case 2:
prim = self->ext.et_801BE880.unk7C;
LOH(prim->next->tpage) += 0x180;
prim->next->x1 = self->posX.i.hi;
prim->next->y0 = self->posY.i.hi;
UnkPrimHelper(prim);
if (!AnimateEntity(D_us_801816E8, self)) {
self->animCurFrame = 0;
}
if (UnkCollisionFunc5(D_us_80181668) != 0) {
DestroyEntity(self);
return;
}
self->velocityY -= FIX(0.0625);
break;
}
}

extern s32 D_us_801816A8[][2];
extern s16 D_us_801816D0[];
Expand Down Expand Up @@ -106,9 +353,6 @@ void func_us_801BF074(Entity* self) {
}
}

extern s32 D_80097408[];
extern u16 D_us_801815F4[];
extern u16 D_us_80181604[];
extern s32 D_us_80181664;

// Secret elevator inside chicken wall
Expand Down Expand Up @@ -153,7 +397,7 @@ void func_us_801BF3F4(Entity* self) {
}
for (i = 6; i < 8; i++) {
tilePos = D_us_801815F4[i];
g_Tilemap.fg[tilePos] = *(&D_us_80181604[i] + 32);
g_Tilemap.fg[tilePos] = D_us_80181604[4][i];
}
if (D_us_80181664 != 0) {
self->posY.i.hi = 0xEE - g_Tilemap.scrollY.i.hi;
Expand All @@ -164,7 +408,7 @@ void func_us_801BF3F4(Entity* self) {
self->step = 6;
for (i = 6; i < 8; i++) {
tilePos = D_us_801815F4[i];
g_Tilemap.fg[tilePos] = *(&D_us_80181604[i] + 40);
g_Tilemap.fg[tilePos] = D_us_80181604[5][i];
}
}
}
Expand All @@ -187,7 +431,7 @@ void func_us_801BF3F4(Entity* self) {
if (!self->params) {
for (i = 0; i < 8; i++) {
tilePos = D_us_801815F4[i];
g_Tilemap.fg[tilePos] = *(&D_us_80181604[i] + 40);
g_Tilemap.fg[tilePos] = D_us_80181604[5][i];
}
}
g_Player.padSim = 0;
Expand Down Expand Up @@ -262,18 +506,18 @@ void func_us_801BF3F4(Entity* self) {
D_us_80181664 = 0;
for (i = 6; i < 8; i++) {
tilePos = D_us_801815F4[i];
g_Tilemap.fg[tilePos] = *(&D_us_80181604[i] + 32);
g_Tilemap.fg[tilePos] = D_us_80181604[4][i];
}
self->step = 1;
}
break;
}
if (collision) {
D_80097408[0] = 0x6E;
PLAYER.zPriority = D_80097408[0];
g_unkGraphicsStruct.g_zEntityCenter = 0x6E;
PLAYER.zPriority = g_unkGraphicsStruct.g_zEntityCenter;
} else {
D_80097408[0] = 0x94;
PLAYER.zPriority = D_80097408[0];
g_unkGraphicsStruct.g_zEntityCenter = 0x94;
PLAYER.zPriority = g_unkGraphicsStruct.g_zEntityCenter;
}
FntPrint("idou_flag %x\n", D_us_80181664);
}
6 changes: 5 additions & 1 deletion src/st/no1/no1.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ typedef enum EntityIDs {
// /* 0x09 */ E_STAGE_NAME_POPUP,
/* 0x0A */ E_EQUIP_ITEM_DROP = 0x0A,
// /* 0x0B */ E_RELIC_ORB,
/* 0x0C */ E_HEART_DROP = 0xC,
/* 0x0C */ E_HEART_DROP = 0x0C,
// /* 0x0D */ E_ENEMY_BLOOD,
/* 0x0E */ E_MESSAGE_BOX = 0x0E,
// /* 0x0F */ E_DUMMY_0F,
Expand All @@ -34,6 +34,9 @@ typedef enum EntityIDs {
/* 0x21 */ E_AXE_KNIGHT_AXE = 0x21,
/* 0x22 */ E_AXE_KNIGHT_AXE_2, // func_us_801CBA30
/* 0x23 */ E_UNK_ENTITY, // InitializeUnkEntity
/* 0x25 */ E_ID_25 = 0x25,
/* 0x26 */ E_ID_26,
/* 0x27 */ E_ID_27,
/* 0x2A */ E_ID_2A = 0x2A,
/* 0x2F */ E_ID_2F = 0x2F,
/* 0x30 */ E_ID_30,
Expand Down Expand Up @@ -77,6 +80,7 @@ extern EInit g_EInitInteractable;
extern EInit g_EInitCommon;

extern EInit D_us_801809C8;
extern EInit D_us_801809D4;

extern EInit D_us_801809F8;

Expand Down
Loading

0 comments on commit 3aba035

Please sign in to comment.