1#include "Player/PlayerActionFunction.h"
2
3#include "Library/Math/MathUtil.h"
4
5namespace PlayerActionFunction {
6
7f32 accel(f32 speed, f32 speedMax, f32 accel) {
8 if (speed > speedMax)
9 return speed;
10 return sead::Mathf::clampMax(val: speed + accel, max_: speedMax);
11}
12
13f32 brake(f32 speed, u32 frames, f32 speedMax) {
14 if (speed == 0.0f)
15 return speed;
16 f32 decel = speedMax / frames;
17 if (speed < 0.0f) {
18 speed += decel;
19 if (speed > 0.0f)
20 return 0.0f;
21 } else {
22 speed -= decel;
23 if (speed < 0.0f)
24 return 0.0f;
25 }
26 return speed;
27}
28
29f32 brakeLimit(f32 speed, u32 frames, f32 speedMax, f32 speedMin) {
30 return sead::Mathf::clampMin(val: speed - (speedMax - speedMin) / frames, min_: speedMin);
31}
32
33f32 calcJumpSpeed(f32 speedFront, f32 speedMin, f32 speedMax, f32 jumpPowerMin, f32 jumpPowerMax) {
34 if (al::isNearZero(value: jumpPowerMax - jumpPowerMin))
35 return jumpPowerMax;
36
37 f32 clampedSpeedFront = sead::Mathf::clamp(value: speedFront, low: speedMin, high: speedMax);
38 f32 jumpFactor =
39 sead::Mathf::clamp(value: (clampedSpeedFront - speedMin) / (speedMax - speedMin), low: 0.0f, high: 1.0f);
40 return ((jumpPowerMax - jumpPowerMin) * jumpFactor + jumpPowerMin);
41}
42
43bool isOppositeDir(const sead::Vector3f& a, const sead::Vector3f& b) {
44 return b.dot(t: a) <= -0.087156f; // sin(5°)
45}
46
47bool isOppositeVec(const sead::Vector3f& a, const sead::Vector3f& b) {
48 sead::Vector3f normalizedA = {0.0f, 0.0f, 0.0f};
49 if (!al::tryNormalizeOrZero(out: &normalizedA, vec: a))
50 return false;
51 sead::Vector3f normalizedB = {0.0f, 0.0f, 0.0f};
52 if (!al::tryNormalizeOrZero(out: &normalizedB, vec: b))
53 return false;
54 return isOppositeDir(a: normalizedA, b: normalizedB);
55}
56
57f32 calcStickPow(f32 pow) {
58 return sead::Mathf::sign(value: pow) *
59 sead::Mathf::clamp(value: (sead::Mathf::sign(value: pow) * pow - 0.1f) / 0.9f, low: 0.0f, high: 1.0f);
60}
61
62} // namespace PlayerActionFunction
63