1#include "Util/ExternalForceKeeper.h"
2
3#include "Util/SensorMsgFunction.h"
4
5ExternalForceKeeper::ExternalForceKeeper() {}
6
7bool ExternalForceKeeper::receiveMsg(const al::SensorMsg* message, al::HitSensor* other,
8 al::HitSensor* self) {
9 if (rs::isMsgByugoBlow(message)) {
10 sead::Vector3f force = sead::Vector3f::zero;
11 rs::tryGetByugoBlowForce(&force, message);
12
13 mMinForce.x = sead::Mathf::min(a: mMinForce.x, b: force.x);
14 mMinForce.y = sead::Mathf::min(a: mMinForce.y, b: force.y);
15 mMinForce.z = sead::Mathf::min(a: mMinForce.z, b: force.z);
16
17 mMaxForce.x = sead::Mathf::max(a: mMaxForce.x, b: force.x);
18 mMaxForce.y = sead::Mathf::max(a: mMaxForce.y, b: force.y);
19 mMaxForce.z = sead::Mathf::max(a: mMaxForce.z, b: force.z);
20
21 return true;
22 }
23
24 if (rs::isMsgAirExplosion(message)) {
25 sead::Vector3f force = sead::Vector3f::zero;
26 rs::tryGetAirExplosionForce(&force, message);
27
28 mMinForce.x = sead::Mathf::min(a: mMinForce.x, b: force.x);
29 mMinForce.y = sead::Mathf::min(a: mMinForce.y, b: force.y);
30 mMinForce.z = sead::Mathf::min(a: mMinForce.z, b: force.z);
31
32 mMaxForce.x = sead::Mathf::max(a: mMaxForce.x, b: force.x);
33 mMaxForce.y = sead::Mathf::max(a: mMaxForce.y, b: force.y);
34 mMaxForce.z = sead::Mathf::max(a: mMaxForce.z, b: force.z);
35
36 return true;
37 }
38
39 return false;
40}
41
42void ExternalForceKeeper::reset() {
43 mMinForce.set(sead::Vector3f::zero);
44 mMaxForce.set(sead::Vector3f::zero);
45}
46
47void ExternalForceKeeper::calcForce(sead::Vector3f* force) const {
48 force->x = mMinForce.x + mMaxForce.x;
49 force->y = mMinForce.y + mMaxForce.y;
50 force->z = mMinForce.z + mMaxForce.z;
51}
52