2024-02-20 17:51:59 +00:00
|
|
|
#include <math.h>
|
|
|
|
|
2024-02-21 13:25:55 +00:00
|
|
|
#include "const.h"
|
|
|
|
#include "movement.h"
|
|
|
|
#include "system/mouse_io.h"
|
|
|
|
|
|
|
|
#include "system/pc_stuff.h"
|
2024-02-20 17:51:59 +00:00
|
|
|
|
2024-02-21 13:25:55 +00:00
|
|
|
void captureAndLimitMousePosition(
|
|
|
|
struct RabbitPosition *pos,
|
|
|
|
struct MouseStatus *mouseStatus
|
|
|
|
) {
|
|
|
|
pos->oldMouseDotPosition[0] = pos->mouseDotPosition[0];
|
|
|
|
pos->oldMouseDotPosition[1] = pos->mouseDotPosition[1];
|
2024-02-20 17:51:59 +00:00
|
|
|
|
2024-02-21 13:25:55 +00:00
|
|
|
pos->mouseDotPosition[0] = mouseStatus->xPosition;
|
|
|
|
pos->mouseDotPosition[1] = mouseStatus->yPosition;
|
|
|
|
|
|
|
|
if (pos->mouseDotPosition[0] < MOUSE_LIMIT_LEFT) pos->mouseDotPosition[0] = MOUSE_LIMIT_LEFT;
|
|
|
|
if (pos->mouseDotPosition[0] >= MOUSE_LIMIT_RIGHT) pos->mouseDotPosition[0] = MOUSE_LIMIT_RIGHT;
|
|
|
|
if (pos->mouseDotPosition[1] < MOUSE_LIMIT_TOP) pos->mouseDotPosition[1] = MOUSE_LIMIT_TOP;
|
|
|
|
if (pos->mouseDotPosition[1] >= MOUSE_LIMIT_BOTTOM) pos->mouseDotPosition[1] = MOUSE_LIMIT_BOTTOM;
|
|
|
|
}
|
|
|
|
|
|
|
|
void calculateTargetAngle(
|
|
|
|
struct RabbitPosition *pos,
|
|
|
|
struct MouseStatus *mouseStatus
|
|
|
|
) {
|
|
|
|
float distanceX, distanceY;
|
|
|
|
float angle;
|
2024-02-20 17:51:59 +00:00
|
|
|
|
2024-02-21 13:25:55 +00:00
|
|
|
// Position the cursor
|
|
|
|
distanceX = pos->mouseDotPosition[0] - pos->rabbitPosition[0];
|
2024-02-25 17:52:42 +00:00
|
|
|
distanceY = pos->mouseDotPosition[1] - pos->rabbitPosition[1];
|
2024-02-20 17:51:59 +00:00
|
|
|
|
2024-02-21 13:25:55 +00:00
|
|
|
angle = atan2(distanceY, distanceX) * RAD2DEG + 90;
|
2024-02-20 17:51:59 +00:00
|
|
|
if (angle < 0) angle += 360;
|
|
|
|
|
|
|
|
distanceX = sin(angle * DEG2RAD) * MOUSE_DISTANCE;
|
|
|
|
distanceY = -cos(angle * DEG2RAD) * MOUSE_DISTANCE;
|
|
|
|
|
2024-02-21 13:25:55 +00:00
|
|
|
pos->oldMousePosition[0] = pos->mousePosition[0];
|
|
|
|
pos->oldMousePosition[1] = pos->mousePosition[1];
|
|
|
|
|
|
|
|
pos->mousePosition[0] = pos->rabbitPosition[0] + distanceX;
|
|
|
|
pos->mousePosition[1] = pos->rabbitPosition[1] + distanceY;
|
|
|
|
|
|
|
|
// get the shot angle
|
|
|
|
distanceX = pos->mouseDotPosition[0] - pos->rabbitPosition[0];
|
|
|
|
distanceY = pos->mouseDotPosition[1] - pos->rabbitPosition[1];
|
|
|
|
|
|
|
|
angle = atan2(distanceY, distanceX) * RAD2DEG + 90;
|
|
|
|
if (angle < 0) angle += 360;
|
|
|
|
|
|
|
|
pos->mouseAngle = angle;
|
|
|
|
}
|
|
|
|
|
|
|
|
void handleRabbitMovement(
|
|
|
|
struct RabbitPosition *pos,
|
|
|
|
struct KeyboardKeydownState *keyboardKeydownState
|
|
|
|
) {
|
|
|
|
int i;
|
|
|
|
|
|
|
|
if (keyboardKeydownState->KEY_W) {
|
|
|
|
pos->rabbitVelocity[1] -= RABBIT_MOTION_ACCELERATION;
|
|
|
|
if (pos->rabbitVelocity[1] < -RABBIT_MOTION_MAX_SPEED) {
|
|
|
|
pos->rabbitVelocity[1] = -RABBIT_MOTION_MAX_SPEED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (keyboardKeydownState->KEY_S) {
|
|
|
|
pos->rabbitVelocity[1] += RABBIT_MOTION_ACCELERATION;
|
|
|
|
if (pos->rabbitVelocity[1] > RABBIT_MOTION_MAX_SPEED) {
|
|
|
|
pos->rabbitVelocity[1] = RABBIT_MOTION_MAX_SPEED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (keyboardKeydownState->KEY_A) {
|
|
|
|
pos->rabbitVelocity[0] -= RABBIT_MOTION_ACCELERATION;
|
|
|
|
if (pos->rabbitVelocity[0] < -RABBIT_MOTION_MAX_SPEED) {
|
|
|
|
pos->rabbitVelocity[0] = -RABBIT_MOTION_MAX_SPEED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (keyboardKeydownState->KEY_D) {
|
|
|
|
pos->rabbitVelocity[0] += RABBIT_MOTION_ACCELERATION;
|
|
|
|
if (pos->rabbitVelocity[0] > RABBIT_MOTION_MAX_SPEED) {
|
|
|
|
pos->rabbitVelocity[0] = RABBIT_MOTION_MAX_SPEED;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < 2; ++i) {
|
|
|
|
pos->oldRabbitPosition[i] = pos->rabbitPosition[i];
|
|
|
|
pos->rabbitPosition[i] += (pos->rabbitVelocity[i] / RABBIT_MOTION_VELOCITY_DECAY);
|
|
|
|
|
|
|
|
if (pos->rabbitPosition[i] < pos->rabbitLimits[0][i]) {
|
|
|
|
pos->rabbitPosition[i] = pos->rabbitLimits[0][i];
|
|
|
|
}
|
|
|
|
if (pos->rabbitPosition[i] >= pos->rabbitLimits[1][i]) {
|
|
|
|
pos->rabbitPosition[i] = pos->rabbitLimits[1][i];
|
|
|
|
}
|
2024-02-20 17:51:59 +00:00
|
|
|
|
2024-02-21 13:25:55 +00:00
|
|
|
if (pos->rabbitVelocity[i] < 0) {
|
|
|
|
pos->rabbitVelocity[i] += RABBIT_MOTION_DRAG;
|
|
|
|
if (pos->rabbitVelocity[i] > 0) pos->rabbitVelocity[i] = 0;
|
|
|
|
}
|
|
|
|
if (pos->rabbitVelocity[i] > 0) {
|
|
|
|
pos->rabbitVelocity[i] -= RABBIT_MOTION_DRAG;
|
|
|
|
if (pos->rabbitVelocity[i] < 0) pos->rabbitVelocity[i] = 0;
|
|
|
|
}
|
|
|
|
}
|
2024-02-20 17:51:59 +00:00
|
|
|
}
|