diff --git a/include/functions.h b/include/functions.h index 367d784ae0..e16858aa1a 100644 --- a/include/functions.h +++ b/include/functions.h @@ -696,7 +696,7 @@ void func_800B40E0(GlobalContext* globalCtx, Light* light, MtxF* arg2, s32 arg3, void func_800B42F8(Actor* actor, Lights* mapper, GlobalContext* globalCtx); // void func_800B4A98(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); void func_800B4AEC(GlobalContext* globalCtx, Actor* actor, f32 param_3); -void func_800B4B50(Actor* actor, s32 iParm2, GlobalContext* globalCtx); +void func_800B4B50(Actor* actor, Lights* mapper, GlobalContext* globalCtx); void func_800B4EDC(GlobalContext* globalCtx, Vec3f* pzParm2, Vec3f* pzParm3, f32* pfParm4); // void func_800B4F40(TargetContext* targetCtx, s32 param_2, UNK_TYPE4 param_3, UNK_TYPE4 param_4, UNK_TYPE4 param_5); void func_800B4F78(TargetContext* targetCtx, u8 type, GlobalContext* globalCtx); @@ -1110,7 +1110,7 @@ u32 func_800C9E40(CollisionContext* colCtx, CollisionPoly* polygon, s32 index); u32 func_800C9E88(CollisionContext* colCtx, CollisionPoly* polygon, s32 index); // void func_800C9EBC(GlobalContext* globalCtx, CollisionContext* colCtx, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); s32 func_800CA1AC(GlobalContext* globalCtx, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox); -void func_800CA1E8(GlobalContext* globalCtx, CollisionContext* colCtx, f32 arg2, f32 arg3, f32* arg4, UNK_PTR arg5); +s32 func_800CA1E8(GlobalContext* globalCtx, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox); // void func_800CA22C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // void func_800CA568(void); // void func_800CA634(void); @@ -1687,7 +1687,7 @@ s16 ActorCutscene_GetLength(s16 index); // void func_800F2178(void); s16 ActorCutscene_GetCurrentCamera(s16 index); // void func_800F21CC(void); -// UNK_TYPE4 func_800F22C4(s16 param_1, Actor* actor); +s32 func_800F22C4(s16 param_1, Actor* actor); void ActorCutscene_SetReturnCamera(s16 index); // void func_800F23E0(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // void func_800F2478(void); @@ -3992,7 +3992,7 @@ UNK_TYPE func_801A51F0(UNK_TYPE arg0); void func_801A5BD0(s32 param_1); // void func_801A5C28(void); // void func_801A5C8C(void); -// void func_801A5CFC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); +void func_801A5CFC(u16 sfxId, Vec3f* param_2, u8 param_3, f32* param_4, f32* param_5, s8* param_6); // void func_801A5DDC(void); // void func_801A5F7C(void); // void func_801A6430(void); diff --git a/include/variables.h b/include/variables.h index 258cec4df8..f2fd0f2b4e 100644 --- a/include/variables.h +++ b/include/variables.h @@ -1876,8 +1876,8 @@ extern UNK_PTR D_801DB478[7]; // extern UNK_TYPE1 D_801DB49C; // extern UNK_TYPE2 D_801DB4A0; extern UNK_TYPE D_801DB4A4; -// extern UNK_TYPE1 D_801DB4B0; -// extern UNK_TYPE1 D_801DB4B8; +extern f32 D_801DB4B0; +extern s8 D_801DB4B8; // extern UNK_TYPE1 D_801DB4C0; // extern UNK_TYPE1 D_801DB4C4; // extern UNK_TYPE1 D_801DB4C8; diff --git a/spec b/spec index eb6fbaad6d..ae8b116fe0 100644 --- a/spec +++ b/spec @@ -1075,9 +1075,7 @@ beginseg name "ovl_Obj_Syokudai" compress include "build/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.o" - include "build/data/ovl_Obj_Syokudai/ovl_Obj_Syokudai.data.o" - include "build/data/ovl_Obj_Syokudai/ovl_Obj_Syokudai.bss.o" - include "build/data/ovl_Obj_Syokudai/ovl_Obj_Syokudai.reloc.o" + include "build/src/overlays/actors/ovl_Obj_Syokudai/ovl_Obj_Syokudai_reloc.o" endseg beginseg diff --git a/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c b/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c index 55e67d05f1..40c60061c8 100644 --- a/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c +++ b/src/overlays/actors/ovl_Bg_Lotus/z_bg_lotus.c @@ -165,10 +165,10 @@ void BgLotus_WaitToAppear(BgLotus* this, GlobalContext* globalCtx) { void BgLotus_Update(Actor* thisx, GlobalContext* globalCtx) { BgLotus* this = THIS; s32 pad; - void* sp2C; + WaterBox* waterBox; func_800CA1E8(globalCtx, &globalCtx->colCtx, this->dyna.actor.world.pos.x, this->dyna.actor.world.pos.z, - &this->height, &sp2C); + &this->height, &waterBox); this->actionFunc(this, globalCtx); } diff --git a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h index bc31953c86..e022d21a0c 100644 --- a/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h +++ b/src/overlays/actors/ovl_En_Arrow/z_en_arrow.h @@ -9,7 +9,9 @@ typedef void (*EnArrowActionFunc)(struct EnArrow*, GlobalContext*); typedef struct EnArrow { /* 0x0000 */ Actor actor; - /* 0x0144 */ char unk_144[0x130]; + /* 0x0144 */ char unk_144[0x7C]; + /* 0x01C0 */ s32 unk_1C0; + /* 0x01C4 */ char unk_1C4[0xB0]; /* 0x0274 */ EnArrowActionFunc actionFunc; } EnArrow; // size = 0x278 diff --git a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c index 6c2fcb01b0..a6297afed2 100644 --- a/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c +++ b/src/overlays/actors/ovl_En_Firefly/z_en_firefly.c @@ -234,7 +234,7 @@ s32 EnFirefly_SeekTorch(EnFirefly* this, GlobalContext* globalCtx) { } while (findTorch != NULL) { - if ((findTorch->actor.id == ACTOR_OBJ_SYOKUDAI) && (findTorch->unk_1DC != 0)) { + if ((findTorch->actor.id == ACTOR_OBJ_SYOKUDAI) && (findTorch->snuffTimer != OBJ_SYOKUDAI_SNUFF_OUT)) { currentDist = Actor_DistanceBetweenActors(&this->actor, &findTorch->actor); if (currentDist < currentMinDist) { currentMinDist = currentDist; diff --git a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c index 92f206b47f..997270a6b8 100644 --- a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c +++ b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.c @@ -1,4 +1,11 @@ +/* + * File: z_obj_syokudai.c + * Overlay: ovl_Obj_Syokudai + * Description: Torch + */ + #include "z_obj_syokudai.h" +#include "overlays/actors/ovl_En_Arrow/z_en_arrow.h" #define FLAGS 0x00000410 @@ -9,7 +16,10 @@ void ObjSyokudai_Destroy(Actor* thisx, GlobalContext* globalCtx); void ObjSyokudai_Update(Actor* thisx, GlobalContext* globalCtx); void ObjSyokudai_Draw(Actor* thisx, GlobalContext* globalCtx); -#if 0 +extern Gfx D_060003A0[]; // sObjectSyokudaiTypeSwitchCausesFlameDL +extern Gfx D_06000870[]; // sObjectSyokudaiTypeNoSwitchDL +extern Gfx D_06000B90[]; // sObjectSyokudaiTypeFlameCausesSwitchDL + const ActorInit Obj_Syokudai_InitVars = { ACTOR_OBJ_SYOKUDAI, ACTORCAT_PROP, @@ -22,38 +32,289 @@ const ActorInit Obj_Syokudai_InitVars = { (ActorFunc)ObjSyokudai_Draw, }; -// static ColliderCylinderInit sCylinderInit = { -static ColliderCylinderInit D_808BCCC0 = { - { COLTYPE_METAL, AT_NONE, AC_ON | AC_HARD | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_2, COLSHAPE_CYLINDER, }, - { ELEMTYPE_UNK2, { 0x00100000, 0x00, 0x00 }, { 0xF6CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON | BUMP_HOOKABLE, OCELEM_ON, }, +static ColliderCylinderInit sStandColliderInit = { + { + COLTYPE_METAL, + AT_NONE, + AC_ON | AC_HARD | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_2, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK2, + { 0x00100000, 0x00, 0x00 }, + { 0xF6CFFFFF, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON | BUMP_HOOKABLE, + OCELEM_ON, + }, { 12, 45, 0, { 0, 0, 0 } }, }; -// static ColliderCylinderInit sCylinderInit = { -static ColliderCylinderInit D_808BCCEC = { - { COLTYPE_NONE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_NONE, OC2_NONE, COLSHAPE_CYLINDER, }, - { ELEMTYPE_UNK2, { 0x00000000, 0x00, 0x00 }, { 0x00000820, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_NONE, }, +static ColliderCylinderInit sFlameColliderInit = { + { + COLTYPE_NONE, + AT_NONE, + AC_ON | AC_TYPE_PLAYER, + OC1_NONE, + OC2_NONE, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK2, + { 0x00000000, 0x00, 0x00 }, + { 0x00000820, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_NONE, + }, { 15, 45, 45, { 0, 0, 0 } }, }; -// static InitChainEntry sInitChain[] = { -static InitChainEntry D_808BCD18[] = { +static InitChainEntry sInitChain[] = { ICHAIN_VEC3F_DIV1000(scale, 1000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneScale, 800, ICHAIN_CONTINUE), ICHAIN_F32(uncullZoneDownward, 800, ICHAIN_STOP), }; -#endif +static u8 sColTypes[] = { COLTYPE_METAL, COLTYPE_WOOD, COLTYPE_WOOD }; -extern ColliderCylinderInit D_808BCCC0; -extern ColliderCylinderInit D_808BCCEC; -extern InitChainEntry D_808BCD18[]; +static Gfx* sDLists[] = { D_060003A0, D_06000B90, D_06000870 }; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Syokudai/ObjSyokudai_Init.s") +static s32 sNumLitTorchesInGroup; -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Syokudai/ObjSyokudai_Destroy.s") +void ObjSyokudai_Init(Actor* thisx, GlobalContext* globalCtx) { + ObjSyokudai* this = THIS; + s32 pad; + s32 type = OBJ_SYOKUDAI_GET_TYPE(thisx); + s32 switchFlag = OBJ_SYOKUDAI_GET_SWITCH_FLAG(thisx); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Syokudai/ObjSyokudai_Update.s") + Actor_ProcessInitChain(thisx, sInitChain); + func_800B4AEC(globalCtx, thisx, 50.0f); + ActorShape_Init(&thisx->shape, 0.0f, func_800B4B50, 1.0f); + Collider_InitAndSetCylinder(globalCtx, &this->standCollider, thisx, &sStandColliderInit); + this->standCollider.base.colType = sColTypes[OBJ_SYOKUDAI_GET_TYPE(thisx)]; + Collider_InitAndSetCylinder(globalCtx, &this->flameCollider, thisx, &sFlameColliderInit); + thisx->colChkInfo.mass = MASS_IMMOVABLE; + Lights_PointGlowSetInfo(&this->lightInfo, thisx->world.pos.x, thisx->world.pos.y + OBJ_SYOKUDAI_GLOW_HEIGHT, + thisx->world.pos.z, 0xFF, 0xFF, 0xB4, -1); + this->lightNode = LightContext_InsertLight(globalCtx, &globalCtx->lightCtx, &this->lightInfo); -#pragma GLOBAL_ASM("asm/non_matchings/overlays/ovl_Obj_Syokudai/ObjSyokudai_Draw.s") + if (OBJ_SYOKUDAI_GET_START_LIT(thisx) || + ((type != OBJ_SYOKUDAI_TYPE_NO_SWITCH || switchFlag != 0x7F) && Flags_GetSwitch(globalCtx, switchFlag))) { + + s32 groupSize = OBJ_SYOKUDAI_GET_GROUP_SIZE(thisx); + + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER; + if (groupSize != 0) { + sNumLitTorchesInGroup = groupSize; + } + } else { + sNumLitTorchesInGroup = 0; + } + this->flameTexScroll = (u32)(Rand_ZeroOne() * OBJ_SYOKUDAI_SNUFF_DEFAULT); + Actor_SetHeight(thisx, 60.0f); +} + +void ObjSyokudai_Destroy(Actor* thisx, GlobalContext* globalCtx) { + ObjSyokudai* this = THIS; + + Collider_DestroyCylinder(globalCtx, &this->standCollider); + Collider_DestroyCylinder(globalCtx, &this->flameCollider); + LightContext_RemoveLight(globalCtx, &globalCtx->lightCtx, this->lightNode); +} + +void ObjSyokudai_Update(Actor* thisx, GlobalContext* globalCtx2) { + GlobalContext* globalCtx = globalCtx2; + ObjSyokudai* this = THIS; + s32 groupSize = OBJ_SYOKUDAI_GET_GROUP_SIZE(thisx); + s32 switchFlag = OBJ_SYOKUDAI_GET_SWITCH_FLAG(thisx); + s32 type = OBJ_SYOKUDAI_GET_TYPE(thisx); + s32 pad0; + WaterBox* waterBox; + f32 waterSurface; + s32 lightRadius = -1; + u8 lightIntensity = 0; + Player* player; + s32 pad1; + + if (this->pendingAction != OBJ_SYOKUDAI_PENDING_ACTION_NONE) { + if (ActorCutscene_GetCurrentIndex() != thisx->cutscene) { + if (ActorCutscene_GetCanPlayNext(thisx->cutscene) != 0) { + ActorCutscene_StartAndSetUnkLinkFields(thisx->cutscene, thisx); + if (this->pendingAction >= OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_AND_SWITCH) { + Actor_SetSwitchFlag(globalCtx, switchFlag); + } + } else { + ActorCutscene_SetIntentToPlay(thisx->cutscene); + } + } else if (func_800F22C4(thisx->cutscene, thisx) != 0) { + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER; + this->pendingAction = OBJ_SYOKUDAI_PENDING_ACTION_NONE; + } + } else { + if (func_800CA1E8(globalCtx, &globalCtx->colCtx, thisx->world.pos.x, thisx->world.pos.z, &waterSurface, + &waterBox) && + ((waterSurface - thisx->world.pos.y) > OBJ_SYOKUDAI_FLAME_HEIGHT)) { + + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_OUT; + if (type == OBJ_SYOKUDAI_TYPE_FLAME_CAUSES_SWITCH) { + Actor_UnsetSwitchFlag(globalCtx, switchFlag); + if (groupSize != 0) { + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_GROUP_BY_WATER; + } + } + } else { + s32 interaction = OBJ_SYOKUDAI_INTERACTION_NONE; + u32 flameColliderHurtboxDmgFlags = 0; + player = PLAYER; + + if (OBJ_SYOKUDAI_GET_START_LIT(thisx)) { + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER; + } + if (groupSize != 0) { + if (Flags_GetSwitch(globalCtx, switchFlag)) { + if (this->snuffTimer == OBJ_SYOKUDAI_SNUFF_OUT) { + if (type != OBJ_SYOKUDAI_TYPE_SWITCH_CAUSES_FLAME) { + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER; + } else { + this->pendingAction = OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_NO_SWITCH; + } + } else if (this->snuffTimer > OBJ_SYOKUDAI_SNUFF_OUT) { + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER; + } + } else if (this->snuffTimer <= OBJ_SYOKUDAI_SNUFF_NEVER) { + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_DEFAULT; + } + } + if (this->flameCollider.base.acFlags & AC_HIT) { + flameColliderHurtboxDmgFlags = this->flameCollider.info.acHitInfo->toucher.dmgFlags; + if (this->flameCollider.info.acHitInfo->toucher.dmgFlags & 0x820) { + interaction = OBJ_SYOKUDAI_INTERACTION_ARROW_FA; + } + } else if (player->itemActionParam == 7) { + Vec3f stickTipSeparationVec; + + Math_Vec3f_Diff(&player->swordInfo[0].tip, &thisx->world.pos, &stickTipSeparationVec); + stickTipSeparationVec.y -= OBJ_SYOKUDAI_STICK_IGNITION_HEIGHT; + if (SQXYZ(stickTipSeparationVec) < SQ(OBJ_SYOKUDAI_STICK_IGNITION_RADIUS)) { + interaction = OBJ_SYOKUDAI_INTERACTION_STICK; + } + } + if (interaction != OBJ_SYOKUDAI_INTERACTION_NONE) { + if (this->snuffTimer != OBJ_SYOKUDAI_SNUFF_OUT) { + if (interaction <= OBJ_SYOKUDAI_INTERACTION_STICK) { + if (player->unk_B28 == 0) { + player->unk_B28 = 0xD2; + func_8019F1C0(&thisx->projectedPos, NA_SE_EV_FLAME_IGNITION); + } else if (player->unk_B28 < 0xC8) { + player->unk_B28 = 0xC8; + } + } else if (flameColliderHurtboxDmgFlags & 0x20) { + Actor* flameColliderHurtboxActor = this->flameCollider.base.ac; + + if ((flameColliderHurtboxActor->update != NULL) && + (flameColliderHurtboxActor->id == ACTOR_EN_ARROW)) { + + flameColliderHurtboxActor->params = 0; + ((EnArrow*)flameColliderHurtboxActor)->unk_1C0 = 0x800; + } + } + if ((this->snuffTimer > OBJ_SYOKUDAI_SNUFF_NEVER) && + (this->snuffTimer < (OBJ_SYOKUDAI_SNUFF_TIMER_INITIAL(groupSize))) && + (type != OBJ_SYOKUDAI_TYPE_SWITCH_CAUSES_FLAME)) { + + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_TIMER_INITIAL(groupSize); + } + } else if ((type != OBJ_SYOKUDAI_TYPE_SWITCH_CAUSES_FLAME) && + (((interaction >= OBJ_SYOKUDAI_INTERACTION_ARROW_FA) && + (flameColliderHurtboxDmgFlags & 0x800)) || + ((interaction <= OBJ_SYOKUDAI_INTERACTION_STICK) && (player->unk_B28 != 0)))) { + if ((interaction < OBJ_SYOKUDAI_INTERACTION_NONE) && (player->unk_B28 < 0xC8)) { + player->unk_B28 = 0xC8; + } + if (groupSize == 0) { + if ((type == OBJ_SYOKUDAI_TYPE_NO_SWITCH) && (switchFlag == 0x7F)) { + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER; + } else if (thisx->cutscene >= 0) { + this->pendingAction = OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_AND_SWITCH; + } else { + Actor_SetSwitchFlag(globalCtx, switchFlag); + this->snuffTimer = OBJ_SYOKUDAI_SNUFF_NEVER; + } + } else { + if (++sNumLitTorchesInGroup >= groupSize) { + this->pendingAction = OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_AND_SWITCH; + } else { + this->snuffTimer = + OBJ_SYOKUDAI_SNUFF_TIMER_INITIAL(groupSize) + OBJ_SYOKUDAI_SNUFF_TIMER_JUST_LIT_BONUS; + } + } + func_801A5CFC(NA_SE_EV_FLAME_IGNITION, &thisx->projectedPos, 4, &D_801DB4B0, &D_801DB4B0, + &D_801DB4B8); + } + } + } + } + Collider_UpdateCylinder(thisx, &this->standCollider); + CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->standCollider.base); + CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->standCollider.base); + Collider_UpdateCylinder(thisx, &this->flameCollider); + CollisionCheck_SetAC(globalCtx, &globalCtx->colChkCtx, &this->flameCollider.base); + if ((this->snuffTimer > OBJ_SYOKUDAI_SNUFF_OUT) && (--this->snuffTimer == OBJ_SYOKUDAI_SNUFF_OUT) && + (type != OBJ_SYOKUDAI_TYPE_SWITCH_CAUSES_FLAME)) { + sNumLitTorchesInGroup--; + } + if (this->snuffTimer != OBJ_SYOKUDAI_SNUFF_OUT) { + s32 pad2; + + if ((this->snuffTimer <= OBJ_SYOKUDAI_SNUFF_NEVER) || (this->snuffTimer >= OBJ_SYOKUDAI_SNUFF_DEFAULT)) { + lightRadius = OBJ_SYOKUDAI_LIGHT_RADIUS_MAX; + } else { + lightRadius = (f32)this->snuffTimer * OBJ_SYOKUDAI_LIGHT_RADIUS_MAX / OBJ_SYOKUDAI_SNUFF_DEFAULT; + } + lightIntensity = Rand_ZeroOne() * 127; + lightIntensity += 128; + func_800B9010(thisx, NA_SE_EV_TORCH - SFX_FLAG); + } + Lights_PointSetColorAndRadius(&this->lightInfo, lightIntensity, lightIntensity * 0.7f, 0, lightRadius); + this->flameTexScroll++; +} + +void ObjSyokudai_Draw(Actor* thisx, GlobalContext* globalCtx) { + ObjSyokudai* this = THIS; + s32 pad; + s32 groupSize = OBJ_SYOKUDAI_GET_GROUP_SIZE(thisx); + f32 flameScale; + + OPEN_DISPS(globalCtx->state.gfxCtx); + func_8012C28C(globalCtx->state.gfxCtx); + gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_OPA_DISP++, sDLists[OBJ_SYOKUDAI_GET_TYPE(thisx)]); + if (this->snuffTimer != OBJ_SYOKUDAI_SNUFF_OUT) { + s32 snuffTimerInitial = OBJ_SYOKUDAI_SNUFF_TIMER_INITIAL(groupSize); + + flameScale = 1.0f; + if (snuffTimerInitial < this->snuffTimer) { + flameScale = (f32)(snuffTimerInitial - this->snuffTimer + OBJ_SYOKUDAI_SNUFF_TIMER_JUST_LIT_BONUS) / + OBJ_SYOKUDAI_SNUFF_TIMER_JUST_LIT_BONUS; + } else if ((this->snuffTimer > OBJ_SYOKUDAI_SNUFF_OUT) && (this->snuffTimer < OBJ_SYOKUDAI_SNUFF_DEFAULT)) { + flameScale = (f32)this->snuffTimer / OBJ_SYOKUDAI_SNUFF_DEFAULT; + } + flameScale *= 0.0027f; + func_8012C2DC(globalCtx->state.gfxCtx); + gSPSegment(POLY_XLU_DISP++, 0x08, + Gfx_TwoTexScroll(globalCtx->state.gfxCtx, 0, 0, 0, 0x20, 0x40, 1, 0, + (this->flameTexScroll * -OBJ_SYOKUDAI_SNUFF_DEFAULT) & 0x1FF, 0x20, 0x80)); + gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 0, 255); + gDPSetEnvColor(POLY_XLU_DISP++, 255, 0, 0, 0); + SysMatrix_InsertTranslation(0.0f, OBJ_SYOKUDAI_FLAME_HEIGHT, 0.0f, MTXMODE_APPLY); + Matrix_RotateY(BINANG_ROT180(func_800DFCDC(ACTIVE_CAM) - thisx->shape.rot.y), MTXMODE_APPLY); + Matrix_Scale(flameScale, flameScale, flameScale, MTXMODE_APPLY); + gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); + gSPDisplayList(POLY_XLU_DISP++, D_0407D590); + } + CLOSE_DISPS(globalCtx->state.gfxCtx); +} diff --git a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h index c2f0ea4a45..618b86ed51 100644 --- a/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h +++ b/src/overlays/actors/ovl_Obj_Syokudai/z_obj_syokudai.h @@ -7,12 +7,54 @@ struct ObjSyokudai; typedef struct ObjSyokudai { /* 0x000 */ Actor actor; - /* 0x144 */ ColliderCylinder colliderCylinder1; - /* 0x190 */ ColliderCylinder colliderCylinder2; - /* 0x1DC */ s16 unk_1DC; - /* 0x1DE */ char unk_1DE[0x16]; + /* 0x144 */ ColliderCylinder standCollider; + /* 0x190 */ ColliderCylinder flameCollider; + /* 0x1DC */ s16 snuffTimer; + /* 0x1DE */ u8 flameTexScroll; + /* 0x1DF */ s8 pendingAction; + /* 0x1E0 */ LightNode* lightNode; + /* 0x1E4 */ LightInfo lightInfo; } ObjSyokudai; // size = 0x1F4 extern const ActorInit Obj_Syokudai_InitVars; +typedef enum { + /* 0 */ OBJ_SYOKUDAI_TYPE_SWITCH_CAUSES_FLAME, + /* 1 */ OBJ_SYOKUDAI_TYPE_FLAME_CAUSES_SWITCH, + /* 2 */ OBJ_SYOKUDAI_TYPE_NO_SWITCH +} ObjSyokudaiTypes; + +typedef enum { + /* -1 */ OBJ_SYOKUDAI_SNUFF_NEVER = -1, + /* 0 */ OBJ_SYOKUDAI_SNUFF_OUT, + /* 1 */ OBJ_SYOKUDAI_SNUFF_GROUP_BY_WATER, + /* 20 */ OBJ_SYOKUDAI_SNUFF_DEFAULT = 20 +} ObjSyokudaiSnuffStates; + +typedef enum { + /* -1 */ OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_NO_SWITCH = -1, + /* 0 */ OBJ_SYOKUDAI_PENDING_ACTION_NONE, + /* 1 */ OBJ_SYOKUDAI_PENDING_ACTION_CUTSCENE_AND_SWITCH +} ObjSyokudaiPendingActions; + +typedef enum { + /* -1 */ OBJ_SYOKUDAI_INTERACTION_STICK = -1, + /* 0 */ OBJ_SYOKUDAI_INTERACTION_NONE, + /* 1 */ OBJ_SYOKUDAI_INTERACTION_ARROW_FA +} ObjSyokudaiInteractions; + +#define OBJ_SYOKUDAI_GLOW_HEIGHT 70.0f +#define OBJ_SYOKUDAI_FLAME_HEIGHT 52.0f +#define OBJ_SYOKUDAI_STICK_IGNITION_HEIGHT 67.0f +#define OBJ_SYOKUDAI_STICK_IGNITION_RADIUS 20.0f +#define OBJ_SYOKUDAI_SNUFF_TIMER_JUST_LIT_BONUS 10 +#define OBJ_SYOKUDAI_LIGHT_RADIUS_MAX 250 + +#define OBJ_SYOKUDAI_GET_TYPE(thisx) (thisx->params >> 0xC) +#define OBJ_SYOKUDAI_GET_START_LIT(thisx) (thisx->params & 0x800) +#define OBJ_SYOKUDAI_GET_GROUP_SIZE(thisx) ((thisx->params >> 7) & 0xF) +#define OBJ_SYOKUDAI_GET_SWITCH_FLAG(thisx) (thisx->params & 0x7F) + +#define OBJ_SYOKUDAI_SNUFF_TIMER_INITIAL(groupSize) ((groupSize * 50) + 100) + #endif // Z_OBJ_SYOKUDAI_H diff --git a/tools/disasm/variables.txt b/tools/disasm/variables.txt index a2b28c247c..91bfbab479 100644 --- a/tools/disasm/variables.txt +++ b/tools/disasm/variables.txt @@ -6810,14 +6810,14 @@ 0x808BC000:("D_808BC000","UNK_TYPE1","",0x1), 0x808BC004:("D_808BC004","UNK_TYPE1","",0x1), 0x808BCCA0:("Obj_Syokudai_InitVars","UNK_TYPE1","",0x1), - 0x808BCCC0:("D_808BCCC0","UNK_TYPE1","",0x1), - 0x808BCCEC:("D_808BCCEC","UNK_TYPE1","",0x1), - 0x808BCD18:("D_808BCD18","UNK_TYPE1","",0x1), - 0x808BCD28:("D_808BCD28","UNK_TYPE1","",0x1), - 0x808BCD2C:("D_808BCD2C","UNK_TYPE1","",0x1), + 0x808BCCC0:("sStandColliderInit","UNK_TYPE1","",0x1), + 0x808BCCEC:("sFlameColliderInit","UNK_TYPE1","",0x1), + 0x808BCD18:("sInitChain","UNK_TYPE1","",0x1), + 0x808BCD28:("sColTypes","UNK_TYPE1","",0x1), + 0x808BCD2C:("sDLists","UNK_TYPE1","",0x1), 0x808BCD40:("D_808BCD40","f32","",0x4), 0x808BCD44:("D_808BCD44","f32","",0x4), - 0x808BCDE0:("D_808BCDE0","UNK_TYPE1","",0x1), + 0x808BCDE0:("sNumLitTorchesInGroup","UNK_TYPE1","",0x1), 0x808BD160:("Item_B_Heart_InitVars","UNK_TYPE1","",0x1), 0x808BD180:("D_808BD180","UNK_TYPE1","",0x1), 0x808BD190:("D_808BD190","f32","",0x4), diff --git a/undefined_syms.txt b/undefined_syms.txt index 7fc52d938a..bf19c98142 100644 --- a/undefined_syms.txt +++ b/undefined_syms.txt @@ -4108,6 +4108,12 @@ D_06008B90 = 0x06008B90; D_06000460 = 0x06000460; D_06000E68 = 0x06000E68; +// ovl_Obj_Syokudai + +D_060003A0 = 0x060003A0; +D_06000870 = 0x06000870; +D_06000B90 = 0x06000B90; + // ovl_Obj_Takaraya_Wall D_06000B70 = 0x06000B70;