1#include "System/PlayerHitPointData.h"
2
3#include "Library/Math/MathUtil.h"
4#include "Library/Yaml/ByamlIter.h"
5#include "Library/Yaml/Writer/ByamlWriter.h"
6
7PlayerHitPointData::PlayerHitPointData() {}
8
9void PlayerHitPointData::setKidsModeFlag(bool kidsMode) {
10 mIsKidsMode = kidsMode;
11}
12
13void PlayerHitPointData::init() {
14 mIsHaveMaxUpItem = false;
15 mIsForceNormalMode = false;
16 if (mIsKidsMode)
17 mCurrentHealth = 6;
18 else
19 mCurrentHealth = 3;
20}
21
22void PlayerHitPointData::recoverMax() {
23 mCurrentHealth = getMaxCurrent();
24}
25
26s32 PlayerHitPointData::PlayerHitPointData::getCurrent() const {
27 return mCurrentHealth;
28}
29
30s32 PlayerHitPointData::getMaxCurrent() const {
31 if (mIsForceNormalMode)
32 return 3;
33
34 if (mIsHaveMaxUpItem)
35 return getMaxWithItem();
36 return getMaxWithoutItem();
37}
38
39s32 PlayerHitPointData::getMaxWithItem() const {
40 if (mIsKidsMode && !mIsForceNormalMode)
41 return 9;
42 return 6;
43}
44
45s32 PlayerHitPointData::getMaxWithoutItem() const {
46 if (mIsKidsMode && !mIsForceNormalMode)
47 return 6;
48 return 3;
49}
50
51bool PlayerHitPointData::isMaxCurrent() const {
52 return getMaxCurrent() == mCurrentHealth;
53}
54
55bool PlayerHitPointData::isMaxWithItem() const {
56 return getMaxWithItem() == mCurrentHealth;
57}
58
59void PlayerHitPointData::getMaxUpItem() {
60 mIsHaveMaxUpItem = true;
61 recoverMax();
62}
63
64void PlayerHitPointData::recover() {
65 mCurrentHealth = sead::Mathi::min(a: mCurrentHealth + 1, b: getMaxCurrent());
66}
67
68void PlayerHitPointData::recoverForDebug() {
69 if (mCurrentHealth >= getMaxCurrent() && !mIsHaveMaxUpItem)
70 mIsHaveMaxUpItem = true;
71
72 recover();
73}
74
75void PlayerHitPointData::damage() {
76 mCurrentHealth = sead::Mathi::max(a: mCurrentHealth - 1, b: 0);
77
78 if (!mIsForceNormalMode && mCurrentHealth <= getMaxWithoutItem())
79 mIsHaveMaxUpItem = false;
80}
81
82void PlayerHitPointData::kill() {
83 mCurrentHealth = 0;
84 if (!mIsForceNormalMode)
85 mIsHaveMaxUpItem = false;
86}
87
88void PlayerHitPointData::forceNormalMode() {
89 mIsForceNormalMode = true;
90 mCurrentHealth = 3;
91}
92
93void PlayerHitPointData::endForceNormalMode() {
94 mIsForceNormalMode = false;
95 recoverMax();
96}
97
98bool PlayerHitPointData::isForceNormalMode() const {
99 return mIsForceNormalMode;
100}
101
102void PlayerHitPointData::write(al::ByamlWriter* writer) {
103 writer->pushHash("PlayerHitPointData");
104 writer->addBool("IsHaveMaxUpItem", mIsHaveMaxUpItem);
105 writer->pop();
106}
107
108void PlayerHitPointData::read(const al::ByamlIter& reader) {
109 init();
110
111 al::ByamlIter hitPointData{};
112 reader.tryGetIterByKey(iter: &hitPointData, key: "PlayerHitPointData");
113 hitPointData.tryGetBoolByKey(val: &mIsHaveMaxUpItem, key: "IsHaveMaxUpItem");
114
115 recoverMax();
116}
117