diff --git a/include/dusk/settings.h b/include/dusk/settings.h index e842c1177a..923a1e9fc6 100644 --- a/include/dusk/settings.h +++ b/include/dusk/settings.h @@ -202,6 +202,8 @@ struct UserSettings { ConfigVar invertCameraYAxis; ConfigVar invertFirstPersonXAxis; ConfigVar invertFirstPersonYAxis; + ConfigVar invertAirSwimX; + ConfigVar invertAirSwimY; ConfigVar freeCameraSensitivity; ConfigVar debugFlyCam; ConfigVar debugFlyCamLockEvents; diff --git a/src/d/actor/d_a_alink_swim.inc b/src/d/actor/d_a_alink_swim.inc index 038d710e80..19131e404a 100644 --- a/src/d/actor/d_a_alink_swim.inc +++ b/src/d/actor/d_a_alink_swim.inc @@ -216,7 +216,7 @@ void daAlink_c::setSpeedAndAngleSwim() { if (checkEventRun()) { var_r28 = mMoveAngle; } else { - var_r28 = shape_angle.y + (16384.0f * cM_ssin(mStickAngle)); + var_r28 = shape_angle.y + (16384.0f * cM_ssin(mStickAngle) IF_DUSK(* (dusk::getSettings().game.invertAirSwimX ? -1.0f : 1.0f))); } cLib_addCalcAngleS(&shape_angle.y, var_r28, mpHIO->mSwim.m.mUnderwaterTurnRate, mpHIO->mSwim.m.mUnderwaterMaxTurn, mpHIO->mSwim.m.mUnderwaterMinTurn); @@ -835,7 +835,7 @@ void daAlink_c::setSwimMoveAnime() { } else { s16 var_r24; if (checkInputOnR() && !checkEventRun()) { - var_r24 = 13653.0f * cM_scos(mStickAngle); + var_r24 = 13653.0f * cM_scos(mStickAngle) IF_DUSK(* (dusk::getSettings().game.invertAirSwimY ? -1.0f : 1.0f)); } else { var_r24 = 0; } diff --git a/src/d/actor/d_a_kago.cpp b/src/d/actor/d_a_kago.cpp index 9444237f12..efdad44516 100644 --- a/src/d/actor/d_a_kago.cpp +++ b/src/d/actor/d_a_kago.cpp @@ -3530,6 +3530,15 @@ void daKago_c::action() { #endif mStickY = mDoCPd_c::getStickY(PAD_1); +#ifdef TARGET_PC + if(dusk::getSettings().game.invertAirSwimX) { + mStickX = -mStickX; + } + if(dusk::getSettings().game.invertAirSwimY) { + mStickY = -mStickY; + } +#endif + u8 prevIsWaterfall = mIsWaterfall; mIsWaterfall = FALSE; fpcM_Search(s_waterfall, this); diff --git a/src/dusk/settings.cpp b/src/dusk/settings.cpp index 7c4e42763a..ef639e2b05 100644 --- a/src/dusk/settings.cpp +++ b/src/dusk/settings.cpp @@ -90,6 +90,8 @@ UserSettings g_userSettings = { .invertCameraYAxis {"game.invertCameraYAxis", false}, .invertFirstPersonXAxis {"game.invertFirstPersonXAxis", false}, .invertFirstPersonYAxis {"game.invertFirstPersonYAxis", false}, + .invertAirSwimX {"game.invertAirSwimX", false}, + .invertAirSwimY {"game.invertAirSwimY", false}, .freeCameraSensitivity {"game.freeCameraSensitivity", 1.0f}, .debugFlyCam {"game.debugFlyCam", false}, .debugFlyCamLockEvents {"game.debugFlyCamLockEvents", true}, @@ -219,6 +221,8 @@ void registerSettings() { Register(g_userSettings.game.invertCameraYAxis); Register(g_userSettings.game.invertFirstPersonXAxis); Register(g_userSettings.game.invertFirstPersonYAxis); + Register(g_userSettings.game.invertAirSwimX); + Register(g_userSettings.game.invertAirSwimY); Register(g_userSettings.game.freeCameraSensitivity); Register(g_userSettings.game.minimalHUD); Register(g_userSettings.game.pauseOnFocusLost); diff --git a/src/dusk/ui/settings.cpp b/src/dusk/ui/settings.cpp index 3be9ce25e2..d6545f5121 100644 --- a/src/dusk/ui/settings.cpp +++ b/src/dusk/ui/settings.cpp @@ -957,6 +957,10 @@ SettingsWindow::SettingsWindow(bool prelaunch) : mPrelaunch(prelaunch) { "Invert horizontal movement while aiming with items or first person camera. Applies only to the control stick (the gyroscope can be inverted in Input settings)."); addOption("Invert First Person Y Axis", getSettings().game.invertFirstPersonYAxis, "Invert vertical movement while aiming with items or first person camera. Applies only to the control stick (the gyroscope can be inverted in Input settings)."); + addOption("Invert Air/Swim X Axis", getSettings().game.invertAirSwimX, + "Invert horizontal movement while flying or swimming."); + addOption("Invert Air/Swim Y Axis", getSettings().game.invertAirSwimY, + "Invert vertical movement while flying or swimming."); leftPane.add_section("Gyro"); leftPane.register_control(