1#include "Library/Obj/EffectObjCameraEmit.h"
2
3#include "Library/Collision/PartsConnector.h"
4#include "Library/Effect/EffectKeeper.h"
5#include "Library/Effect/EffectSystemInfo.h"
6#include "Library/LiveActor/ActorPoseUtil.h"
7#include "Library/Nerve/NerveSetupUtil.h"
8#include "Library/Obj/EffectObjFunction.h"
9#include "Library/Placement/PlacementFunction.h"
10#include "Library/Se/SeFunction.h"
11#include "Library/Stage/StageSwitchUtil.h"
12#include "Library/Thread/FunctorV0M.h"
13
14namespace al {
15EffectObjCameraEmit::EffectObjCameraEmit(const char* name) : LiveActor(name) {}
16
17void EffectObjCameraEmit::init(const ActorInitInfo& info) {
18 using EffectObjCameraEmitFunctor =
19 FunctorV0M<EffectObjCameraEmit*, void (EffectObjCameraEmit::*)()>;
20
21 EffectObjFunction::initActorEffectObj(actor: this, info);
22 listenStageSwitchOnOffAppear(
23 user: this, actionOn: EffectObjCameraEmitFunctor(this, &EffectObjCameraEmit::appear),
24 actionOff: EffectObjCameraEmitFunctor(this, &EffectObjCameraEmit::switchOnKill)) ?
25 makeActorDead() :
26 makeActorAlive();
27
28 listenStageSwitchOnKill(user: this,
29 action: EffectObjCameraEmitFunctor(this, &EffectObjCameraEmit::switchOnKill));
30
31 listenStageSwitchOnOff(user: this, eventName: "OnKillOffAppearSwitch",
32 actionOn: EffectObjCameraEmitFunctor(this, &EffectObjCameraEmit::switchOnKill),
33 actionOff: EffectObjCameraEmitFunctor(this, &EffectObjCameraEmit::appear));
34
35 mMtxConnector = tryCreateMtxConnector(actor: this, info);
36}
37
38void EffectObjCameraEmit::switchOnKill() {
39 mIsStopFollowCamera = true;
40 tryDeleteEffect(this, "Wait");
41}
42
43void EffectObjCameraEmit::initAfterPlacement() {
44 if (mMtxConnector == nullptr)
45 return;
46
47 attachMtxConnectorToCollision(mtxConnector: mMtxConnector, actor: this, false);
48}
49
50void EffectObjCameraEmit::control() {
51 if (mMtxConnector != nullptr)
52 connectPoseQT(actor: this, mtxConnector: mMtxConnector);
53
54 makeMtxRT(mtx: &mBaseMtx, actor: this);
55
56 if (!mIsStarted)
57 tryEmitStart();
58
59 if (mIsStopFollowCamera && !isEffectEmitting(this, "Wait"))
60 kill();
61}
62
63bool EffectObjCameraEmit::tryEmitStart() {
64 if (mIsStarted)
65 return false;
66
67 emitEffect(this, "Wait", nullptr);
68 tryStartSe(this, "Wait");
69 mIsStarted = true;
70
71 return true;
72}
73
74void EffectObjCameraEmit::appear() {
75 mIsStarted = false;
76 mIsStopFollowCamera = false;
77
78 LiveActor::appear();
79}
80
81void EffectObjCameraEmit::kill() {
82 mIsStarted = false;
83 mIsStopFollowCamera = false;
84
85 LiveActor::kill();
86}
87} // namespace al
88