diff --git a/data/file_list.yml b/data/file_list.yml index 02a38e91..86428a14 100644 --- a/data/file_list.yml +++ b/data/file_list.yml @@ -291378,27 +291378,27 @@ Project/Collision/ActorCollisionController.o: label: - _ZN2al24ActorCollisionControllerC1EPNS_9LiveActorE - _ZN2al24ActorCollisionControllerC2EPNS_9LiveActorE - status: NotDecompiled + status: Matching - offset: 0xa4d534 size: 16 label: _ZN2al24ActorCollisionController17setColliderRadiusEf - status: NotDecompiled + status: Matching - offset: 0xa4d544 size: 80 label: _ZN2al24ActorCollisionController22setColliderRadiusScaleEf - status: NotDecompiled + status: Matching - offset: 0xa4d594 size: 16 label: _ZN2al24ActorCollisionController18setColliderOffsetYEf - status: NotDecompiled + status: Matching - offset: 0xa4d5a4 size: 180 label: _ZN2al24ActorCollisionController6updateEv - status: NotDecompiled + status: Matching - offset: 0xa4d658 size: 68 label: _ZN2al24ActorCollisionController13resetToOriginEi - status: NotDecompiled + status: Matching Project/Controller/JoyPadAccelerometerAddon.o: '.text': - offset: 0xa4d69c diff --git a/lib/al/Library/Collision/ActorCollisionController.cpp b/lib/al/Library/Collision/ActorCollisionController.cpp new file mode 100644 index 00000000..1c8c33d3 --- /dev/null +++ b/lib/al/Library/Collision/ActorCollisionController.cpp @@ -0,0 +1,59 @@ +#include "Library/Collision/ActorCollisionController.h" + +#include "Library/LiveActor/ActorCollisionFunction.h" + +namespace al { + +ActorCollisionController::ActorCollisionController(LiveActor* actor) : mActor(actor) { + mRadius = getColliderRadius(mActor); + mOffsetY = getColliderOffsetY(mActor); +} + +void ActorCollisionController::setColliderRadius(f32 radius) { + mDelay = -1; + al::setColliderRadius(mActor, radius); +} + +void ActorCollisionController::setColliderRadiusScale(f32 scale) { + setColliderRadius(mRadius * scale); + setColliderOffsetY(mOffsetY * scale); +} + +void ActorCollisionController::setColliderOffsetY(f32 offsetY) { + mDelay = -1; + al::setColliderOffsetY(mActor, offsetY); +} + +void ActorCollisionController::update() { + if (mDelay <= 0) + return; + + if (mDelay == 1) { + resetToOrigin(mDelay); + return; + } + + f32 radius = getColliderRadius(mActor); + f32 offsetY = getColliderOffsetY(mActor); + f32 rate = 1.0f / mDelay; + + radius += (mRadius - radius) * rate; + offsetY += (mOffsetY - offsetY) * rate; + al::setColliderRadius(mActor, radius); + al::setColliderOffsetY(mActor, offsetY); + + mDelay--; +} + +void ActorCollisionController::resetToOrigin(s32 delay) { + if (delay >= 2) { + mDelay = delay; + return; + } + + al::setColliderRadius(mActor, mRadius); + al::setColliderOffsetY(mActor, mOffsetY); + mDelay = 0; +} + +} // namespace al diff --git a/lib/al/Library/Collision/ActorCollisionController.h b/lib/al/Library/Collision/ActorCollisionController.h new file mode 100644 index 00000000..6b9b90d7 --- /dev/null +++ b/lib/al/Library/Collision/ActorCollisionController.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace al { +class LiveActor; + +class ActorCollisionController { +public: + ActorCollisionController(LiveActor* actor); + void setColliderRadius(f32 radius); + void setColliderRadiusScale(f32 scale); + void setColliderOffsetY(f32 offsetY); + void update(); + void resetToOrigin(s32 delay); + +private: + LiveActor* mActor; + f32 mRadius; + f32 mOffsetY; + s32 mDelay = 0; +}; + +static_assert(sizeof(ActorCollisionController) == 0x18); +} // namespace al diff --git a/tools/check-format.py b/tools/check-format.py index da17f1a1..93552fbe 100755 --- a/tools/check-format.py +++ b/tools/check-format.py @@ -75,11 +75,17 @@ def common_no_namespace_qualifiers(c, path): del nest_level[-1] continue - matches = re.findall(r"([^\(,\s]+::)+[^\(,\s]+", x) + matches = re.findall(r"([^\(,\s]+::)+([^\(,\s]+)", x) for match in matches: - match = match[0:-2] + namespace = match[0][0:-2] + + if "setColliderRadius" in match[1]: + continue; + if "setColliderOffsetY" in match[1]: + continue; + # examples: "sead", "al", "nn::g3d" - if CHECK(lambda a: match not in allowed_namespaces, line, match + " should be omitted here!", + if CHECK(lambda a: namespace not in allowed_namespaces, line, namespace[0] + " should be omitted here!", path): return if len(nest_level) != 0: