struct list *air_functions = NULL;
+struct input_handler *input_handlers[256] = {NULL};
+
void quit()
{
running = false;
air_functions = add_element(air_functions, buf);
}
+void register_input_handler(unsigned char c, struct input_handler handler)
+{
+ if (input_handlers[c])
+ return;
+
+ struct input_handler *buf = malloc(sizeof(struct input_handler));
+ *buf = handler;
+
+ input_handlers[c] = buf;
+}
+
/* Player */
static void player_death(struct entity *self)
/* Input */
-static void handle_input(char c)
+static void handle_input(unsigned char c)
{
- bool dead = player_dead();
-
- switch (c) {
- case 'q':
- quit();
- break;
- case 'w':
- dead || move(&player, 0, -1);
- break;
- case 'a':
- dead || move(&player, -1, 0);
- break;
- case 's':
- dead || move(&player, 0, 1);
- break;
- case 'd':
- dead || move(&player, 1, 0);
- break;
- }
+ struct input_handler *handler = input_handlers[c];
+
+ if (handler && (handler->run_if_dead || ! player_dead()))
+ handler->callback();
}
/* Multithreading */
for (int x = 0; x < MAP_WIDTH; x++)
for (int y = 0; y < MAP_HEIGHT; y++)
map[x][y] = (struct node) {&wall};
+
+ register_input_handler('q', (struct input_handler) {
+ .run_if_dead = true,
+ .callback = &quit,
+ });
}
void game()
void (*callback)(int x, int y);
};
+struct input_handler
+{
+ bool run_if_dead;
+ void (*callback)();
+};
+
extern int score;
extern struct color black;
extern struct list *air_functions;
+extern struct input_handler *input_handlers[256];
+
void quit();
struct color get_color(const char *str);
bool is_outside(int x, int y);
void light_color(struct color *color, double light);
void mix_color(struct color *color, struct color other, double ratio);
void register_air_function(struct generator_function func);
+void register_input_handler(unsigned char c, struct input_handler handler);
struct list *add_element(struct list *list, void *element);
#endif
--- /dev/null
+plugins/movement/movement.so: plugins/movement/movement.c plugins/game/game.h
+ cc -g -shared -fpic -o plugins/movement/movement.so plugins/movement/movement.c
+
+PLUGINS := ${PLUGINS} plugins/movement/movement.so
--- /dev/null
+#include "../game/game.h"
+
+static void move_up()
+{
+ move(&player, 0, -1);
+}
+
+static void move_left()
+{
+ move(&player, -1, 0);
+}
+
+static void move_down()
+{
+ move(&player, 0, 1);
+}
+
+static void move_right()
+{
+ move(&player, 1, 0);
+}
+
+__attribute__((constructor)) static void init()
+{
+ register_input_handler('w', (struct input_handler) {
+ .run_if_dead = false,
+ .callback = &move_up,
+ });
+
+ register_input_handler('a', (struct input_handler) {
+ .run_if_dead = false,
+ .callback = &move_left,
+ });
+
+ register_input_handler('s', (struct input_handler) {
+ .run_if_dead = false,
+ .callback = &move_down,
+ });
+
+ register_input_handler('d', (struct input_handler) {
+ .run_if_dead = false,
+ .callback = &move_right,
+ });
+}