diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index a60505a48a..a8f4aedcfe 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -8444,9 +8444,9 @@ SECTIONS ovl_En_Cha : AT(RomLocation) { build/src/overlays/actors/ovl_En_Cha/z_en_cha.o(.text) - build/asm/overlays/ovl_En_Cha_data.o(.data) + build/src/overlays/actors/ovl_En_Cha/z_en_cha.o(.data) build/src/overlays/actors/ovl_En_Cha/z_en_cha.o(.rodata) - build/asm/overlays/ovl_En_Cha_rodata.o(.rodata) + build/src/overlays/actors/ovl_En_Cha/z_en_cha_overlay.o(.ovl) } SegmentEnd = .; SegmentSize = SegmentEnd - SegmentStart; diff --git a/linker_scripts/object_script.txt b/linker_scripts/object_script.txt index 2904f24540..cc49cfee0c 100644 --- a/linker_scripts/object_script.txt +++ b/linker_scripts/object_script.txt @@ -190,3 +190,7 @@ D_06000140 = 0x06000140; /* bg_lotus */ D_06000A20 = 0x06000A20; D_06000040 = 0x06000040; + +/* en_cha */ +D_06000710 = 0x06000710; +D_06000958 = 0x06000958; diff --git a/src/overlays/actors/ovl_En_Cha/z_en_cha.c b/src/overlays/actors/ovl_En_Cha/z_en_cha.c index 5319ab3d68..834894e6ff 100644 --- a/src/overlays/actors/ovl_En_Cha/z_en_cha.c +++ b/src/overlays/actors/ovl_En_Cha/z_en_cha.c @@ -1,3 +1,9 @@ +/* + * File: z_en_cha.c + * Overlay: ovl_En_Cha + * Description: Laundry Pool Bell + */ + #include "z_en_cha.h" #define FLAGS 0x00000000 @@ -9,7 +15,9 @@ void EnCha_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnCha_Update(Actor* thisx, GlobalContext* globalCtx); void EnCha_Draw(Actor* thisx, GlobalContext* globalCtx); -/* +void EnCha_Idle(EnCha* this, GlobalContext* globalCtx); + + const ActorInit En_Cha_InitVars = { ACTOR_EN_CHA, ACTORCAT_PROP, @@ -21,16 +29,97 @@ const ActorInit En_Cha_InitVars = { (ActorFunc)EnCha_Update, (ActorFunc)EnCha_Draw }; -*/ -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Cha_0x80BEB520/EnCha_Init.asm") +static ColliderCylinderInit sCylinderInit = { + { + COLTYPE_WOOD, + AT_NONE, + AC_ON | AC_HARD | AC_TYPE_PLAYER, + OC1_ON | OC1_TYPE_ALL, + OC2_TYPE_1, + COLSHAPE_CYLINDER, + }, + { + ELEMTYPE_UNK0, + { 0x00000000, 0x00, 0x00 }, + { 0xF7CFFFFF, 0x00, 0x00 }, + TOUCH_NONE | TOUCH_SFX_NORMAL, + BUMP_ON, + OCELEM_ON, }, + { 10, 40, 0, { 0, 0, 0 } }, +}; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Cha_0x80BEB520/EnCha_Destroy.asm") +extern UNK_TYPE4 D_06000710; +extern UNK_TYPE4 D_06000958; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Cha_0x80BEB520/func_80BEB5DC.asm") +void EnCha_Init(Actor *thisx, GlobalContext *globalCtx) { + EnCha *this = THIS; + s32 pad; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Cha_0x80BEB520/func_80BEB654.asm") + Collider_InitAndSetCylinder(globalCtx, &this->collider, &this->actor, &sCylinderInit); + this->actor.colChkInfo.mass = 0xFF; + Collider_UpdateCylinder(&this->actor, &this->collider); + Actor_SetScale(&this->actor, 0.01f); + this->actor.home.rot.z = 0; + this->actionFunc = EnCha_Idle; + this->actor.home.rot.x = this->actor.home.rot.z; + gSaveContext.perm.weekEventReg[60] &= 0xFB; +} -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Cha_0x80BEB520/EnCha_Update.asm") +void EnCha_Destroy(Actor *thisx, GlobalContext *globalCtx) { + EnCha *this = THIS; -#pragma GLOBAL_ASM("./asm/non_matchings/overlays/ovl_En_Cha_0x80BEB520/EnCha_Draw.asm") + Collider_DestroyCylinder(globalCtx, &this->collider); +} + +void EnCha_Ring(EnCha *this, GlobalContext *globalCtx) { + EnCha_Idle(this, globalCtx); + if (this->actor.cutscene == -1) { + this->actionFunc = EnCha_Idle; + } + else if (ActorCutscene_GetCanPlayNext(this->actor.cutscene)) { + ActorCutscene_StartAndSetUnkLinkFields(this->actor.cutscene, &this->actor); + this->actionFunc = EnCha_Idle; + } else { + ActorCutscene_SetIntentToPlay(this->actor.cutscene); + } +} + +void EnCha_Idle(EnCha *this, GlobalContext *globalCtx) { + if (gSaveContext.perm.weekEventReg[60] & 4) { + Audio_PlayActorSound2(&this->actor, 0x289E); + gSaveContext.perm.weekEventReg[60] &= 0xFB; + this->actor.home.rot.z = 0x7D0; + } + if (this->collider.base.acFlags & AC_HIT) { + Audio_PlayActorSound2(&this->actor, 0x289E); + this->actor.home.rot.z = 0x7D0; + if (!(gSaveContext.perm.weekEventReg[51] & 4)) { + gSaveContext.perm.weekEventReg[51] |= 4; + this->actionFunc = EnCha_Ring; + } + } + this->actor.home.rot.x += this->actor.home.rot.z; + this->actor.home.rot.z -= (s16)(this->actor.home.rot.x * 0.1f); + this->actor.home.rot.z *= 0.96f; +} + +void EnCha_Update(Actor *thisx, GlobalContext *globalCtx) { + EnCha *this = THIS; + GlobalContext *globalCtx2 = globalCtx; + + CollisionCheck_SetOC(globalCtx, &globalCtx2->colCheckCtx, &this->collider.base); + this->actionFunc(this, globalCtx); + if ((this->actor.shape.rot.z >= -0x1F3F) && (this->actor.shape.rot.z < 0x1F40)) { + CollisionCheck_SetAC(globalCtx, &globalCtx2->colCheckCtx, &this->collider.base); + } +} + +void EnCha_Draw(Actor *thisx, GlobalContext *globalCtx) { + EnCha *this = THIS; + + func_800BDFC0(globalCtx, &D_06000710); + SysMatrix_InsertTranslation(-1094.0f, 4950.0f, 9.0f, 1); + SysMatrix_InsertXRotation_s(this->actor.home.rot.x, 1); + func_800BDFC0(globalCtx, &D_06000958); +} diff --git a/src/overlays/actors/ovl_En_Cha/z_en_cha.h b/src/overlays/actors/ovl_En_Cha/z_en_cha.h index fa3766ad08..17a6fec870 100644 --- a/src/overlays/actors/ovl_En_Cha/z_en_cha.h +++ b/src/overlays/actors/ovl_En_Cha/z_en_cha.h @@ -5,9 +5,12 @@ struct EnCha; +typedef void (*EnChaActionFunc)(struct EnCha*, struct GlobalContext*); + typedef struct EnCha { /* 0x000 */ Actor actor; - /* 0x144 */ char unk_144[0x50]; + /* 0x144 */ ColliderCylinder collider; + /* 0x190 */ EnChaActionFunc actionFunc; } EnCha; // size = 0x194 extern const ActorInit En_Cha_InitVars; diff --git a/tables/functions.txt b/tables/functions.txt index 96223e0248..5f2865253f 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -16216,8 +16216,8 @@ 0x80BEB0A8:("EnDt_Draw",), 0x80BEB520:("EnCha_Init",), 0x80BEB5B0:("EnCha_Destroy",), - 0x80BEB5DC:("func_80BEB5DC",), - 0x80BEB654:("func_80BEB654",), + 0x80BEB5DC:("EnCha_Ring",), + 0x80BEB654:("EnCha_Idle",), 0x80BEB76C:("EnCha_Update",), 0x80BEB7F4:("EnCha_Draw",), 0x80BEB940:("ObjDinner_Init",),