ALMOSTR ALMSO T
eaaer
This commit is contained in:
parent
62b37ed348
commit
82e720015a
|
@ -2,9 +2,6 @@
|
||||||
#include "platform.h"
|
#include "platform.h"
|
||||||
|
|
||||||
|
|
||||||
VectorT FUMOSYS_VEC_T = VECTOR_T(struct FumoHook);
|
|
||||||
|
|
||||||
|
|
||||||
void Panic(char *message)
|
void Panic(char *message)
|
||||||
{
|
{
|
||||||
printf(message);
|
printf(message);
|
||||||
|
@ -28,7 +25,7 @@ bool CreateFumoInstance(struct FumoInstance *instance)
|
||||||
if (!CreateEvent(&instance->on_start))
|
if (!CreateEvent(&instance->on_start))
|
||||||
Panic("Out of memory");
|
Panic("Out of memory");
|
||||||
|
|
||||||
if (!CreateEvent(FUMOSYS_VEC_T, &instance->on_update))
|
if (!CreateEvent(&instance->on_update))
|
||||||
Panic("Out of memory");
|
Panic("Out of memory");
|
||||||
|
|
||||||
instance->time = TimeNow();
|
instance->time = TimeNow();
|
||||||
|
@ -36,28 +33,30 @@ bool CreateFumoInstance(struct FumoInstance *instance)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FumoInstanceRun(struct FumoInstance *instance)
|
bool FumoInstanceRun(struct FumoInstance *inst)
|
||||||
{
|
{
|
||||||
usize buf_n = TerminalMaxOut(&instance->term);
|
EventInvoke(&inst->on_start, inst);
|
||||||
|
|
||||||
|
usize buf_n = TerminalMaxOut(&inst->term);
|
||||||
char *buf = malloc(buf_n);
|
char *buf = malloc(buf_n);
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
if (!InputAquire(&instance->input_hand))
|
if (!InputAquire(&inst->input_hand))
|
||||||
Panic("Aquire failed");
|
Panic("Aquire failed");
|
||||||
|
|
||||||
ControllerPoll(&instance->ctrl, &instance->input_hand.recs);
|
ControllerPoll(&inst->ctrl, &inst->input_hand.recs);
|
||||||
|
|
||||||
if (!InputRelease(&instance->input_hand))
|
if (!InputRelease(&inst->input_hand))
|
||||||
Panic("Release failed");
|
Panic("Release failed");
|
||||||
|
|
||||||
nsec now = TimeNow();
|
nsec now = TimeNow();
|
||||||
instance->frametime = now - instance->time;
|
inst->frametime = now - inst->time;
|
||||||
FumoInvoke(instance, &instance->on_update);
|
EventInvoke(&inst->on_update, inst);
|
||||||
instance->time = now;
|
inst->time = now;
|
||||||
|
|
||||||
TerminalPrint(&instance->term, buf, buf_n);
|
TerminalPrint(&inst->term, buf, buf_n);
|
||||||
puts(buf);
|
puts(buf);
|
||||||
|
|
||||||
_sleep(100);
|
//_sleep(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -24,6 +24,4 @@ void Panic(char *message);
|
||||||
|
|
||||||
bool CreateFumoInstance(struct FumoInstance *game);
|
bool CreateFumoInstance(struct FumoInstance *game);
|
||||||
|
|
||||||
bool FumoInstanceHook(struct Vector *vec, update_func update, void *state);
|
|
||||||
|
|
||||||
bool FumoInstanceRun(struct FumoInstance *game);
|
bool FumoInstanceRun(struct FumoInstance *game);
|
|
@ -22,7 +22,7 @@ void FreeEvent(struct Event *event)
|
||||||
free(event->methods);
|
free(event->methods);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EventRegister(struct Event *event, callback func, void *instance)
|
bool EventAdd(struct Event *event, handler callback, void *instance)
|
||||||
{
|
{
|
||||||
if (event->len == event->capacity) {
|
if (event->len == event->capacity) {
|
||||||
usize new_size = event->capacity * 2 * sizeof(struct Method);
|
usize new_size = event->capacity * 2 * sizeof(struct Method);
|
||||||
|
@ -36,7 +36,7 @@ bool EventRegister(struct Event *event, callback func, void *instance)
|
||||||
}
|
}
|
||||||
|
|
||||||
event->methods[event->len++] = (struct Method) {
|
event->methods[event->len++] = (struct Method) {
|
||||||
.func = func,
|
.callback = callback,
|
||||||
.instance = instance
|
.instance = instance
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,6 +47,6 @@ void EventInvoke(struct Event *event, void *state)
|
||||||
{
|
{
|
||||||
for (usize i = 0; i < event->len; i++) {
|
for (usize i = 0; i < event->len; i++) {
|
||||||
struct Method *method = event->methods + i;
|
struct Method *method = event->methods + i;
|
||||||
method->func(state, method->instance);
|
method->callback(state, method->instance);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,10 +5,10 @@
|
||||||
#include "fumocommon.h"
|
#include "fumocommon.h"
|
||||||
|
|
||||||
|
|
||||||
typedef void (*callback)(void *state, void *instance);
|
typedef void (*handler)(void *state, void *instance);
|
||||||
|
|
||||||
struct Method {
|
struct Method {
|
||||||
callback func;
|
handler callback;
|
||||||
void *instance;
|
void *instance;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -19,8 +19,8 @@ struct Event {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
bool CreateEvent(struct Event *event, void *state);
|
bool CreateEvent(struct Event *event);
|
||||||
|
|
||||||
bool EventRegister(struct Event *event, callback func, void *instance);
|
bool EventAdd(struct Event *event, handler callback, void *instance);
|
||||||
|
|
||||||
void EventInvoke(struct Event *event);
|
void EventInvoke(struct Event *event, void *state);
|
|
@ -1,5 +1,4 @@
|
||||||
#include "ctrl.h"
|
#include "ctrl.h"
|
||||||
|
|
||||||
#include "ringbuffer.h"
|
#include "ringbuffer.h"
|
||||||
|
|
||||||
#define INIT_SIZE 16
|
#define INIT_SIZE 16
|
||||||
|
@ -9,7 +8,7 @@ bool CreateController(struct Controller *ctrl)
|
||||||
{
|
{
|
||||||
struct ctrl_bkt *code_bkts = calloc(INIT_SIZE, sizeof(struct ctrl_bkt));
|
struct ctrl_bkt *code_bkts = calloc(INIT_SIZE, sizeof(struct ctrl_bkt));
|
||||||
struct ctrl_bkt *bind_bkts = calloc(INIT_SIZE, sizeof(struct ctrl_bkt));
|
struct ctrl_bkt *bind_bkts = calloc(INIT_SIZE, sizeof(struct ctrl_bkt));
|
||||||
struct InputAxis *axes = calloc(INIT_SIZE, sizeof(struct InputAxis));
|
struct ControlAxis *axes = calloc(INIT_SIZE, sizeof(struct ControlAxis));
|
||||||
|
|
||||||
if (code_bkts == nullptr or bind_bkts == nullptr or axes == nullptr)
|
if (code_bkts == nullptr or bind_bkts == nullptr or axes == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
@ -43,19 +42,19 @@ void FreeController(struct Controller *ctrl)
|
||||||
free(ctrl->axis_vec.axes);
|
free(ctrl->axis_vec.axes);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ctrl_bkt *get_bkt(struct ctrl_dict *dict, size_t i) {
|
struct ctrl_bkt *get_bkt(struct ctrl_dict *dict, usize i) {
|
||||||
return &dict->bkts[i];
|
return &dict->bkts[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t wrap_index(size_t i, size_t max) {
|
usize wrap_index(usize i, usize max) {
|
||||||
return i % (SIZE_MAX - max + 1);
|
return i % (SIZE_MAX - max + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ctrl_bkt *find_set(struct ctrl_dict *dict, union InputID id)
|
struct ctrl_bkt *find_set(struct ctrl_dict *dict, union InputID id)
|
||||||
{
|
{
|
||||||
size_t i = id.hash % dict->capacity;
|
usize i = id.hash % dict->capacity;
|
||||||
|
|
||||||
size_t last = wrap_index(i - 1, dict->capacity);
|
usize last = wrap_index(i - 1, dict->capacity);
|
||||||
while (i != last) {
|
while (i != last) {
|
||||||
struct ctrl_bkt *bkt = get_bkt(dict, i);
|
struct ctrl_bkt *bkt = get_bkt(dict, i);
|
||||||
|
|
||||||
|
@ -77,9 +76,9 @@ struct ctrl_bkt *find_set(struct ctrl_dict *dict, union InputID id)
|
||||||
|
|
||||||
struct ctrl_bkt *find(struct ctrl_dict *dict, union InputID id)
|
struct ctrl_bkt *find(struct ctrl_dict *dict, union InputID id)
|
||||||
{
|
{
|
||||||
size_t i = id.hash % dict->capacity;
|
usize i = id.hash % dict->capacity;
|
||||||
|
|
||||||
size_t last = wrap_index(i - 1, dict->capacity);
|
usize last = wrap_index(i - 1, dict->capacity);
|
||||||
while (i != last) {
|
while (i != last) {
|
||||||
struct ctrl_bkt *bkt = get_bkt(dict, i);
|
struct ctrl_bkt *bkt = get_bkt(dict, i);
|
||||||
|
|
||||||
|
@ -92,7 +91,7 @@ struct ctrl_bkt *find(struct ctrl_dict *dict, union InputID id)
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct InputAxis *find_axis(struct ctrl_dict *dict, union InputID id)
|
struct ControlAxis *find_axis(struct ctrl_dict *dict, union InputID id)
|
||||||
{
|
{
|
||||||
struct ctrl_bkt *bkt = find(dict, id);
|
struct ctrl_bkt *bkt = find(dict, id);
|
||||||
if (bkt == nullptr)
|
if (bkt == nullptr)
|
||||||
|
@ -105,10 +104,10 @@ union InputID as_id(u16f value, u16f type) {
|
||||||
return (union InputID) { .value = value, .type = type };
|
return (union InputID) { .value = value, .type = type };
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ControllerMap(struct Controller *ctrl, u16f code, u16f bind, u16f type)
|
bool ControllerMap(struct Controller *ctrl, struct ControlMapping *mapping)
|
||||||
{
|
{
|
||||||
struct ctrl_bkt *code_bkt = find_set(&ctrl->codes, as_id(code, type));
|
struct ctrl_bkt *code_bkt = find_set(&ctrl->codes, as_id(mapping->code, mapping->type));
|
||||||
struct ctrl_bkt *bind_bkt = find_set(&ctrl->binds, as_id(bind, type));
|
struct ctrl_bkt *bind_bkt = find_set(&ctrl->binds, as_id(mapping->bind, mapping->type));
|
||||||
|
|
||||||
if (code_bkt->axis == nullptr)
|
if (code_bkt->axis == nullptr)
|
||||||
code_bkt->axis = &ctrl->axis_vec.axes[ctrl->axis_vec.len++];
|
code_bkt->axis = &ctrl->axis_vec.axes[ctrl->axis_vec.len++];
|
||||||
|
@ -116,25 +115,28 @@ bool ControllerMap(struct Controller *ctrl, u16f code, u16f bind, u16f type)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
bind_bkt->axis = code_bkt->axis;
|
bind_bkt->axis = code_bkt->axis;
|
||||||
code_bkt->axis->id.type = type;
|
code_bkt->axis->id.type = mapping->type;
|
||||||
|
|
||||||
|
mapping->axis = code_bkt->axis;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ControllerMapMulti(
|
bool ControllerMapMulti(
|
||||||
struct Controller *ctrl,
|
struct Controller *ctrl,
|
||||||
usize n_maps,
|
usize n,
|
||||||
struct ControlMapping *maps
|
struct ControlMapping *mappings
|
||||||
) {
|
) {
|
||||||
for (usize i = 0; i < n_maps; i++) {
|
for (usize i = 0; i < n; i++) {
|
||||||
struct ControlMapping *map = maps + i;
|
struct ControlMapping *mapping = mappings + i;
|
||||||
if (!ControllerMap(ctrl, map->code, map->bind, map->type))
|
|
||||||
|
if (!ControllerMap(ctrl, mapping))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct InputAxis *ControllerGet(struct Controller *ctrl, u16f code, u16f type)
|
struct ControlAxis *ControllerGet(struct Controller *ctrl, u16f code, u16f type)
|
||||||
{
|
{
|
||||||
struct ctrl_bkt *code_bkt = find(&ctrl->codes, as_id(code, type));
|
struct ctrl_bkt *code_bkt = find(&ctrl->codes, as_id(code, type));
|
||||||
if (code_bkt == nullptr)
|
if (code_bkt == nullptr)
|
||||||
|
@ -143,7 +145,7 @@ struct InputAxis *ControllerGet(struct Controller *ctrl, u16f code, u16f type)
|
||||||
return code_bkt->axis;
|
return code_bkt->axis;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dispatch_update(struct InputAxis *axis, struct InputRecord *rec)
|
void dispatch_update(struct ControlAxis *axis, struct InputRecord *rec)
|
||||||
{
|
{
|
||||||
if (rec->is_down and !axis->is_held) {
|
if (rec->is_down and !axis->is_held) {
|
||||||
axis->is_down = true;
|
axis->is_down = true;
|
||||||
|
@ -160,8 +162,8 @@ void dispatch_update(struct InputAxis *axis, struct InputRecord *rec)
|
||||||
|
|
||||||
void ControllerPoll(struct Controller *ctrl, struct RecordBuffer *recs)
|
void ControllerPoll(struct Controller *ctrl, struct RecordBuffer *recs)
|
||||||
{
|
{
|
||||||
for (size_t i = 0; i < ctrl->pending_buf.len; i++) {
|
for (usize i = 0; i < ctrl->pending_buf.len; i++) {
|
||||||
struct InputAxis *axis = ctrl->pending_buf.axes[i];
|
struct ControlAxis *axis = ctrl->pending_buf.axes[i];
|
||||||
|
|
||||||
axis->is_up = false;
|
axis->is_up = false;
|
||||||
axis->is_down = false;
|
axis->is_down = false;
|
||||||
|
@ -169,10 +171,10 @@ void ControllerPoll(struct Controller *ctrl, struct RecordBuffer *recs)
|
||||||
|
|
||||||
ctrl->pending_buf.len = 0;
|
ctrl->pending_buf.len = 0;
|
||||||
|
|
||||||
for (size_t i = 0; i < recs->head.len; i++) {
|
for (usize i = 0; i < recs->head.len; i++) {
|
||||||
struct InputRecord *rec = &recs->buf[i];
|
struct InputRecord *rec = &recs->buf[i];
|
||||||
|
|
||||||
struct InputAxis *axis = find_axis(&ctrl->binds, rec->id);
|
struct ControlAxis *axis = find_axis(&ctrl->binds, rec->id);
|
||||||
if (axis == nullptr)
|
if (axis == nullptr)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
|
||||||
|
|
||||||
struct InputAxis {
|
struct ControlAxis {
|
||||||
nsec last_pressed;
|
nsec last_pressed;
|
||||||
nsec last_released;
|
nsec last_released;
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ struct InputAxis {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ctrl_bkt {
|
struct ctrl_bkt {
|
||||||
struct InputAxis *axis;
|
struct ControlAxis *axis;
|
||||||
union InputID id;
|
union InputID id;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -41,14 +41,14 @@ struct ctrl_dict {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ctrl_axis_vec {
|
struct ctrl_axis_vec {
|
||||||
struct InputAxis *axes;
|
struct ControlAxis *axes;
|
||||||
u16f size;
|
u16f size;
|
||||||
u16f len;
|
u16f len;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Controller {
|
struct Controller {
|
||||||
struct {
|
struct {
|
||||||
struct InputAxis *axes[IO_BUF_SIZE];
|
struct ControlAxis *axes[IO_BUF_SIZE];
|
||||||
u8f len;
|
u8f len;
|
||||||
} pending_buf;
|
} pending_buf;
|
||||||
|
|
||||||
|
@ -61,21 +61,23 @@ struct ControlMapping {
|
||||||
u16 code;
|
u16 code;
|
||||||
u16 bind;
|
u16 bind;
|
||||||
u16 type;
|
u16 type;
|
||||||
|
struct ControlAxis *axis;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
bool CreateController(struct Controller *ctrl);
|
bool CreateController(struct Controller *ctrl);
|
||||||
|
|
||||||
void FreeController(struct Controller *ctrl);
|
void FreeController(struct Controller *ctrl);
|
||||||
|
|
||||||
bool ControllerMap(struct Controller *ctrl, u16f code, u16f bind, u16f type);
|
bool ControllerMap(struct Controller *ctrl, struct ControlMapping *mapping);
|
||||||
|
|
||||||
bool ControllerMapMulti(
|
bool ControllerMapMulti(
|
||||||
struct Controller *ctrl,
|
struct Controller *ctrl,
|
||||||
usize n_maps,
|
usize n,
|
||||||
struct ControlMapping *maps
|
struct ControlMapping *mappings
|
||||||
);
|
);
|
||||||
|
|
||||||
struct InputAxis *ControllerGet(struct Controller *ctrl, u16f code, u16f type);
|
struct ControlAxis *ControllerGet(struct Controller *ctrl, u16f code, u16f type);
|
||||||
|
|
||||||
void ControllerPoll(struct Controller *ctrl, struct RecordBuffer *recs);
|
void ControllerPoll(struct Controller *ctrl, struct RecordBuffer *recs);
|
||||||
|
|
||||||
|
|
|
@ -1,35 +1,48 @@
|
||||||
#include "fumotris.h"
|
#include "fumotris.h"
|
||||||
|
|
||||||
|
|
||||||
void Update(struct FumoInstance *instance, void *args)
|
struct Fumotris {
|
||||||
{
|
struct TetrMap board;
|
||||||
struct Fumotris *game = args;
|
struct TetrMap piece;
|
||||||
|
};
|
||||||
|
|
||||||
TetrMapDraw(&game->board, &instance->term);
|
|
||||||
|
void FumotrisStart(void *engine, void *app)
|
||||||
|
{
|
||||||
|
struct FumoInstance *inst = engine;
|
||||||
|
struct Fumotris *game = app;
|
||||||
|
|
||||||
|
ControllerMapMulti(&inst->ctrl, CODE_COUNT, mappings_global);
|
||||||
|
|
||||||
|
CreateTetrMap(&game->board, 10, 10);
|
||||||
|
CreateTetrMap(&game->piece, 3, 3);
|
||||||
|
game->piece.blks = T;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CreateFumotris(struct Fumotris *game)
|
void FumotrisUpdate(void *engine, void *app)
|
||||||
{
|
{
|
||||||
if (!CreateTetrMap(&game->board, 10, 10))
|
struct FumoInstance *inst = engine;
|
||||||
return false;
|
struct Fumotris *game = app;
|
||||||
|
|
||||||
return true;
|
if (mappings_global[LEFT].axis->is_down)
|
||||||
|
game->piece.x -= 1;
|
||||||
|
if (mappings_global[RIGHT].axis->is_down)
|
||||||
|
game->piece.x += 1;
|
||||||
|
|
||||||
|
TetrMapDraw(&game->board, &inst->term);
|
||||||
|
TetrMapDraw(&game->piece, &inst->term);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
struct FumoInstance instance;
|
struct FumoInstance inst;
|
||||||
CreateFumoInstance(&instance);
|
CreateFumoInstance(&inst);
|
||||||
|
|
||||||
struct Fumotris game;
|
struct Fumotris game;
|
||||||
CreateFumotris(&game);
|
EventAdd(&inst.on_start, FumotrisStart, &game);
|
||||||
|
EventAdd(&inst.on_update, FumotrisUpdate, &game);
|
||||||
|
|
||||||
ControllerMapMulti(&instance.ctrl, CODE_COUNT, MAPPINGS);
|
FumoInstanceRun(&inst);
|
||||||
|
|
||||||
FumoInstanceHook(&instance.on_update, Update, &game);
|
|
||||||
|
|
||||||
|
|
||||||
FumoInstanceRun(&instance);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -20,7 +20,7 @@ enum ControlCode {
|
||||||
MOUSE
|
MOUSE
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ControlMapping MAPPINGS[12] = {
|
struct ControlMapping mappings_global[12] = {
|
||||||
{ LEFT, 0x25, BUTTON },
|
{ LEFT, 0x25, BUTTON },
|
||||||
{ RIGHT, 0x27, BUTTON },
|
{ RIGHT, 0x27, BUTTON },
|
||||||
{ SOFT_DROP, 0x28, BUTTON },
|
{ SOFT_DROP, 0x28, BUTTON },
|
||||||
|
@ -36,10 +36,6 @@ struct ControlMapping MAPPINGS[12] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
struct Fumotris {
|
|
||||||
struct TetrMap board;
|
|
||||||
struct TetrMap piece;
|
|
||||||
};
|
|
||||||
|
|
||||||
const u8 I[16] = {
|
const u8 I[16] = {
|
||||||
0, 0, 0, 0,
|
0, 0, 0, 0,
|
||||||
|
|
Loading…
Reference in a new issue