Initial implementation of gyro aim

This commit is contained in:
Irastris
2026-04-12 01:15:52 -04:00
parent d481a23c49
commit b5bb6bf53a
11 changed files with 241 additions and 8 deletions
+29
View File
@@ -83,3 +83,32 @@ void daAlink_c::handleQuickTransform() {
OSReport("Running quick transform!");
procCoMetamorphoseInit();
}
bool daAlink_c::checkGyroAimItemContext() {
if (checkWolf()) {
return false;
}
switch (mProcID) {
case PROC_BOW_SUBJECT:
case PROC_BOOMERANG_SUBJECT:
case PROC_COPY_ROD_SUBJECT:
case PROC_HOOKSHOT_SUBJECT:
case PROC_SWIM_HOOKSHOT_SUBJECT:
case PROC_HORSE_BOW_SUBJECT:
case PROC_HORSE_BOOMERANG_SUBJECT:
case PROC_HORSE_HOOKSHOT_SUBJECT:
case PROC_CANOE_BOW_SUBJECT:
case PROC_CANOE_BOOMERANG_SUBJECT:
case PROC_CANOE_HOOKSHOT_SUBJECT:
case PROC_HOOKSHOT_ROOF_WAIT:
case PROC_HOOKSHOT_ROOF_SHOOT:
case PROC_HOOKSHOT_WALL_WAIT:
case PROC_HOOKSHOT_WALL_SHOOT:
return true;
case PROC_IRON_BALL_SUBJECT:
return itemButton() && mItemVar0.field_0x3018 == 2;
default:
return false;
}
}
+38
View File
@@ -10,6 +10,10 @@
#include "d/actor/d_a_tag_mstop.h"
#include "d/actor/d_a_tag_mhint.h"
#if TARGET_PC
#include "dusk/gyro_aim.h"
#endif
bool daAlink_c::checkNoSubjectModeCamera() {
return dCam_getBody()->Type() == dCam_getBody()->GetCameraTypeFromCameraName("Rotary") ||
dCam_getBody()->Type() == dCam_getBody()->GetCameraTypeFromCameraName("Rampart2") ||
@@ -125,6 +129,40 @@ BOOL daAlink_c::setBodyAngleToCamera() {
sp8 = mBodyAngle.x;
}
#if TARGET_PC
if (dusk::getSettings().game.enableGyroAim && checkGyroAimItemContext()) {
f32 gyro_scale = 1.0f;
if (checkWolfEyeUp()) {
gyro_scale *= 0.6f;
}
if (dComIfGp_checkPlayerStatus0(0, 0x200000)) {
gyro_scale /= dComIfGp_getCameraZoomScale(field_0x317c);
}
f32 gy_yaw = 0.f;
f32 gy_pitch = 0.f;
dusk::gyro_aim::consumeAimDeltas(gy_yaw, gy_pitch);
if (dusk::getSettings().game.gyroAimInvertPitch) {
gy_pitch = -gy_pitch;
}
if (dusk::getSettings().game.gyroAimInvertYaw) {
gy_yaw = -gy_yaw;
}
if (dusk::getSettings().game.enableMirrorMode) {
gy_yaw = -gy_yaw;
}
shape_angle.y = shape_angle.y + cM_rad2s(gy_yaw * gyro_scale);
sp8 = sp8 + cM_rad2s(gy_pitch * gyro_scale);
if (checkNotItemSinkLimit() && sp8 > 0 && sp8 > mBodyAngle.x) {
sp8 = mBodyAngle.x;
}
}
#endif
if (checkNotItemSinkLimit() && sp8 > 0) {
cLib_addCalcAngleS(&sp8, 0, 5, 0x1000, 0x400);
}