1#include "Player/PlayerOxygen.h"
2
3#include <math/seadMathCalcCommon.h>
4
5PlayerOxygen::PlayerOxygen() = default;
6
7void PlayerOxygen::setup(s32 no_reduce_frame, s32 reduce_frame, s32 recovery_frame,
8 s32 damage_interval) {
9 mOxygenNoReduceFrame = no_reduce_frame;
10 mOxygenReduceFrame = reduce_frame;
11 mOxygenRecoveryFrame = recovery_frame;
12 mOxygenDamageInterval = damage_interval;
13}
14
15void PlayerOxygen::reset() {
16 mOxygenLevel = 1.0;
17 mFramesReducing = 0;
18 mFramesWithoutOxygen = 0;
19}
20
21void PlayerOxygen::reduce() {
22 if (mFramesReducing++ >= mOxygenNoReduceFrame) {
23 if (mOxygenLevel <= 0)
24 mFramesWithoutOxygen++;
25 mOxygenLevel = sead::Mathf::clampMin(val: mOxygenLevel - (1.0f / mOxygenReduceFrame), min_: 0.0f);
26 }
27}
28
29void PlayerOxygen::recovery() {
30 mOxygenLevel = sead::Mathf::min(a: 1.0f, b: (1.0f / mOxygenRecoveryFrame) + mOxygenLevel);
31 mFramesReducing = 0;
32 mFramesWithoutOxygen = 0;
33}
34
35bool PlayerOxygen::isTriggerDamage() const {
36 if (mFramesWithoutOxygen)
37 return (mFramesWithoutOxygen % mOxygenDamageInterval) == 0;
38 return false;
39}
40