| 1 | #include "Library/Nfp/NfpFunction.h" |
| 2 | |
| 3 | #include "Library/Nfp/NfpTypes.h" |
| 4 | |
| 5 | namespace al { |
| 6 | |
| 7 | bool isAnyNfcTagDetected(const NfpInfo& nfpInfo) { |
| 8 | return nfpInfo.isAmiibo || nfpInfo.isNormalNfc; |
| 9 | } |
| 10 | |
| 11 | bool isNormalNfc(const NfpInfo& nfpInfo) { |
| 12 | return nfpInfo.isNormalNfc; |
| 13 | } |
| 14 | |
| 15 | bool isAmiibo(const NfpInfo& nfpInfo) { |
| 16 | return nfpInfo.isAmiibo; |
| 17 | } |
| 18 | |
| 19 | bool 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 | |
| 26 | bool isEqualUniqueNfcId(const nn::nfp::TagInfo& tagInfoA, const nn::nfp::TagInfo& tagInfoB) { |
| 27 | return isEqualUniqueNfcId(tagIdA: tagInfoA.id, tagIdB: tagInfoB.id); |
| 28 | } |
| 29 | |
| 30 | bool isEqualCharacterId(const NfpInfo& nfpInfo, NfpCharacterId characterId) { |
| 31 | if (!nfpInfo.isAmiibo) |
| 32 | return false; |
| 33 | |
| 34 | return isEqualCharacterId(modelInfo: nfpInfo.modelInfo, characterId); |
| 35 | } |
| 36 | |
| 37 | bool isEqualCharacterId(const nn::nfp::ModelInfo& modelInfo, const NfpCharacterId& characterId) { |
| 38 | return isEqualCharacterIdBase(modelInfo, characterId) && |
| 39 | characterId.characterVariant == modelInfo.characterVariant; |
| 40 | } |
| 41 | |
| 42 | bool isEqualCharacterIdBase(const NfpInfo& nfpInfo, NfpCharacterId characterId) { |
| 43 | if (!nfpInfo.isAmiibo) |
| 44 | return false; |
| 45 | |
| 46 | return isEqualCharacterId(modelInfo: nfpInfo.modelInfo, characterId); |
| 47 | } |
| 48 | |
| 49 | bool isEqualNumberingId(const NfpInfo& nfpInfo, s32 numberingId) { |
| 50 | if (!nfpInfo.isAmiibo) |
| 51 | return false; |
| 52 | |
| 53 | return isEqualNumberingId(modelInfo: nfpInfo.modelInfo, numberingId); |
| 54 | } |
| 55 | |
| 56 | bool isEqualNumberingId(const nn::nfp::ModelInfo& modelInfo, s32 numberingId) { |
| 57 | return modelInfo.modelNumber == numberingId; |
| 58 | } |
| 59 | |
| 60 | bool 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 | |
| 70 | bool tryGetNumberingId(s32* numberingId, const NfpInfo& nfpInfo) { |
| 71 | if (!nfpInfo.isAmiibo) |
| 72 | return false; |
| 73 | |
| 74 | *numberingId = nfpInfo.modelInfo.modelNumber; |
| 75 | return true; |
| 76 | } |
| 77 | |
| 78 | bool isCharacterIdBaseMario(const NfpInfo& nfpInfo) { |
| 79 | return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x00, .characterVariant: 0x00}); |
| 80 | } |
| 81 | |
| 82 | bool isCharacterIdBaseDrMario(const NfpInfo& nfpInfo) { |
| 83 | return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x00, .characterVariant: 0x01}); |
| 84 | } |
| 85 | |
| 86 | bool isCharacterIdBasePeach(const NfpInfo& nfpInfo) { |
| 87 | return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x02, .characterVariant: 0x00}); |
| 88 | } |
| 89 | |
| 90 | bool isCharacterIdBaseKoopa(const NfpInfo& nfpInfo) { |
| 91 | return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x05, .characterVariant: 0x00}); |
| 92 | } |
| 93 | |
| 94 | bool isCharacterIdBaseYoshi(const NfpInfo& nfpInfo) { |
| 95 | return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x03, .characterVariant: 0x00}); |
| 96 | } |
| 97 | |
| 98 | bool isCharacterIdBaseKinopio(const NfpInfo& nfpInfo) { |
| 99 | return isEqualCharacterIdBase(nfpInfo, characterId: {.gameId: 0x00, .characterId: 0x0a, .characterVariant: 0x00}); |
| 100 | } |
| 101 | |
| 102 | bool isNeedFormat(const NfpInfo& nfpInfo) { |
| 103 | return nfpInfo.isNeedFormat; |
| 104 | } |
| 105 | |
| 106 | bool isNeedRestore(const NfpInfo& nfpInfo) { |
| 107 | return nfpInfo.isNeedRestore; |
| 108 | } |
| 109 | |
| 110 | bool isNeedRegister(const NfpInfo& nfpInfo) { |
| 111 | return nfpInfo.isNeedRegister; |
| 112 | } |
| 113 | |
| 114 | bool isNeedRegisterNickName(const NfpInfo& nfpInfo) { |
| 115 | return (char)nfpInfo.nickName[0] == '\0'; |
| 116 | } |
| 117 | |
| 118 | bool isValidRegisterInfo(const NfpInfo& nfpInfo) { |
| 119 | return false; |
| 120 | } |
| 121 | |
| 122 | void getAmiiboOwnerName(sead::BufferedSafeStringBase<char16>* ownerName, const NfpInfo& nfpInfo) { |
| 123 | // Stubbed in game |
| 124 | } |
| 125 | |
| 126 | void getAmiiboNickName(sead::BufferedSafeStringBase<char16>* nickName, const NfpInfo& nfpInfo) { |
| 127 | nickName->copy(src: nfpInfo.nickName); |
| 128 | } |
| 129 | |
| 130 | bool 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 | |
| 140 | bool 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 | |
| 148 | bool 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 | |
| 155 | bool 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 | |