1#include "Library/Nfp/NfpFunction.h"
2
3#include "Library/Nfp/NfpTypes.h"
4
5namespace al {
6
7bool isAnyNfcTagDetected(const NfpInfo& nfpInfo) {
8 return nfpInfo.isAmiibo || nfpInfo.isNormalNfc;
9}
10
11bool isNormalNfc(const NfpInfo& nfpInfo) {
12 return nfpInfo.isNormalNfc;
13}
14
15bool isAmiibo(const NfpInfo& nfpInfo) {
16 return nfpInfo.isAmiibo;
17}
18
19bool isEqualUniqueNfcId(const NfpInfo& nfpInfoA, const NfpInfo& nfpInfoB) {
20 if (!nfpInfoA.isAmiibo || !nfpInfoB.isAmiibo)
21 return false;
22
23 return isEqualUniqueNfcId(tagInfoA: nfpInfoA.tagInfo, tagInfoB: nfpInfoB.tagInfo);
24}
25
26bool isEqualUniqueNfcId(const nn::nfp::TagInfo& tagInfoA, const nn::nfp::TagInfo& tagInfoB) {
27 return isEqualUniqueNfcId(tagIdA: tagInfoA.id, tagIdB: tagInfoB.id);
28}
29
30bool isEqualCharacterId(const NfpInfo& nfpInfo, NfpCharacterId characterId) {
31 if (!nfpInfo.isAmiibo)
32 return false;
33
34 return isEqualCharacterId(modelInfo: nfpInfo.modelInfo, characterId);
35}
36
37bool isEqualCharacterId(const nn::nfp::ModelInfo& modelInfo, const NfpCharacterId& characterId) {
38 return isEqualCharacterIdBase(modelInfo, characterId) &&
39 characterId.characterVariant == modelInfo.characterVariant;
40}
41
42bool isEqualCharacterIdBase(const NfpInfo& nfpInfo, NfpCharacterId characterId) {
43 if (!nfpInfo.isAmiibo)
44 return false;
45
46 return isEqualCharacterId(modelInfo: nfpInfo.modelInfo, characterId);
47}
48
49bool isEqualNumberingId(const NfpInfo& nfpInfo, s32 numberingId) {
50 if (!nfpInfo.isAmiibo)
51 return false;
52
53 return isEqualNumberingId(modelInfo: nfpInfo.modelInfo, numberingId);
54}
55
56bool isEqualNumberingId(const nn::nfp::ModelInfo& modelInfo, s32 numberingId) {
57 return modelInfo.modelNumber == numberingId;
58}
59
60bool tryGetCharacterId(NfpCharacterId* characterId, const NfpInfo& nfpInfo) {
61 if (!nfpInfo.isAmiibo)
62 return false;
63
64 characterId->gameId = nfpInfo.modelInfo.gameId;
65 characterId->characterId = nfpInfo.modelInfo.characterId;
66 characterId->characterVariant = nfpInfo.modelInfo.characterVariant;
67 return true;
68}
69
70bool tryGetNumberingId(s32* numberingId, const NfpInfo& nfpInfo) {
71 if (!nfpInfo.isAmiibo)
72 return false;
73
74 *numberingId = nfpInfo.modelInfo.modelNumber;
75 return true;
76}
77
78bool isCharacterIdBaseMario(const NfpInfo& nfpInfo) {
79 return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x00, .characterVariant: 0x00});
80}
81
82bool isCharacterIdBaseDrMario(const NfpInfo& nfpInfo) {
83 return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x00, .characterVariant: 0x01});
84}
85
86bool isCharacterIdBasePeach(const NfpInfo& nfpInfo) {
87 return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x02, .characterVariant: 0x00});
88}
89
90bool isCharacterIdBaseKoopa(const NfpInfo& nfpInfo) {
91 return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x05, .characterVariant: 0x00});
92}
93
94bool isCharacterIdBaseYoshi(const NfpInfo& nfpInfo) {
95 return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x03, .characterVariant: 0x00});
96}
97
98bool isCharacterIdBaseKinopio(const NfpInfo& nfpInfo) {
99 return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x0a, .characterVariant: 0x00});
100}
101
102bool isNeedFormat(const NfpInfo& nfpInfo) {
103 return nfpInfo.isNeedFormat;
104}
105
106bool isNeedRestore(const NfpInfo& nfpInfo) {
107 return nfpInfo.isNeedRestore;
108}
109
110bool isNeedRegister(const NfpInfo& nfpInfo) {
111 return nfpInfo.isNeedRegister;
112}
113
114bool isNeedRegisterNickName(const NfpInfo& nfpInfo) {
115 return (char)nfpInfo.nickName[0] == '\0';
116}
117
118bool isValidRegisterInfo(const NfpInfo& nfpInfo) {
119 return false;
120}
121
122void getAmiiboOwnerName(sead::BufferedSafeStringBase<char16>* ownerName, const NfpInfo& nfpInfo) {
123 // Stubbed in game
124}
125
126void getAmiiboNickName(sead::BufferedSafeStringBase<char16>* nickName, const NfpInfo& nfpInfo) {
127 nickName->copy(src: nfpInfo.nickName);
128}
129
130bool isInvalidFormatVersion(const NfpInfo& nfpInfo) {
131 if (!nfpInfo.isFormatVersionSet)
132 return false;
133
134 if (nfpInfo.formatVersion.minor != 0x73)
135 return false;
136
137 return nfpInfo.formatVersion.major == 0xb8;
138}
139
140bool isEqualCharacterIdBase(const nn::nfp::ModelInfo& modelInfo,
141 const NfpCharacterId& characterId) {
142 if (characterId.gameId != modelInfo.gameId)
143 return false;
144
145 return characterId.characterId == modelInfo.characterId;
146}
147
148bool isEqualUniqueNfcId(const nn::nfp::TagInfo& tagInfoA, const NfpInfo& nfpInfoB) {
149 if (!nfpInfoB.isAmiibo)
150 return false;
151
152 return isEqualUniqueNfcId(tagInfoA, tagInfoB: nfpInfoB.tagInfo);
153}
154
155bool isEqualUniqueNfcId(const nn::nfp::TagId& tagIdA, const nn::nfp::TagId& tagIdB) {
156 if (tagIdA.uuidLength != tagIdB.uuidLength)
157 return false;
158
159 for (s32 i = 0; i < tagIdA.uuidLength; i++)
160 if (tagIdA.uuid[i] != tagIdB.uuid[i])
161 return false;
162
163 return true;
164}
165
166} // namespace al
167