/* * File: z_en_guest.c * Overlay: ovl_En_Guest * Description: Happy Mask Shop Customer */ #include "z_en_guest.h" #include "objects/object_os_anime/object_os_anime.h" #include "objects/object_boj/object_boj.h" #include "vt.h" #define FLAGS (ACTOR_FLAG_0 | ACTOR_FLAG_3 | ACTOR_FLAG_4) void EnGuest_Init(Actor* thisx, GlobalContext* globalCtx); void EnGuest_Destroy(Actor* thisx, GlobalContext* globalCtx); void EnGuest_Update(Actor* thisx, GlobalContext* globalCtx); void EnGuest_Draw(Actor* thisx, GlobalContext* globalCtx); void func_80A50518(EnGuest* this, GlobalContext* globalCtx); void func_80A5057C(EnGuest* this, GlobalContext* globalCtx); void func_80A505CC(Actor* thisx, GlobalContext* globalCtx); const ActorInit En_Guest_InitVars = { ACTOR_EN_GUEST, ACTORCAT_NPC, FLAGS, OBJECT_BOJ, sizeof(EnGuest), (ActorFunc)EnGuest_Init, (ActorFunc)EnGuest_Destroy, (ActorFunc)EnGuest_Update, NULL, NULL, }; static ColliderCylinderInitType1 sCylinderInit = { { COLTYPE_NONE, AT_NONE, AC_NONE, OC1_ON | OC1_TYPE_ALL, COLSHAPE_CYLINDER, }, { 0x00, { 0x00000000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, 0x00, 0x00, 0x01 }, { 10, 60, 0, { 0, 0, 0 } }, }; static InitChainEntry sInitChain[] = { ICHAIN_U8(targetMode, 6, ICHAIN_CONTINUE), ICHAIN_F32(targetArrowOffset, 500, ICHAIN_STOP), }; void EnGuest_Init(Actor* thisx, GlobalContext* globalCtx) { EnGuest* this = (EnGuest*)thisx; if (gSaveContext.infTable[7] & 0x40) { Actor_Kill(&this->actor); } else { this->osAnimeBankIndex = Object_GetIndex(&globalCtx->objectCtx, OBJECT_OS_ANIME); if (this->osAnimeBankIndex < 0) { osSyncPrintf(VT_COL(RED, WHITE)); // "No such bank!!" osSyncPrintf("%s[%d] : バンクが無いよ!!\n", __FILE__, __LINE__); osSyncPrintf(VT_RST); ASSERT(this->osAnimeBankIndex < 0); } } } void EnGuest_Destroy(Actor* thisx, GlobalContext* globalCtx) { EnGuest* this = (EnGuest*)thisx; Collider_DestroyCylinder(globalCtx, &this->collider); } void EnGuest_Update(Actor* thisx, GlobalContext* globalCtx) { EnGuest* this = (EnGuest*)thisx; s32 pad; if (Object_IsLoaded(&globalCtx->objectCtx, this->osAnimeBankIndex)) { this->actor.flags &= ~ACTOR_FLAG_4; Actor_ProcessInitChain(&this->actor, sInitChain); SkelAnime_InitFlex(globalCtx, &this->skelAnime, &object_boj_Skel_0000F0, NULL, this->jointTable, this->morphTable, 16); gSegments[6] = VIRTUAL_TO_PHYSICAL(globalCtx->objectCtx.status[this->osAnimeBankIndex].segment); Animation_Change(&this->skelAnime, &gObjOsAnim_42AC, 1.0f, 0.0f, Animation_GetLastFrame(&gObjOsAnim_42AC), ANIMMODE_LOOP, 0.0f); this->actor.draw = EnGuest_Draw; this->actor.update = func_80A505CC; Collider_InitCylinder(globalCtx, &this->collider); Collider_SetCylinderType1(globalCtx, &this->collider, &this->actor, &sCylinderInit); Actor_SetFocus(&this->actor, 60.0f); this->unk_30E = 0; this->unk_30D = 0; this->unk_2CA = 0; this->actor.textId = 0x700D; this->actionFunc = func_80A50518; } } void func_80A5046C(EnGuest* this) { if (this->unk_30D == 0) { if (this->unk_2CA != 0) { this->unk_2CA--; } else { this->unk_30D = 1; } } else { if (this->unk_2CA != 0) { this->unk_2CA--; } else { this->unk_30E += 1; if (this->unk_30E >= 3) { this->unk_30E = 0; this->unk_30D = 0; this->unk_2CA = (s32)Rand_ZeroFloat(60.0f) + 20; } else { this->unk_2CA = 1; } } } } void func_80A50518(EnGuest* this, GlobalContext* globalCtx) { if (Actor_ProcessTalkRequest(&this->actor, globalCtx)) { this->actionFunc = func_80A5057C; } else if (this->actor.xzDistToPlayer < 100.0f) { func_8002F2CC(&this->actor, globalCtx, 100.0f); } } void func_80A5057C(EnGuest* this, GlobalContext* globalCtx) { if ((Message_GetState(&globalCtx->msgCtx) == TEXT_STATE_DONE) && Message_ShouldAdvance(globalCtx)) { this->actionFunc = func_80A50518; } } void func_80A505CC(Actor* thisx, GlobalContext* globalCtx) { EnGuest* this = (EnGuest*)thisx; s32 pad; Player* player; player = GET_PLAYER(globalCtx); this->unk_2C8++; func_80A5046C(this); this->actionFunc(this, globalCtx); this->unk_2A0.unk_18 = player->actor.world.pos; if (LINK_IS_ADULT) { this->unk_2A0.unk_14 = 10.0f; } else { this->unk_2A0.unk_14 = 20.0f; } func_80034A14(&this->actor, &this->unk_2A0, 6, 2); func_80034F54(globalCtx, this->unk_2CC, this->unk_2EC, 16); gSegments[6] = VIRTUAL_TO_PHYSICAL(globalCtx->objectCtx.status[this->osAnimeBankIndex].segment); SkelAnime_Update(&this->skelAnime); Actor_SetFocus(&this->actor, 60.0f); Collider_UpdateCylinder(&this->actor, &this->collider); CollisionCheck_SetOC(globalCtx, &globalCtx->colChkCtx, &this->collider.base); } Gfx* func_80A50708(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b, u8 a) { Gfx* dlist; dlist = Graph_Alloc(gfxCtx, 2 * sizeof(Gfx)); gDPSetEnvColor(dlist, r, g, b, a); gSPEndDisplayList(dlist + 1); return dlist; } s32 EnGuest_OverrideLimbDraw(GlobalContext* globalCtx, s32 limbIndex, Gfx** dList, Vec3f* pos, Vec3s* rot, void* thisx) { EnGuest* this = (EnGuest*)thisx; Vec3s sp3C; OPEN_DISPS(globalCtx->state.gfxCtx); if (limbIndex == 15) { *dList = object_boj_DL_0059B0; Matrix_Translate(1400.0f, 0.0f, 0.0f, MTXMODE_APPLY); sp3C = this->unk_2A0.unk_08; Matrix_RotateX((sp3C.y / 32768.0f) * M_PI, MTXMODE_APPLY); Matrix_RotateZ((sp3C.x / 32768.0f) * M_PI, MTXMODE_APPLY); Matrix_Translate(-1400.0f, 0.0f, 0.0f, MTXMODE_APPLY); } if (limbIndex == 8) { sp3C = this->unk_2A0.unk_0E; Matrix_RotateX((-sp3C.y / 32768.0f) * M_PI, MTXMODE_APPLY); Matrix_RotateZ((sp3C.x / 32768.0f) * M_PI, MTXMODE_APPLY); } if (limbIndex == 8 || limbIndex == 9 || limbIndex == 12) { rot->y += Math_SinS(this->unk_2CC[limbIndex]) * 200.0f; rot->z += Math_CosS(this->unk_2EC[limbIndex]) * 200.0f; } CLOSE_DISPS(globalCtx->state.gfxCtx); return false; } void EnGuest_Draw(Actor* thisx, GlobalContext* globalCtx) { static void* D_80A50BA4[] = { object_boj_Tex_0005FC, object_boj_Tex_0006FC, object_boj_Tex_0007FC, }; EnGuest* this = (EnGuest*)thisx; s32 pad; OPEN_DISPS(globalCtx->state.gfxCtx); func_80093D18(globalCtx->state.gfxCtx); gSPSegment(POLY_OPA_DISP++, 0x08, func_80A50708(globalCtx->state.gfxCtx, 255, 255, 255, 255)); gSPSegment(POLY_OPA_DISP++, 0x09, func_80A50708(globalCtx->state.gfxCtx, 160, 60, 220, 255)); gSPSegment(POLY_OPA_DISP++, 0x0A, SEGMENTED_TO_VIRTUAL(D_80A50BA4[this->unk_30E])); SkelAnime_DrawFlexOpa(globalCtx, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, EnGuest_OverrideLimbDraw, NULL, this); CLOSE_DISPS(globalCtx->state.gfxCtx); }