mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
159 lines
3.7 KiB
C
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;
|
|
}
|