2021-12-15 23:55:44 +01:00
|
|
|
#include "input.h"
|
2021-12-23 11:52:37 +01:00
|
|
|
#include <fcntl.h>
|
2021-12-15 23:55:44 +01:00
|
|
|
#include <gint/keyboard.h>
|
2021-12-23 11:52:37 +01:00
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <unistd.h>
|
2021-12-15 23:55:44 +01:00
|
|
|
|
|
|
|
static struct Input input;
|
2021-12-18 11:02:33 +01:00
|
|
|
static const int default_map[K_COUNT] = {
|
2021-12-23 15:54:44 +01:00
|
|
|
KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN, KEY_SHIFT, KEY_ALPHA, KEY_EXIT,
|
|
|
|
KEY_TAN, KEY_F3, KEY_F2, KEY_F1, KEY_F4, KEY_F5, KEY_F6};
|
|
|
|
static const char *replay_path = "jtmm2.fls";
|
2021-12-15 23:55:44 +01:00
|
|
|
|
2021-12-23 15:54:44 +01:00
|
|
|
static void next_state(int i, int kdown);
|
2021-12-23 11:52:37 +01:00
|
|
|
static PackedFrame pack_frame(void);
|
2021-12-23 15:54:44 +01:00
|
|
|
static void unpack_frame(PackedFrame);
|
2021-12-23 11:52:37 +01:00
|
|
|
|
2021-12-15 23:55:44 +01:00
|
|
|
void
|
|
|
|
input_init(void)
|
|
|
|
{
|
|
|
|
|
|
|
|
int i = K_COUNT;
|
|
|
|
while (i-- > 0) {
|
|
|
|
input.keys[i] = default_map[i];
|
|
|
|
input.states[i] = KS_UP;
|
|
|
|
}
|
2021-12-23 11:52:37 +01:00
|
|
|
i = REPLAY_SIZE;
|
|
|
|
input.replay_cursor = 0;
|
2021-12-23 15:54:44 +01:00
|
|
|
input.playback = 0;
|
2021-12-15 23:55:44 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
input_update(void)
|
|
|
|
{
|
|
|
|
int i = K_COUNT;
|
|
|
|
clearevents();
|
2021-12-23 15:54:44 +01:00
|
|
|
while (i-- > K_EXIT) {
|
2021-12-15 23:55:44 +01:00
|
|
|
const int kdown = keydown(input.keys[i]);
|
2021-12-23 15:54:44 +01:00
|
|
|
next_state(i, kdown);
|
|
|
|
}
|
|
|
|
if (input.playback) {
|
|
|
|
unpack_frame(input.replay[input.replay_cursor++]);
|
|
|
|
if (input.replay_cursor >= input.replay_end ||
|
|
|
|
input.replay_cursor >= REPLAY_SIZE) {
|
|
|
|
input.replay_cursor--;
|
|
|
|
input.playback = 0;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
i++;
|
|
|
|
while (i-- > 0) {
|
|
|
|
const int kdown = keydown(input.keys[i]);
|
|
|
|
next_state(i, kdown);
|
|
|
|
}
|
|
|
|
input.replay[input.replay_cursor++] = pack_frame();
|
|
|
|
if (input.replay_cursor >= REPLAY_SIZE) input.replay_cursor--;
|
2021-12-15 23:55:44 +01:00
|
|
|
}
|
2021-12-23 11:52:37 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2021-12-23 15:54:44 +01:00
|
|
|
input_dump_replay(void)
|
2021-12-23 11:52:37 +01:00
|
|
|
{
|
2022-01-12 23:10:31 +01:00
|
|
|
const int fd = open(replay_path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
|
2021-12-23 11:52:37 +01:00
|
|
|
if (fd != -1) {
|
|
|
|
write(fd, input.replay,
|
|
|
|
input.replay_cursor * sizeof(PackedFrame));
|
|
|
|
close(fd);
|
|
|
|
}
|
2021-12-15 23:55:44 +01:00
|
|
|
}
|
|
|
|
|
2021-12-23 15:54:44 +01:00
|
|
|
void
|
|
|
|
input_load_replay(void)
|
|
|
|
{
|
|
|
|
const int fd = open(replay_path, O_RDONLY);
|
|
|
|
if (fd != -1) {
|
|
|
|
input.playback = 1;
|
|
|
|
input.replay_cursor = 0;
|
|
|
|
input.replay_end =
|
|
|
|
read(fd, input.replay, REPLAY_SIZE) / sizeof(PackedFrame);
|
|
|
|
if (!input.replay_end) input.replay_cursor = REPLAY_SIZE;
|
|
|
|
close(fd);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-12 22:36:10 +01:00
|
|
|
void
|
|
|
|
input_set_down(enum Key k)
|
|
|
|
{
|
|
|
|
input.states[k] = KS_DOWN;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
input_set_pressed(enum Key k)
|
|
|
|
{
|
|
|
|
input.states[k] = KS_PRESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
input_set_up(enum Key k)
|
|
|
|
{
|
|
|
|
input.states[k] = KS_UP;
|
|
|
|
}
|
|
|
|
|
2021-12-15 23:55:44 +01:00
|
|
|
int
|
|
|
|
input_down(enum Key k)
|
|
|
|
{
|
|
|
|
return input.states[k] != KS_UP;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
input_pressed(enum Key k)
|
|
|
|
{
|
|
|
|
return input.states[k] == KS_PRESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
int
|
|
|
|
input_up(enum Key k)
|
|
|
|
{
|
|
|
|
return input.states[k] == KS_UP;
|
|
|
|
}
|
2021-12-23 11:52:37 +01:00
|
|
|
|
2021-12-23 15:54:44 +01:00
|
|
|
static void
|
|
|
|
next_state(int i, int kdown)
|
|
|
|
{
|
|
|
|
input.states[i] = (input.states[i] == KS_UP)
|
|
|
|
? (kdown ? KS_PRESS : KS_UP)
|
|
|
|
: (kdown ? KS_DOWN : KS_UP);
|
|
|
|
}
|
|
|
|
|
2021-12-23 11:52:37 +01:00
|
|
|
static PackedFrame
|
|
|
|
pack_frame(void)
|
|
|
|
{
|
|
|
|
PackedFrame r = 0;
|
|
|
|
int i = K_EXIT;
|
|
|
|
while (i-- > 0)
|
|
|
|
r |= input_down(i) << i;
|
|
|
|
return r;
|
|
|
|
}
|
2021-12-23 15:54:44 +01:00
|
|
|
|
|
|
|
static void
|
|
|
|
unpack_frame(PackedFrame f)
|
|
|
|
{
|
|
|
|
int i = K_EXIT;
|
|
|
|
while (i-- > 0)
|
|
|
|
next_state(i, (f & (1 << i)) != 0);
|
|
|
|
}
|