1#include "Player/PlayerPainPartsKeeper.h"
2
3#include "Library/LiveActor/ActorActionFunction.h"
4#include "Library/LiveActor/ActorFlagFunction.h"
5#include "Library/LiveActor/ActorModelFunction.h"
6#include "Library/LiveActor/ActorMovementFunction.h"
7#include "Library/LiveActor/LiveActorFunction.h"
8#include "Library/Obj/PartsModel.h"
9
10#include "Player/Player.h"
11#include "Player/PlayerCostumeInfo.h"
12#include "Player/PlayerModelHolder.h"
13
14PlayerPainPartsKeeper::PlayerPainPartsKeeper(const al::LiveActor* liveActor,
15 const PlayerCostumeInfo* costumeInfo)
16 : mLiveActor(liveActor), mPlayerCostumeInfo(costumeInfo) {}
17
18void PlayerPainPartsKeeper::update() {
19 updateNeedle();
20}
21
22void PlayerPainPartsKeeper::updateNeedle() {
23 if (!mNeedlesActor || al::isDead(actor: mNeedlesActor))
24 return;
25
26 if (!mPlayerCostumeInfo->isPreventHeadPain() || !rs::isGuardNosePainCap(mLiveActor)) {
27 al::setModelAlphaMask(actor: mNeedlesActor, mModelAlphaMask);
28 if (al::isHideModel(actor: mPlayerFaceActor))
29 al::hideModelIfShow(actor: mNeedlesActor);
30 else
31 al::showModelIfHide(actor: mNeedlesActor);
32
33 if (mIsEnableTimer)
34 mTimer++;
35 if (mTimer < 3600)
36 return;
37 }
38
39 mNeedlesActor->kill();
40}
41
42void PlayerPainPartsKeeper::resetPosition() {
43 if (mNeedlesActor && al::isAlive(actor: mNeedlesActor))
44 al::resetPosition(actor: mNeedlesActor);
45}
46
47bool PlayerPainPartsKeeper::isEnableNosePain() const {
48 if (mPlayerCostumeInfo->isPreventHeadPain() && rs::isGuardNosePainCap(mLiveActor))
49 return false;
50 return true;
51}
52
53bool PlayerPainPartsKeeper::isInvalidNoseDynamics() const {
54 return mNeedlesActor && al::isAlive(actor: mNeedlesActor);
55}
56
57static sead::Vector3f initialPosition = {0, 0, 0};
58static sead::Vector3f initialRotation = {0, 270, 180};
59
60void PlayerPainPartsKeeper::createNoseNeedle(const PlayerModelHolder* playerModelHolder,
61 const al::ActorInitInfo& actorInitInfo) {
62 auto* playerFaceActor = playerModelHolder->findModelActor("Normal");
63 auto* faceSubActor = al::getSubActor(actor: playerFaceActor, subActorName: "顔");
64 mPlayerFaceActor = playerFaceActor;
65 mNeedlesActor = new al::PartsModel("鼻のトゲ");
66 mNeedlesActor->initPartsDirect(playerFaceActor, actorInitInfo, "CactusMiniNeedle",
67 al::getJointMtxPtr(actor: faceSubActor, "Nose"), initialPosition,
68 initialRotation, {1.0f, 1.0f, 1.0f}, false);
69 al::onSyncClippingSubActor(actor: playerFaceActor, subActor: mNeedlesActor);
70 al::onSyncHideSubActor(actor: playerFaceActor, subActor: mNeedlesActor);
71 al::onSyncAlphaMaskSubActor(actor: playerFaceActor, subActor: mNeedlesActor);
72 al::setMaterialProgrammable(mNeedlesActor);
73 mNeedlesActor->makeActorDead();
74}
75
76void PlayerPainPartsKeeper::appearNeedle() {
77 mTimer = 0;
78 if (al::isAlive(actor: mNeedlesActor))
79 return;
80
81 mNeedlesActor->makeActorAlive();
82 if (mPlayerCostumeInfo->isHidePainNose())
83 al::startAction(actor: mNeedlesActor, actionName: "NoseOff");
84 else
85 al::startAction(actor: mNeedlesActor, actionName: "NoseOn");
86}
87