/* SPDX-License-Identifier: MIT * Copyright (c) 2021 KikooDX * This file is part of * [Painfull Success CG](https://git.sr.ht/~kikoodx/painfull-success-cg), * which is MIT licensed. The MIT license requires this copyright notice to be * included in all copies and substantial portions of the software. */ #include "input.h" #include "lazyint.h" #include void input_update(Input *input) { /* Read full input stream. */ clearevents(); /* For each key, update state. */ for (u8 i = 0; i < KEYS_COUNT; ++i) { u8 *state = &input->states[i]; const u8 key = input->keys[i]; /* See if the key is pressed. */ const bool pressed = keydown(key); /* Update input status. */ if (pressed) { if (*state == S_RELEASED || *state == S_UP) *state = S_PRESSED; else *state = S_DOWN; } else { if (*state == S_PRESSED || *state == S_DOWN) *state = S_RELEASED; else *state = S_UP; } } } void input_init(Input *input) { /* initialize all values to S_UP, avoid random bugs */ input->keys[K_LEFT] = KEY_LEFT; input->keys[K_RIGHT] = KEY_RIGHT; input->keys[K_DOWN] = KEY_DOWN; input->keys[K_JUMP] = KEY_SHIFT; input->keys[K_RESTART] = KEY_6; input->keys[K_CAM_UP] = KEY_TAN; input->keys[K_CAM_DOWN] = KEY_ARROW; input->keys[K_EXIT] = KEY_EXIT; for (u8 i = 0; i < KEYS_COUNT; ++i) input->states[i] = S_UP; } bool input_is_pressed(Input input, u8 key) { return input.states[key] == S_PRESSED; } bool input_is_down(Input input, u8 key) { return ((input.states[key] == S_DOWN) || (input.states[key] == S_PRESSED)); } bool input_is_released(Input input, u8 key) { return input.states[key] == S_RELEASED; } bool input_is_up(Input input, u8 key) { return ((input.states[key] == S_UP) || (input.states[key] == S_RELEASED)); }