diff options
| author | Peppers1612 <71114652+Peppers1612@users.noreply.github.com> | 2020-12-03 16:52:26 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-03 16:52:26 -0500 |
| commit | 80c803b9ec8855fa2571f657cabe2b6eb91e7756 (patch) | |
| tree | 10a98a6812a98767414db971c03d3b518748441c /src | |
| parent | 579b87dceb94410c8d115fc75789c106cf08d5ca (diff) | |
ObjTimeblock OK (#421)
* ObjTimeblock: move data in source file
* ObjTimeblock: decomp Init()
* ObjTimeblock: decomp Destroy()
* ObjTimeblock: decomp func_80BA0058()/spawnDemoEffect()
* ObjTimeblock: decomp func_80B9FFA0()
* ObjTimeblock: decomp func_80BA040C()/mainActionFunc()
* ObjTimeblock: decomp func_80BA032C()
* ObjTimeblock: decomp func_80BA0480()
* ObjTimeblock: decomp func_80BA0514()
* ObjTimeblock: decomp func_80BA0524()
* ObjTimeblock: decomp func_80BA00CC()/toggleSceneSwitch()
* ObjTimeblock: decomp func_80BA04F8()
* ObjTimeblock: decomp func_80BA0508()/doNothing()
* ObjTimeblock: decomp func_80BA0758()
* ObjTimeblock: decomp func_80BA0768()
* ObjTimeblock: decomp func_80BA06AC()
* ObjTimeblock: decomp func_80BA083C()
* ObjTimeblock: decomp func_80BA084C()
* ObjTimeblock: decomp ObjTimeblock_Update()
* ObjTimeblock: decomp ObjTimeblock_Draw()
* ObjTimeblock: document the most obvious
* ObjTimeblock: use compiled reloc data
* ObjTimeblock: apply suggestions from mzxrules
* review
Co-authored-by: fig <fig02srl@gmail.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/overlays/actors/ovl_En_Dh/z_en_dh.c | 20 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Dha/z_en_dha.c | 4 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_En_Ssh/z_en_ssh.c | 2 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c | 321 | ||||
| -rw-r--r-- | src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.h | 15 |
5 files changed, 325 insertions, 37 deletions
diff --git a/src/overlays/actors/ovl_En_Dh/z_en_dh.c b/src/overlays/actors/ovl_En_Dh/z_en_dh.c index 4ec04ba3f..2bd32ea63 100644 --- a/src/overlays/actors/ovl_En_Dh/z_en_dh.c +++ b/src/overlays/actors/ovl_En_Dh/z_en_dh.c @@ -5,13 +5,13 @@ #define THIS ((EnDh*)thisx) typedef enum { - DH_WAIT, - DH_RETREAT, - DH_BURROW, - DH_WALK, - DH_ATTACK, - DH_DEATH, - DH_DAMAGE + /* 0 */ DH_WAIT, + /* 1 */ DH_RETREAT, + /* 2 */ DH_BURROW, + /* 3 */ DH_WALK, + /* 4 */ DH_ATTACK, + /* 5 */ DH_DEATH, + /* 6 */ DH_DAMAGE } EnDhAction; void EnDh_Init(Actor* this, GlobalContext* globalCtx); @@ -96,7 +96,7 @@ void EnDh_Init(Actor* thisx, GlobalContext* globalCtx) { Actor_ProcessInitChain(&this->actor, sInitChain); this->actor.colChkInfo.damageTable = &D_809EC620; SkelAnime_InitFlex(globalCtx, &this->skelAnime, &D_06007E88, &D_06005880, this->limbDrawTable, this->limbRotTable, - 16); + 16); ActorShape_Init(&this->actor.shape, 0.0f, &ActorShadow_DrawFunc_Circle, 64.0f); this->actor.params = ENDH_WAIT_UNDERGROUND; this->actor.colChkInfo.mass = 0xFE; @@ -502,13 +502,13 @@ void EnDh_Draw(Actor* thisx, GlobalContext* globalCtx) { gSPSegment(POLY_OPA_DISP++, 0x08, &D_80116280[2]); POLY_OPA_DISP = SkelAnime_DrawFlex(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, - this->skelAnime.dListCount, NULL, EnDh_PostLimbDraw, &this->actor, POLY_OPA_DISP); + this->skelAnime.dListCount, NULL, EnDh_PostLimbDraw, &this->actor, POLY_OPA_DISP); } else { func_80093D84(globalCtx->state.gfxCtx); gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, this->alpha); gSPSegment(POLY_XLU_DISP++, 0x08, &D_80116280[0]); POLY_XLU_DISP = SkelAnime_DrawFlex(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, - this->skelAnime.dListCount, NULL, NULL, &this->actor, POLY_XLU_DISP); + this->skelAnime.dListCount, NULL, NULL, &this->actor, POLY_XLU_DISP); } if (this->drawDirtWave) { func_80093D84(globalCtx->state.gfxCtx); diff --git a/src/overlays/actors/ovl_En_Dha/z_en_dha.c b/src/overlays/actors/ovl_En_Dha/z_en_dha.c index 13b6033d4..09d8dd845 100644 --- a/src/overlays/actors/ovl_En_Dha/z_en_dha.c +++ b/src/overlays/actors/ovl_En_Dha/z_en_dha.c @@ -255,7 +255,7 @@ void EnDha_Die(EnDha* this, GlobalContext* globalCtx) { Vec3f vector; Player* player = PLAYER; - if ((player->stateFlags2 & 0x80) && (&this->actor == player->actor.parent)) { + if ((player->stateFlags2 & 0x80) && (&this->actor == player->actor.parent)) { player->stateFlags2 &= ~0x80; player->actor.parent = NULL; player->unk_850 = 200; @@ -305,7 +305,7 @@ void EnDha_UpdateHealth(EnDha* this, GlobalContext* globalCtx) { } } } - if ((this->actor.parent != NULL) && (this->actor.parent->params == ENDH_DEATH)) { + if ((this->actor.parent != NULL) && (this->actor.parent->params == ENDH_DEATH)) { EnDha_SetupDeath(this); } } diff --git a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c index 87a5a542f..fb6f17c21 100644 --- a/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c +++ b/src/overlays/actors/ovl_En_Ssh/z_en_ssh.c @@ -860,5 +860,5 @@ void EnSsh_Draw(Actor* thisx, GlobalContext* globalCtx) { gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(blinkTex[this->blinkState])); CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_en_ssh.c", 2336); SkelAnime_DrawOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.limbDrawTbl, EnSsh_OverrideLimbDraw, - EnSsh_PostLimbDraw, &this->actor); + EnSsh_PostLimbDraw, &this->actor); } diff --git a/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c b/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c index cb0c3b08a..4ff7dc55c 100644 --- a/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c +++ b/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.c @@ -15,7 +15,20 @@ void ObjTimeblock_Destroy(Actor* thisx, GlobalContext* globalCtx); void ObjTimeblock_Update(Actor* thisx, GlobalContext* globalCtx); void ObjTimeblock_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +void ObjTimeblock_SetupNormal(ObjTimeblock* this); +void ObjTimeblock_SetupAltBehaviorVisible(ObjTimeblock* this); +void ObjTimeblock_SetupAltBehaviourNotVisible(ObjTimeblock* this); + +s32 ObjTimeblock_WaitForOcarina(ObjTimeblock* this, GlobalContext* globalCtx); +s32 ObjTimeblock_WaitForSong(ObjTimeblock* this, GlobalContext* globalCtx); +void ObjTimeblock_DoNothing(ObjTimeblock* this, GlobalContext* globalCtx); +void ObjTimeblock_Normal(ObjTimeblock* this, GlobalContext* globalCtx); +void ObjTimeblock_AltBehaviorVisible(ObjTimeblock* this, GlobalContext* globalCtx); +void ObjTimeblock_AltBehaviourNotVisible(ObjTimeblock* this, GlobalContext* globalCtx); + +extern Gfx D_06000980[]; +extern CollisionHeader D_06000B30; + const ActorInit Obj_Timeblock_InitVars = { ACTOR_OBJ_TIMEBLOCK, ACTORTYPE_ITEMACTION, @@ -27,41 +40,307 @@ const ActorInit Obj_Timeblock_InitVars = { (ActorFunc)ObjTimeblock_Update, (ActorFunc)ObjTimeblock_Draw, }; -*/ -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80B9FFA0.s") -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA0058.s") +typedef struct { + /* 0x00 */ f32 scale; + /* 0x04 */ f32 height; + /* 0x08 */ s16 demoEffectParams; +} ObjTimeblockSizeOptions; // size = 0x0C + +static ObjTimeblockSizeOptions sSizeOptions[] = { + { 1.0, 60.0, 0x0018 }, + { 0.60, 40.0, 0x0019 }, +}; + +static f32 sRanges[] = { 60.0, 100.0, 140.0, 180.0, 220.0, 260.0, 300.0, 300.0 }; + +static InitChainEntry sInitChain[] = { + ICHAIN_U8(unk_1F, 2, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneForward, 1800, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneScale, 300, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneDownward, 1500, ICHAIN_STOP), +}; + +static Color_RGB8 sPrimColors[] = { + { 100, 120, 140 }, { 80, 140, 200 }, { 100, 150, 200 }, { 100, 200, 240 }, + { 80, 110, 140 }, { 70, 160, 225 }, { 80, 100, 130 }, { 100, 110, 190 }, +}; + +u32 ObjTimeblock_CalculateIsVisible(ObjTimeblock* this) { + if (!((this->dyna.actor.params >> 10) & 1)) { + if (this->unk_177 == 0) { + return this->unk_175; + } else { + u8 temp = ((this->dyna.actor.params >> 15) & 1) ? true : false; + if (this->unk_177 == 1) { + return this->unk_174 ^ temp; + } else { + u8 linkIsYoung = (LINK_AGE_IN_YEARS == YEARS_CHILD) ? true : false; + return this->unk_174 ^ temp ^ linkIsYoung; + } + } + } else { + return (((this->dyna.actor.params >> 15) & 1) ? true : false) ^ this->unk_174; + } +} + +void ObjTimeblock_SpawnDemoEffect(ObjTimeblock* this, GlobalContext* globalCtx) { + Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_DEMO_EFFECT, this->dyna.actor.posRot.pos.x, + this->dyna.actor.posRot.pos.y, this->dyna.actor.posRot.pos.z, 0, 0, 0, + sSizeOptions[(this->dyna.actor.params >> 8) & 1].demoEffectParams); +} + +void ObjTimeblock_ToggleSwitchFlag(GlobalContext* globalCtx, s32 flag) { + if (Flags_GetSwitch(globalCtx, flag)) { + Flags_UnsetSwitch(globalCtx, flag); + } else { + Flags_SetSwitch(globalCtx, flag); + } +} + +void ObjTimeblock_Init(Actor* thisx, GlobalContext* globalCtx) { + ObjTimeblock* this = THIS; + s32 pad; + UNK_PTR colHeader = NULL; + + DynaPolyInfo_SetActorMove(&this->dyna, DPM_UNK); + this->dyna.actor.posRot.rot.z = this->dyna.actor.shape.rot.z = 0; + + DynaPolyInfo_Alloc(&D_06000B30, &colHeader); + + this->dyna.dynaPolyId = + DynaPolyInfo_RegisterActor(globalCtx, &globalCtx->colCtx.dyna, &this->dyna.actor, colHeader); + + Actor_ProcessInitChain(&this->dyna.actor, sInitChain); + Actor_SetScale(&this->dyna.actor, sSizeOptions[(this->dyna.actor.params >> 8) & 1].scale); + + if ((this->dyna.actor.params >> 6) & 1) { + this->unk_177 = 0; + } else { + this->unk_177 = ((this->dyna.actor.params & 0x3F) < 0x38) ? 2 : 1; + } + + this->songObserverFunc = ObjTimeblock_WaitForOcarina; + + Actor_SetHeight(&this->dyna.actor, sSizeOptions[(this->dyna.actor.params >> 8) & 1].height); + + this->unk_174 = (Flags_GetSwitch(globalCtx, this->dyna.actor.params & 0x3F)) ? true : false; + this->unk_175 = ((this->dyna.actor.params >> 15) & 1) ? true : false; + this->isVisible = ObjTimeblock_CalculateIsVisible(this); + + if (!((this->dyna.actor.params >> 10) & 1)) { + ObjTimeblock_SetupNormal(this); + } else if (this->isVisible) { + ObjTimeblock_SetupAltBehaviorVisible(this); + } else { + ObjTimeblock_SetupAltBehaviourNotVisible(this); + } + + // "Block of time" + osSyncPrintf("時のブロック (<arg> %04xH <type> save:%d color:%d range:%d move:%d)\n", (u16)this->dyna.actor.params, + this->unk_177, this->dyna.actor.initPosRot.rot.z & 7, (this->dyna.actor.params >> 11) & 7, + (this->dyna.actor.params >> 10) & 1); +} + +void ObjTimeblock_Destroy(Actor* thisx, GlobalContext* globalCtx) { + DynaPolyInfo_Free(globalCtx, &globalCtx->colCtx.dyna, THIS->dyna.dynaPolyId); +} + +u8 ObjTimeblock_PlayerIsInRange(ObjTimeblock* this, GlobalContext* globalCtx) { + if (this->isVisible && func_80043590(&this->dyna)) { + return false; + } + + if (this->dyna.actor.xzDistFromLink <= sRanges[(this->dyna.actor.params >> 11) & 7]) { + Vec3f distance; + f32 blockSize; + + func_8002DBD0(&this->dyna.actor, &distance, &PLAYER->actor.posRot.pos); + blockSize = this->dyna.actor.scale.x * 50.0f + 6.0f; + // Return true if player's xz position is not inside the block + if (blockSize < fabsf(distance.x) || blockSize < fabsf(distance.z)) { + return true; + } + } + + return false; +} + +s32 ObjTimeblock_WaitForOcarina(ObjTimeblock* this, GlobalContext* globalCtx) { + Player* player = PLAYER; + + if (ObjTimeblock_PlayerIsInRange(this, globalCtx)) { + if (player->stateFlags2 & 0x1000000) { + func_8010BD58(globalCtx, 1); + this->songObserverFunc = ObjTimeblock_WaitForSong; + } else { + player->stateFlags2 |= 0x800000; + } + } + return false; +} + +s32 ObjTimeblock_WaitForSong(ObjTimeblock* this, GlobalContext* globalCtx) { + if (globalCtx->msgCtx.unk_E3EE == 4) { + this->songObserverFunc = ObjTimeblock_WaitForOcarina; + } + if (globalCtx->msgCtx.unk_E3EC == 10) { + if (this->unk_172 == 254) { + this->songEndTimer = 110; + } else { + this->songEndTimer--; + if (this->songEndTimer == 0) { + return true; + } + } + } + return false; +} + +void ObjTimeblock_SetupDoNothing(ObjTimeblock* this) { + this->actionFunc = ObjTimeblock_DoNothing; +} + +void ObjTimeblock_DoNothing(ObjTimeblock* this, GlobalContext* globalCtx) { +} + +void ObjTimeblock_SetupNormal(ObjTimeblock* this) { + this->actionFunc = ObjTimeblock_Normal; +} + +void ObjTimeblock_Normal(ObjTimeblock* this, GlobalContext* globalCtx) { + u32 newIsVisible; + + if (this->songObserverFunc(this, globalCtx) && this->demoEffectTimer <= 0) { + ObjTimeblock_SpawnDemoEffect(this, globalCtx); + this->demoEffectTimer = 160; + + // Possibly points the camera to this actor + func_80080480(globalCtx, &this->dyna.actor); + // "◯◯◯◯ Time Block Attention Camera (frame counter %d)\n" + osSyncPrintf("◯◯◯◯ Time Block 注目カメラ (frame counter %d)\n", globalCtx->state.frames); + + this->demoEffectFirstPartTimer = 12; + + if (this->unk_177 == 0) { + this->dyna.actor.params ^= 0x8000; + } else { + ObjTimeblock_ToggleSwitchFlag(globalCtx, this->dyna.actor.params & 0x3F); + } + } + + this->unk_172 = globalCtx->msgCtx.unk_E3EC; + if (this->demoEffectFirstPartTimer > 0) { + this->demoEffectFirstPartTimer--; + if (this->demoEffectFirstPartTimer == 0) { + if (this->unk_177 == 0) { + this->unk_175 = ((this->dyna.actor.params >> 15) & 1) ? true : false; + } else { + this->unk_174 = (Flags_GetSwitch(globalCtx, this->dyna.actor.params & 0x3F)) ? true : false; + } + } + } + + newIsVisible = ObjTimeblock_CalculateIsVisible(this); + if (this->unk_177 == 1 && newIsVisible != this->isVisible) { + ObjTimeblock_SetupDoNothing(this); + } + this->isVisible = newIsVisible; + + if (this->demoEffectTimer == 50) { + func_80078884(NA_SE_SY_TRE_BOX_APPEAR); + } +} + +void func_80BA06AC(ObjTimeblock* this, GlobalContext* globalCtx) { + s32 switchFlag = this->dyna.actor.params & 0x3F; + this->unk_172 = globalCtx->msgCtx.unk_E3EC; + + if (this->demoEffectFirstPartTimer > 0 && --this->demoEffectFirstPartTimer == 0) { + this->unk_174 = (Flags_GetSwitch(globalCtx, switchFlag)) ? true : false; + } + + this->isVisible = ObjTimeblock_CalculateIsVisible(this); + this->unk_176 = (Flags_GetSwitch(globalCtx, switchFlag)) ? true : false; +} + +void ObjTimeblock_SetupAltBehaviorVisible(ObjTimeblock* this) { + this->actionFunc = ObjTimeblock_AltBehaviorVisible; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA00CC.s") +void ObjTimeblock_AltBehaviorVisible(ObjTimeblock* this, GlobalContext* globalCtx) { + if (this->songObserverFunc(this, globalCtx) && this->demoEffectTimer <= 0) { + this->demoEffectFirstPartTimer = 12; + ObjTimeblock_SpawnDemoEffect(this, globalCtx); + this->demoEffectTimer = 160; + func_80080480(globalCtx, &this->dyna.actor); + // "Time Block Attention Camera (frame counter)" + osSyncPrintf("◯◯◯◯ Time Block 注目カメラ (frame counter %d)\n", globalCtx->state.frames); + ObjTimeblock_ToggleSwitchFlag(globalCtx, this->dyna.actor.params & 0x3F); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/ObjTimeblock_Init.s") + func_80BA06AC(this, globalCtx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/ObjTimeblock_Destroy.s") + if (this->demoEffectTimer == 50) { + func_80078884(NA_SE_SY_TRE_BOX_APPEAR); + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA032C.s") + if (!this->isVisible && this->demoEffectTimer <= 0) { + ObjTimeblock_SetupAltBehaviourNotVisible(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA040C.s") +void ObjTimeblock_SetupAltBehaviourNotVisible(ObjTimeblock* this) { + this->actionFunc = ObjTimeblock_AltBehaviourNotVisible; +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA0480.s") +void ObjTimeblock_AltBehaviourNotVisible(ObjTimeblock* this, GlobalContext* globalCtx) { + s32 switchFlag = this->dyna.actor.params & 0x3F; + s8 switchFlagIsSet = (Flags_GetSwitch(globalCtx, switchFlag)) ? true : false; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA04F8.s") + if (this->unk_176 ^ switchFlagIsSet && switchFlagIsSet ^ (((this->dyna.actor.params >> 15) & 1) ? true : false)) { + if (this->demoEffectTimer <= 0) { + ObjTimeblock_SpawnDemoEffect(this, globalCtx); + this->demoEffectTimer = 160; + } + this->demoEffectFirstPartTimer = 12; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA0508.s") + func_80BA06AC(this, globalCtx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA0514.s") + if (this->isVisible && this->demoEffectTimer <= 0) { + ObjTimeblock_SetupAltBehaviorVisible(this); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA0524.s") +void ObjTimeblock_Update(Actor* thisx, GlobalContext* globalCtx) { + ObjTimeblock* this = THIS; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA06AC.s") + this->actionFunc(this, globalCtx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA0758.s") + if (this->demoEffectTimer > 0) { + this->demoEffectTimer--; + } -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA0768.s") + if (this->isVisible) { + func_8003EC50(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId); + } else { + func_8003EBF8(globalCtx, &globalCtx->colCtx.dyna, this->dyna.dynaPolyId); + } +} -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA083C.s") +void ObjTimeblock_Draw(Actor* thisx, GlobalContext* globalCtx) { + if (THIS->isVisible) { + Color_RGB8* primColor = &sPrimColors[THIS->dyna.actor.initPosRot.rot.z & 7]; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/func_80BA084C.s") + OPEN_DISPS(globalCtx->state.gfxCtx, "../z_obj_timeblock.c", 762); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/ObjTimeblock_Update.s") + func_80093D18(globalCtx->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_obj_timeblock.c", 766), + G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, primColor->r, primColor->g, primColor->b, 255); + gSPDisplayList(POLY_OPA_DISP++, D_06000980); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_Obj_Timeblock/ObjTimeblock_Draw.s") + CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_obj_timeblock.c", 772); + } +} diff --git a/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.h b/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.h index 0a2cf9e40..c642608ff 100644 --- a/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.h +++ b/src/overlays/actors/ovl_Obj_Timeblock/z_obj_timeblock.h @@ -6,13 +6,22 @@ struct ObjTimeblock; +typedef s32 (*ObjTimeblockSongObserverFunc)(struct ObjTimeblock*, GlobalContext*); typedef void (*ObjTimeblockActionFunc)(struct ObjTimeblock*, GlobalContext*); typedef struct ObjTimeblock { /* 0x0000 */ DynaPolyActor dyna; - /* 0x0164 */ char unk_164[0x4]; - /* 0x0168 */ ObjTimeblockActionFunc actionFunc; - /* 0x016C */ char unk_16C[0x10]; + /* 0x0164 */ ObjTimeblockActionFunc actionFunc; + /* 0x0168 */ ObjTimeblockSongObserverFunc songObserverFunc; + /* 0x016C */ s16 demoEffectTimer; + /* 0x016E */ s16 songEndTimer; + /* 0x0170 */ s16 demoEffectFirstPartTimer; + /* 0x0172 */ u16 unk_172; + /* 0x0174 */ u8 unk_174; + /* 0x0175 */ u8 unk_175; + /* 0x0176 */ u8 unk_176; + /* 0x0177 */ u8 unk_177; + /* 0x0178 */ u8 isVisible; } ObjTimeblock; // size = 0x017C extern const ActorInit Obj_Timeblock_InitVars; |
