mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-09-12 19:36:01 -04:00
Add options for binding custom buttons to specific actions (#1141)
* custom action framework and first person custom action * add bind for midna call * custom binding for opening dusklight menu * turbo speed button action * text descriptions * fix not stopping default GC controller menu combo * more explanation text * block bind actions when in the dusklight menu
This commit is contained in:
@@ -51,10 +51,13 @@
|
||||
#include "d/actor/d_a_ni.h"
|
||||
#include "d/d_s_play.h"
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/action_bindings.h"
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/settings.h"
|
||||
#include "res/Object/Alink.h"
|
||||
#include <cstring>
|
||||
#endif
|
||||
|
||||
static int daAlink_Create(fopAc_ac_c* i_this);
|
||||
static int daAlink_Delete(daAlink_c* i_this);
|
||||
@@ -9363,6 +9366,12 @@ BOOL daAlink_c::spActionTrigger() {
|
||||
}
|
||||
|
||||
BOOL daAlink_c::midnaTalkTrigger() const {
|
||||
#if TARGET_PC
|
||||
// If we have a custom bind for Midna, check that instead
|
||||
if (dusk::isActionBound(dusk::ActionBinds::CALL_MIDNA, 0)) {
|
||||
return dusk::getActionBindTrig(dusk::ActionBinds::CALL_MIDNA, 0);
|
||||
}
|
||||
#endif
|
||||
return mItemTrigger & BTN_Z;
|
||||
}
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
#if TARGET_PC
|
||||
#include "dusk/gyro.h"
|
||||
#include "dusk/action_bindings.h"
|
||||
#endif
|
||||
|
||||
bool daAlink_c::checkNoSubjectModeCamera() {
|
||||
@@ -192,7 +193,9 @@ BOOL daAlink_c::subjectCancelTrigger() {
|
||||
BOOL daAlink_c::checkSubjectEnd(BOOL i_isPlaySe) {
|
||||
setDoStatus(BUTTON_STATUS_BACK);
|
||||
|
||||
if (checkEventRun() || checkEquipAnime() || doTrigger() || checkSetItemTrigger(dItemNo_HAWK_EYE_e) || subjectCancelTrigger() || checkEndResetFlg0(ERFLG0_FORCE_SUBJECT_CANCEL) || dComIfGp_checkCameraAttentionStatus(field_0x317c, 0x2000)) {
|
||||
// Allow pressing the first person binding to also leave first person
|
||||
if (IF_DUSK(dusk::getActionBindTrig(dusk::ActionBinds::FIRST_PERSON_CAMERA, 0)) ||
|
||||
checkEventRun() || checkEquipAnime() || doTrigger() || checkSetItemTrigger(dItemNo_HAWK_EYE_e) || subjectCancelTrigger() || checkEndResetFlg0(ERFLG0_FORCE_SUBJECT_CANCEL) || dComIfGp_checkCameraAttentionStatus(field_0x317c, 0x2000)) {
|
||||
if (i_isPlaySe) {
|
||||
seStartSystem(Z2SE_SUBJ_VIEW_OUT);
|
||||
}
|
||||
|
||||
+15
-5
@@ -31,6 +31,7 @@
|
||||
#if TARGET_PC
|
||||
#include "dusk/frame_interpolation.h"
|
||||
#include "dusk/logging.h"
|
||||
#include "dusk/action_bindings.h"
|
||||
#include "imgui.h"
|
||||
#endif
|
||||
|
||||
@@ -838,6 +839,12 @@ void dCamera_c::updatePad() {
|
||||
mTrigB = mDoCPd_c::getTrigB(mPadID) ? true : false;
|
||||
|
||||
#if TARGET_PC
|
||||
// If our custom action binding is triggered, and we're not already in first person, go into first person
|
||||
if (dusk::getActionBindTrig(dusk::ActionBinds::FIRST_PERSON_CAMERA, mPadID) && mGear != -1) {
|
||||
setComStat(0x1000);
|
||||
mGear = 0;
|
||||
}
|
||||
|
||||
if (mCamParam.mManualMode) {
|
||||
return;
|
||||
}
|
||||
@@ -877,7 +884,8 @@ void dCamera_c::updatePad() {
|
||||
|
||||
if (mPadInfo.mCStick.mLastPosY < -mCamSetup.mCStick.SwTHH()) {
|
||||
if (mCStickYState != -1) {
|
||||
if (mGear == -1 && mCurMode == 4) {
|
||||
// Don't use regular first person trigger if custom mapping is set
|
||||
if (mGear == -1 && mCurMode == 4 IF_DUSK(&& !dusk::isActionBound(dusk::ActionBinds::FIRST_PERSON_CAMERA, mPadID))) {
|
||||
mGear = 0;
|
||||
setComStat(0x2000);
|
||||
} else if (mGear == 0 && sp6C) {
|
||||
@@ -888,7 +896,8 @@ void dCamera_c::updatePad() {
|
||||
mCStickYState = -1;
|
||||
} else if (mPadInfo.mCStick.mLastPosY > mCamSetup.mCStick.SwTHH()) {
|
||||
if (mCStickYState != 1) {
|
||||
if (mGear == 0 && sp6B) {
|
||||
// Don't use regular first person trigger if custom mapping is set
|
||||
if (mGear == 0 && sp6B IF_DUSK(&& !dusk::isActionBound(dusk::ActionBinds::FIRST_PERSON_CAMERA, mPadID))) {
|
||||
setComStat(0x1000);
|
||||
} else if (mGear == 1) {
|
||||
mGear = 0;
|
||||
@@ -7649,9 +7658,10 @@ bool dCamera_c::freeCamera() {
|
||||
f32 magnitude = sqrt(mPadInfo.mCStick.mLastPosX * mPadInfo.mCStick.mLastPosX + mPadInfo.mCStick.mLastPosY * mPadInfo.mCStick.mLastPosY);
|
||||
|
||||
// If we aren't in manual cam mode, don't trigger it if the player tries to hit C-up
|
||||
// for first person
|
||||
if (mPadInfo.mCStick.mLastPosX != 0 || mPadInfo.mCStick.mLastPosY < 0 ||
|
||||
(mCamParam.mManualMode == 1 && mPadInfo.mCStick.mLastPosY != 0)) {
|
||||
// for first person unless they have first person bound to a custom binding
|
||||
if ((dusk::isActionBound(dusk::ActionBinds::FIRST_PERSON_CAMERA, mPadID) && mPadInfo.mCStick.mLastPosY != 0) ||
|
||||
mPadInfo.mCStick.mLastPosX != 0 || mPadInfo.mCStick.mLastPosY < 0 || (mCamParam.mManualMode == 1 && mPadInfo.mCStick.mLastPosY != 0))
|
||||
{
|
||||
mCamParam.mManualMode = 1;
|
||||
camMovement = camMovement.normalize();
|
||||
camMovement.y *= dusk::getSettings().game.invertCameraYAxis ? 1.0f : -1.0f;
|
||||
|
||||
Reference in New Issue
Block a user