1#include "Player/PlayerCostumeInfo.h"
2
3#include "Library/Base/StringUtil.h"
4#include "Library/Math/MathUtil.h"
5
6PlayerHeadCostumeInfo::PlayerHeadCostumeInfo(const char* a1) {
7 costumeName = a1;
8}
9
10PlayerBodyCostumeInfo::PlayerBodyCostumeInfo(const char* a1) {
11 costumeName = a1;
12}
13
14PlayerCostumeInfo::PlayerCostumeInfo() = default;
15
16void PlayerCostumeInfo::init(const PlayerBodyCostumeInfo* body, const PlayerHeadCostumeInfo* head) {
17 mBodyInfo = body;
18 mHeadInfo = head;
19}
20
21bool PlayerCostumeInfo::isEnableBigEar() const {
22 return mBodyInfo->isBigEar && mHeadInfo->isEnableBigEar;
23}
24
25bool PlayerCostumeInfo::isEnableHairNoCap() const {
26 return mHeadInfo->isEnableHairNoCap &&
27 (mBodyInfo->isUseBodyHair && mBodyInfo->isExistHairNoCap);
28}
29
30bool PlayerCostumeInfo::isEnableCostume2D() const {
31 if (mBodyInfo->isNoPairHead)
32 return al::isEqualString(str1: mHeadInfo->costumeName, str2: "Mario");
33 return al::isEqualString(str1: mBodyInfo->costumeName, str2: mHeadInfo->costumeName);
34}
35
36bool PlayerCostumeInfo::isNeedShrinkNose() const {
37 return mHeadInfo->isShrinkNose;
38}
39
40bool PlayerCostumeInfo::isNeedBodyHair() const {
41 if (!mBodyInfo->isUseBodyHair || (mBodyInfo->isMario64 && mHeadInfo->isMario64))
42 return false;
43 return true;
44}
45
46bool PlayerCostumeInfo::isNeedSyncBodyHair() const {
47#ifdef MATCHING_HACK_NX_CLANG
48 s64 v1 = *(s64*)&mBodyInfo->isUseBodyHair;
49 if (!((char)v1))
50 return false;
51 if ((v1 & 0xFF00000000LL) && mHeadInfo->isMario64)
52 return false;
53 return !mBodyInfo->isMario64;
54#else
55 if (!mBodyInfo->isUseBodyHair)
56 return false;
57 if (mBodyInfo->isMario64 && mHeadInfo->isMario64)
58 return false;
59 return !mBodyInfo->isMario64;
60#endif
61}
62
63bool PlayerCostumeInfo::isNeedFullFaceAnim() const {
64 return mHeadInfo->isFullFace;
65}
66
67bool PlayerCostumeInfo::isHidePainNose() const {
68 return mBodyInfo->isHidePainNose || mHeadInfo->isInvisibleHead;
69}
70
71bool PlayerCostumeInfo::isEnableEarring() const {
72 if (mBodyInfo->isUseEarringPeach)
73 return !mHeadInfo->isHideEarringPeach;
74 return !mBodyInfo->isUseEarringLink || !mHeadInfo->isHideEarringLink;
75}
76
77bool PlayerCostumeInfo::isSyncFaceBeard() const {
78 return mBodyInfo->isUseBeard && mHeadInfo->isHideBeard;
79}
80
81bool PlayerCostumeInfo::isSyncStrap() const {
82 return mHeadInfo->isUseStrap && !mBodyInfo->isUseBeard;
83}
84
85bool PlayerCostumeInfo::isFollowJoeStrap() const {
86 return mHeadInfo->isUseStrap && !mBodyInfo->isMario64;
87}
88
89bool PlayerCostumeInfo::isPreventHeadPain() const {
90 return mHeadInfo->isPreventHead;
91}
92
93bool PlayerCostumeInfo::isInvisibleHead() const {
94 return mHeadInfo->isInvisibleHead;
95}
96
97s32 PlayerCostumeInfo::calcWarmLevel(s32 baseLevel) const {
98 if (mBodyInfo->isIgnoreTemperature)
99 return false;
100 return al::clamp(value: mBodyInfo->warmLevel + baseLevel, min: -3, max: 3);
101}
102