1#pragma once
2
3#include <basis/seadTypes.h>
4#include <prim/seadSafeString.h>
5
6#include "Library/Audio/IUseAudioKeeper.h"
7#include "Library/HostIO/HioNode.h"
8#include "Library/Scene/ISceneObj.h"
9
10#include "Scene/SceneObjFactory.h"
11
12namespace al {
13struct NfpInfo;
14
15struct ActorInitInfo;
16class AudioDirector;
17class IUseSceneObjHolder;
18class MessageTagDataHolder;
19} // namespace al
20
21class AmiiboNpcLayout;
22class ProjectNfpDirector;
23class SearchAmiiboDataTable;
24
25class AmiiboNpcDirector : public al::ISceneObj, public al::IUseHioNode, public al::IUseAudioKeeper {
26public:
27 static constexpr s32 sSceneObjId = SceneObjID_AmiiboNpcDirector;
28
29 AmiiboNpcDirector();
30
31 const char* getSceneObjName() const override { return "AmiiboNpc用データホルダ"; }
32
33 void init(ProjectNfpDirector* nfpDirector, al::AudioDirector* audioDirector);
34 void initAfterPlacementSceneObj(const al::ActorInitInfo& initInfo) override;
35 void updateSearchAmiiboName();
36 bool requestAppearAmiiboLayout();
37 void requestDecideAmiiboLayout();
38 void requestEndAmiiboLayout();
39 bool isEndAmiiboLayout();
40 void registerSearchAmiibo(s32 id, s32 numberingId, u64 searchStartTime);
41 void deleteSearchEndAmiibo();
42 bool isSearchAmiibo(s32 id);
43 u32 getSearchAmiiboNum() const;
44 u32 getSearchEndAmiiboNum() const;
45 u32 getSearchEndAmiiboNumRealTime() const;
46 bool isEnableSearchAmiibo();
47 void setTouchAmiiboName(s32 id, s32 numberingId);
48 void trySetAmiiboCostumeName(s32 id);
49 void checkTimeReverseAndRestore();
50 al::NfpInfo* tryGetTriggerTouchNfpInfo();
51
52 al::AudioKeeper* getAudioKeeper() const override { return mAudioKeeper; }
53
54 AmiiboNpcLayout* getAmiiboNpcLayout() const { return mNpcLayout; }
55
56 ProjectNfpDirector* getProjectNfpDirector() const { return mNfpDirector; }
57
58 al::NfpInfo* getNfpInfo() const { return mNfpInfo; }
59
60 al::MessageTagDataHolder* getMessageTagDataHolder() const { return mTagDataHolder; }
61
62 void setTime(u64 time) { mTime = time; }
63
64private:
65 AmiiboNpcLayout* mNpcLayout = nullptr;
66 SearchAmiiboDataTable* mSearchDataTable = nullptr;
67 ProjectNfpDirector* mNfpDirector = nullptr;
68 al::NfpInfo* mNfpInfo = nullptr;
69 al::AudioKeeper* mAudioKeeper = nullptr;
70 al::MessageTagDataHolder* mTagDataHolder = nullptr;
71 const char* mAmiiboNameCstr[3];
72 sead::FixedSafeString<0x40> mAmiiboName[3];
73 const char* mTouchAmiiboNameCstr = nullptr;
74 sead::FixedSafeString<0x40> mTouchAmiiboName;
75 const char16* mClothName = nullptr;
76 const char16* mCapName = nullptr;
77 u64 mTime = 0;
78};
79
80static_assert(sizeof(AmiiboNpcDirector) == 0x1D8, "AmiiboNpcDirector");
81
82namespace AmiiboFunction {
83
84al::NfpInfo* tryGetTriggerTouchNfpInfo(const al::IUseSceneObjHolder* objHolder);
85al::NfpInfo* getLastTriggerTouchNfpInfo(const al::IUseSceneObjHolder* objHolder);
86void startNfpTouch(const al::IUseSceneObjHolder* objHolder);
87void stopNfpTouch(const al::IUseSceneObjHolder* objHolder);
88bool isNfpErrorHandled(const al::IUseSceneObjHolder* objHolder);
89bool requestAppearAmiiboLayout(const al::IUseSceneObjHolder* objHolder);
90void requestDecideAmiiboLayout(const al::IUseSceneObjHolder* objHolder);
91void requestEndAmiiboLayout(const al::IUseSceneObjHolder* objHolder);
92bool isEndAmiiboLayout(const al::IUseSceneObjHolder* objHolder);
93AmiiboNpcLayout* getAmiiboTouchLayout(const al::IUseSceneObjHolder* objHolder);
94u32 getSearchAmiiboNum(const al::IUseSceneObjHolder* objHolder);
95u32 getSearchEndAmiiboNum(const al::IUseSceneObjHolder* objHolder);
96u32 getSearchEndAmiiboNumRealTime(const al::IUseSceneObjHolder* objHolder);
97void registerSearchAmiibo(const al::IUseSceneObjHolder* objHolder, const al::NfpInfo& nfpInfo);
98bool isSearchAmiibo(const al::IUseSceneObjHolder* objHolder, const al::NfpInfo& nfpInfo);
99void deleteSearchEndAmiibo(const al::IUseSceneObjHolder* objHolder);
100void setTalkStartTime(const al::IUseSceneObjHolder* objHolder);
101al::MessageTagDataHolder* getMessageTagDataHolder(const al::IUseSceneObjHolder* objHolder);
102void setTouchAmiiboName(const al::IUseSceneObjHolder* objHolder, s32 id, s32 numberingId);
103void trySetAmiiboCostumeName(const al::IUseSceneObjHolder* objHolder, s32 id);
104
105} // namespace AmiiboFunction
106