This repository has been archived on 2022-05-21. You can view files and clone it, but cannot push or open issues or pull requests.
LEFTONE/core/loplayer/controller.c
falsycat 84c3a02b9a [RELEASE] u22-v03
This version is submitted to U22 breau.
2020-09-14 00:00:00 +00:00

80 lines
2.5 KiB
C

#include "./controller.h"
#include <assert.h>
#include <stdbool.h>
#include <stddef.h>
#include "core/locommon/input.h"
#include "core/locommon/position.h"
void loplayer_controller_initialize(loplayer_controller_t* controller) {
assert(controller != NULL);
*controller = (typeof(*controller)) {0};
}
void loplayer_controller_deinitialize(loplayer_controller_t* controller) {
assert(controller != NULL);
}
void loplayer_controller_update(
loplayer_controller_t* controller,
const locommon_input_t* input,
const locommon_position_t* cursor) {
assert(controller != NULL);
assert(input != NULL);
assert(locommon_position_valid(cursor));
controller->looking = *cursor;
controller->cursor = input->cursor;
controller->movement = LOPLAYER_CONTROLLER_MOVEMENT_NONE;
controller->action = LOPLAYER_CONTROLLER_ACTION_NONE;
const bool prev_jump =
controller->prev.buttons & LOCOMMON_INPUT_BUTTON_JUMP;
const bool prev_guarding =
controller->prev.buttons & LOCOMMON_INPUT_BUTTON_GUARD;
const bool prev_dash =
controller->prev.buttons & LOCOMMON_INPUT_BUTTON_DASH;
const bool prev_menu =
controller->prev.buttons & LOCOMMON_INPUT_BUTTON_MENU;
if (input->buttons & LOCOMMON_INPUT_BUTTON_JUMP && !prev_jump) {
controller->movement = LOPLAYER_CONTROLLER_MOVEMENT_JUMP;
} else if (input->buttons & LOCOMMON_INPUT_BUTTON_LEFT) {
controller->movement = LOPLAYER_CONTROLLER_MOVEMENT_WALK_LEFT;
if (input->buttons & LOCOMMON_INPUT_BUTTON_DASH) {
controller->movement = LOPLAYER_CONTROLLER_MOVEMENT_DASH_LEFT;
}
} else if (input->buttons & LOCOMMON_INPUT_BUTTON_RIGHT) {
controller->movement = LOPLAYER_CONTROLLER_MOVEMENT_WALK_RIGHT;
if (input->buttons & LOCOMMON_INPUT_BUTTON_DASH) {
controller->movement = LOPLAYER_CONTROLLER_MOVEMENT_DASH_RIGHT;
}
}
if (input->buttons & LOCOMMON_INPUT_BUTTON_ATTACK) {
controller->action = LOPLAYER_CONTROLLER_ACTION_ATTACK;
}
if (input->buttons & LOCOMMON_INPUT_BUTTON_GUARD) {
if (!prev_guarding) controller->action = LOPLAYER_CONTROLLER_ACTION_GUARD;
} else {
if (prev_guarding) controller->action = LOPLAYER_CONTROLLER_ACTION_UNGUARD;
}
if (input->buttons & LOCOMMON_INPUT_BUTTON_DASH && !prev_dash) {
controller->action = LOPLAYER_CONTROLLER_ACTION_DODGE;
}
if (input->buttons & LOCOMMON_INPUT_BUTTON_MENU && !prev_menu) {
controller->action = LOPLAYER_CONTROLLER_ACTION_MENU;
}
controller->prev = *input;
}