131 lines
3.5 KiB
C
131 lines
3.5 KiB
C
/*
|
|
* Copyright Luka Jankovic 2025
|
|
*
|
|
* This file is part of Kubo.
|
|
*
|
|
* Kubo is free software: you can redistribute it and/or modify it under the
|
|
* terms of the GNU General Public License as published by the Free Software
|
|
* Foundation, either version 3 of the License, or (at your option) any later
|
|
* version.
|
|
*
|
|
* Kubo is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
|
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with
|
|
* Kubo. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include "kubo_input.h"
|
|
#include "states/kubo_states.h"
|
|
|
|
extern bool kubo_mouse_snap;
|
|
|
|
static void key_input(struct kubo_context *context, Camera2D *camera);
|
|
static void char_input(struct kubo_context *context);
|
|
|
|
static void handle_cmd_input(struct kubo_context *context);
|
|
static void handle_camera_input(int key_code, Camera2D *camera);
|
|
|
|
void kubo_input_handle(struct kubo_context *context, Camera2D *camera) {
|
|
char_input(context);
|
|
|
|
if (context->state.id == KUBO_CONTEXT_COMMAND) {
|
|
handle_cmd_input(context);
|
|
}
|
|
|
|
key_input(context, camera);
|
|
}
|
|
|
|
static void key_input(struct kubo_context *context, Camera2D *camera) {
|
|
int key_code = GetKeyPressed();
|
|
|
|
if (context->state.id == KUBO_CONTEXT_NORMAL) {
|
|
handle_camera_input(key_code, camera);
|
|
}
|
|
|
|
switch (key_code) {
|
|
case KEY_Q:
|
|
case KEY_ESCAPE:
|
|
kubo_context_set_state(context, KUBO_CONTEXT_NORMAL);
|
|
break;
|
|
|
|
// case KEY_T:
|
|
// kubo_mouse_snap = !kubo_mouse_snap;
|
|
// break;
|
|
|
|
case KEY_SPACE:
|
|
kubo_camera_reset(camera);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
kubo_context_key(context, key_code);
|
|
}
|
|
|
|
static void char_input(struct kubo_context *context) {
|
|
int char_code;
|
|
do {
|
|
char_code = GetCharPressed();
|
|
if (char_code && context->state.id == KUBO_CONTEXT_COMMAND) {
|
|
kubo_command_append_char(char_code);
|
|
} else if (char_code == ':') {
|
|
kubo_command_clear();
|
|
kubo_command_append_char(':');
|
|
kubo_context_set_state(context, KUBO_CONTEXT_COMMAND);
|
|
}
|
|
} while (char_code > 0);
|
|
}
|
|
|
|
static void handle_cmd_input(struct kubo_context *context) {
|
|
int key_code = GetKeyPressed();
|
|
switch (key_code) {
|
|
case KEY_ESCAPE:
|
|
kubo_context_set_state(context, KUBO_CONTEXT_NORMAL);
|
|
break;
|
|
case KEY_ENTER:
|
|
kubo_command_accept_cmd(context);
|
|
kubo_context_set_state(context, KUBO_CONTEXT_NORMAL);
|
|
break;
|
|
case KEY_DELETE:
|
|
case KEY_BACKSPACE:
|
|
kubo_command_pop();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
static void handle_camera_input(int key_code, Camera2D *camera) {
|
|
switch (key_code) {
|
|
case KEY_RIGHT:
|
|
case KEY_L:
|
|
kubo_camera_shift(camera,
|
|
(Vector2){ .x = -KUBO_INPUT_CAMERA_SHIFT, .y = 0 });
|
|
break;
|
|
|
|
case KEY_UP:
|
|
case KEY_K:
|
|
kubo_camera_shift(camera,
|
|
(Vector2){ .x = 0, .y = KUBO_INPUT_CAMERA_SHIFT });
|
|
break;
|
|
|
|
case KEY_LEFT:
|
|
case KEY_H:
|
|
kubo_camera_shift(camera,
|
|
(Vector2){ .x = KUBO_INPUT_CAMERA_SHIFT, .y = 0 });
|
|
break;
|
|
|
|
case KEY_DOWN:
|
|
case KEY_J:
|
|
kubo_camera_shift(camera,
|
|
(Vector2){ .x = 0, .y = -KUBO_INPUT_CAMERA_SHIFT });
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|