Files
ac-decomp/rel/m_controller.c
T
2023-05-23 18:49:30 -04:00

159 lines
3.7 KiB
C

#include "m_controller.h"
#include "game.h"
#include "m_lib.h"
#include "m_event.h"
#include "MSL_C/w_math.h"
#include "sys_math.h"
/**
* @brief Constructor for MCON.
**/
extern void mCon_ct() { }
/**
* @brief Destructor for MCON.
**/
extern void mCon_dt() { }
/**
* @brief Controller input processing function.
* Only processes port 1 controller.
*
* @param mcon Pointer to MCON struct which will be updated
* @param stick_x Joystick X position
* @param stick_y Joystick Y position
**/
extern void mCon_calc(MCON* mcon, f32 stick_x, f32 stick_y) {
f32 t;
mcon->last_move_pX = mcon->move_pX;
mcon->last_move_pY = mcon->move_pY;
mcon->last_move_pR = mcon->move_pR;
mcon->last_move_angle = mcon->move_angle;
mcon->last_adjusted_pX = mcon->adjusted_pX;
mcon->last_adjusted_pY = mcon->adjusted_pY;
mcon->last_adjusted_pR = mcon->adjusted_pR;
t = sqrtf(stick_x * stick_x + stick_y * stick_y);
if (t <= STICK_MIN) {
mcon->move_pX = 0.0f;
mcon->move_pY = 0.0f;
mcon->move_pR = 0.0f;
mcon->adjusted_pX = 0.0f;
mcon->adjusted_pY = 0.0f;
mcon->adjusted_pR = 0.0f;
}
else {
s16 stick_angle = atans_table(stick_x, stick_y);
if (t > STICK_MAX) {
stick_x = cos_s(stick_angle) * STICK_MAX;
stick_y = sin_s(stick_angle) * STICK_MAX;
t = STICK_MAX;
}
mcon->move_angle = stick_angle;
mcon->move_pX = check_percent_abs(stick_x, STICK_MIN, STICK_MAX, STICK_UNCORRECTED_SCALE, 0);
mcon->move_pY = check_percent_abs(stick_y, STICK_MIN, STICK_MAX, STICK_UNCORRECTED_SCALE, 0);
mcon->move_pR = check_percent_abs( t, STICK_MIN, STICK_MAX, STICK_UNCORRECTED_SCALE, 0);
mcon->adjusted_pX = check_percent_abs(stick_x, STICK_MIN, STICK_MAX, STICK_CORRECTED_SCALE, 1);
mcon->adjusted_pY = check_percent_abs(stick_y, STICK_MIN, STICK_MAX, STICK_CORRECTED_SCALE, 1);
mcon->adjusted_pR = check_percent_abs( t, STICK_MIN, STICK_MAX, STICK_CORRECTED_SCALE, 1);
}
}
/**
* @brief Controller main process.
*
* @param game Pointer to current GAME structure
**/
extern void mCon_main(GAME* game) {
f32 stick_x = getJoystick_X();
f32 stick_y = getJoystick_Y();
mCon_calc(&game->mcon, stick_x, stick_y);
}
/**
* @brief Checks if a specific button combination currently pressed.
*
* @param mask Button combination to check
* @return TRUE when the button combination is pressed, FALSE otherwise
**/
extern int chkButton(u16 mask) {
if (mEv_CheckTitleDemo() > 0) {
return FALSE;
}
return (mask & (gamePT->pads[0].now.button)) == mask;
}
/**
* @brief Gets the currently pressed buttons.
*
* @return Pressed buttons
**/
extern u16 getButton() {
if (mEv_CheckTitleDemo() > 0) {
return BUTTON_NONE;
}
return gamePT->pads[0].now.button;
}
/**
* @brief Checks if a specific button combination was pressed this frame.
*
* @param mask Button combination to check
* @return TRUE when the button combination was pressed this frame, FALSE otherwise
**/
extern int chkTrigger(u16 mask) {
if (mEv_CheckTitleDemo() > 0) {
return FALSE;
}
return (mask & (gamePT->pads[0].on.button)) == mask;
}
/**
* @brief Gets the buttons pressed on the current frame.
*
* @return Buttons pressed on the current frame
**/
extern u16 getTrigger() {
if (mEv_CheckTitleDemo() > 0) {
return BUTTON_NONE;
}
return gamePT->pads[0].on.button;
}
/**
* @brief Gets the current joystick X position.
*
* @return Joystick X position
**/
extern int getJoystick_X() {
if (mEv_CheckTitleDemo() > 0) {
return 0;
}
return gamePT->pads[0].now.stick_x;
}
/**
* @brief Gets the current joystick Y position.
*
* @return Joystick Y position
**/
extern int getJoystick_Y() {
if (mEv_CheckTitleDemo() > 0) {
return 0;
}
return gamePT->pads[0].now.stick_y;
}