From e07f072de45d23ab17661e3ea6bd3c707f04aa35 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 24 May 2021 09:31:32 +0200 Subject: Enable setting macros to control available ctrl devices --- src/main.c | 30 +++++++++++++++++++----------- src/uxn/devices/ppu.c | 4 ++-- 2 files changed, 21 insertions(+), 13 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index b075f4a..e30035a 100644 --- a/src/main.c +++ b/src/main.c @@ -30,8 +30,8 @@ WITH REGARD TO THIS SOFTWARE. #define TEXT_LAYER ppu.fg #endif -#ifndef DEFAULT_CONTROL -#define DEFAULT_CONTROL CONTROL_CONTROLLER +#ifndef CONTROL_METHODS +#define CONTROL_METHODS CONTROL_CONTROLLER,CONTROL_MOUSE,CONTROL_KEYBOARD #endif typedef enum { @@ -40,7 +40,10 @@ typedef enum { CONTROL_KEYBOARD, } ControlMethod; -static ControlMethod control_method = CONTROL_KEYBOARD; +const ControlMethod ctrl_methods[] = { + CONTROL_METHODS +}; +static ControlMethod ctrl_idx = 0; #define MOUSE_DELTA 1 typedef struct Mouse { @@ -167,12 +170,12 @@ void handle_input(Uxn *u) { poll_keys(); if (key_tap(KEY_SELECT)) { - switch (control_method) { + // Reset control variables on method switch. + switch (ctrl_methods[ctrl_idx]) { case CONTROL_CONTROLLER: { devctrl->dat[2] = 0; evaluxn(u, mempeek16(devctrl->dat, 0)); devctrl->dat[3] = 0; - control_method = CONTROL_MOUSE; } break; case CONTROL_MOUSE: { devmouse->dat[6] = 0; @@ -180,17 +183,22 @@ handle_input(Uxn *u) { mempoke16(devmouse->dat, 0x2, -10); mempoke16(devmouse->dat, 0x4, -10); evaluxn(u, mempeek16(devmouse->dat, 0)); - toggle_keyboard(); - control_method = CONTROL_KEYBOARD; } break; case CONTROL_KEYBOARD: { toggle_keyboard(); - control_method = CONTROL_CONTROLLER; } break; } + + // Update ctrl_idx. + ctrl_idx = ctrl_idx + 1 > LEN(ctrl_methods) - 1 ? 0 : ctrl_idx + 1; + + // Initialize controller variables here. + if (ctrl_methods[ctrl_idx] == CONTROL_KEYBOARD) { + toggle_keyboard(); + } } - if (control_method == CONTROL_CONTROLLER) { + if (ctrl_methods[ctrl_idx] == CONTROL_CONTROLLER) { // TODO: We don't need ifs if we use KEY_INPUTS directly and mayvbe just // swap some things if needed. u8 *flag = &devctrl->dat[2]; @@ -237,7 +245,7 @@ handle_input(Uxn *u) { evaluxn(u, mempeek16(devctrl->dat, 0)); devctrl->dat[3] = 0; - } else if (control_method == CONTROL_MOUSE) { + } else if (ctrl_methods[ctrl_idx] == CONTROL_MOUSE) { // Detect "mouse key press". u8 flag = devmouse->dat[6]; if (key_tap(KEY_B)) { @@ -276,7 +284,7 @@ handle_input(Uxn *u) { mempoke16(devmouse->dat, 0x2, mouse.x); mempoke16(devmouse->dat, 0x4, mouse.y); evaluxn(u, mempeek16(devmouse->dat, 0)); - } else if (control_method == CONTROL_KEYBOARD) { + } else if (ctrl_methods[ctrl_idx] == CONTROL_KEYBOARD) { if (key_tap(KEY_LEFT)) { update_cursor(cursor_position - 1); } else if (key_tap(KEY_RIGHT)) { diff --git a/src/uxn/devices/ppu.c b/src/uxn/devices/ppu.c index 7a4429c..f626604 100644 --- a/src/uxn/devices/ppu.c +++ b/src/uxn/devices/ppu.c @@ -401,7 +401,7 @@ initppu(Ppu *p, u8 hor, u8 ver, u8 pad) { for (size_t i = 0; i < sizeof(keyboard) / sizeof(keyboard[0]); ++i) { keyboard[i].x = tile_x * 8; keyboard[i].y = tile_y * 8; - OBJ_ATTR_0(i) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[i].y); + OBJ_ATTR_0(i) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[i].y) | OBJ_HIDDEN; OBJ_ATTR_1(i) = OBJ_SIZE_SMALL | OBJ_X_COORD(keyboard[i].x); OBJ_ATTR_2(i) = (SPRITE_START_IDX + keyboard[i].symbol) | OBJ_PAL_BANK(0); tile_x++; @@ -410,7 +410,7 @@ initppu(Ppu *p, u8 hor, u8 ver, u8 pad) { tile_y++; } } - OBJ_ATTR_0(127) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[cursor_position].y); + OBJ_ATTR_0(127) = OBJ_SHAPE_SQUARE | OBJ_Y_COORD(keyboard[cursor_position].y) | OBJ_HIDDEN; OBJ_ATTR_1(127) = OBJ_SIZE_SMALL | OBJ_X_COORD(keyboard[cursor_position].x); OBJ_ATTR_2(127) = (SPRITE_START_IDX + 0xdb) | OBJ_PAL_BANK(3); -- cgit v1.2.1